Почему запрос свойств / query /attributes /… являются общедоступными в Symfony2?

#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 со своей инкапсуляцией.