#symfony
#symfony
Вопрос:
Почему не геттеры? И как это сочетается с принципом инкапсуляции? Безопасно ли это?
Upd: Да, я о Request
. Безопасность: я имею в виду, что любой пользователь в коде (используя listener) может сделать $request->attributes = null;
Ответ №1:
Если вы говорите об объектах Request и Response, то несколько дней назад в списке рассылки разработчиков Symfony была дискуссия по этому поводу. Я приглашаю вас взглянуть на это здесь.
Почему не геттеры? Не уверен, есть ли на это окончательный ответ, но я думаю, что это решение, основанное в основном на личных вкусах.
Нарушает ли это инкапсуляцию? На мой взгляд, не совсем для этого конкретного случая. Я рассуждаю так, что на данный момент никакая специальная логика не выполняется для различных объектов, которые являются общедоступными прямо сейчас. Таким образом, в конечном итоге вы бы извлекли объект через средство получения и прочитали или изменили его напрямую. Нет большой разницы в получении объекта с использованием общедоступного свойства.
// With Getters
$parameterBag = $request->getQuery();
$parameterBag->get('key');
// With Public Properties
$parameterBag = $request->query;
$parameterBag->get('key');
Инкапсуляцию следует применять, когда вам нужно быть уверенным, что свойство имеет определенное значение или формат. Допустим, у вас есть класс со свойством cost, и это свойство никогда не должно быть отрицательным. Итак, если свойство cost было общедоступным, можно было бы присвоить ему отрицательное значение, выполнив что-то вроде $receipt->cost = -1;
. Однако, если вы сделаете его закрытым и пользователь класса сможет установить его только через установщик, тогда вы могли бы гарантировать, что стоимость никогда не будет ниже 0, выполнив некоторую специальную проверку в коде установщика.
В нашем случае речь идет об объекте коллекции, точнее, объекте ParameterBag. Я не думаю, что к этому объекту предъявляются особые требования, но я могу ошибаться. Поэтому для меня правильно иметь доступ к этим свойствам через общедоступные свойства.
Главный аргумент, который я смог увидеть в пользу геттеров, заключается в том, что это было бы более совместимо с другими частями фреймворка, где используются геттеры. Однако средства получения могут сосуществовать с общедоступными свойствами.
В заключение, я думаю, что это безопасно для данного конкретного случая. Общедоступные свойства следует использовать только в особых случаях, когда это кажется полезным и где это правильно делать.
Комментарии:
1. Спасибо за ссылку на тему в symfony-devs. Я обычно читаю эту группу, но не заметил эту тему.
2. Да, я заметил, что вы были активны на этом форуме symfony-devs, поэтому я предложил вам эту ссылку 🙂 Вы правы в том, что я мог бы присвоить свойству значение null, поэтому, возможно, было бы хорошей идеей обеспечить инкапсуляцию, предоставляя только установщики и геттеры для свойств.
Ответ №2:
Вы имеете в виду объект запроса? Или о каких свойствах вы думаете?
Если вы беспокоитесь о безопасности, тогда взгляните на компонент Security, используйте Test-Driven-Development, используйте проверенные библиотеки (не изобретайте собственную аутентификацию, криптографию и связанные с ними решения) и делайте обзоры кода.
Ответ №3:
Какой смысл инкапсулировать то, что уже было инкапсулировано? Я имею в виду — каждое из этих свойств является экземпляром ParameterBag со своей инкапсуляцией.