Доктрина 2 Что такое рекомендуемый способ доступа к свойствам? - PullRequest
16 голосов
/ 16 декабря 2010

Я помню, что читал, что в моделях Doctrine 2 я не должен устанавливать свойства / поля public Как тогда вы выставите эти поля? В песочнице использовались get*() & set*() методы. Это лучшая идея? Это очень громоздко. Использование магических методов __get() __set() сделает общедоступными настройки полей?

Какая ваша рекомендация?

Ответы [ 6 ]

12 голосов
/ 16 декабря 2010

Вот почему вы не можете использовать публичные свойства: Как публичные поля могут «прервать ленивую загрузку» в Doctrine 2?

Вы правы, что __get() и __set() могут упростить доступ к полям protected / private.

Вот простой пример:

public function __get($name)
{
  if(property_exists($this, $name)){
    return $this->$name;
  }
}

Конечно, это дает доступ ко всем свойствам. Вы можете поместить это в класс, который расширили все ваши сущности, а затем определить поля, не подлежащие оценке, как private. Или вы можете использовать массив, чтобы определить, какие свойства должны быть доступны: $this->accessable = array('name', 'age')

Существует множество способов сохранить все свойства защищенными, и при этом есть достаточно простой способ их получить / установить.

8 голосов
/ 07 июня 2012

Лично мне не нравится шаблонный код с тривиальной целью - он делает код уродливым и утомительным для чтения. Поэтому я настоятельно предпочитаю __get / __set. Тем не менее, у них есть несколько недостатков:

  • они значительно медленнее , чем обычные вызовы функций, хотя и не настолько, чтобы на практике это имело значение, поскольку доступ к базе данных на несколько порядков медленнее
  • __get / __set вызывается только тогда, когда поле не видно; если вы обращаетесь к свойствам в коде класса сущностей, они не вызываются, и прокси не имеет возможности загрузить себя. (Doctrine пытается избежать этого, мгновенно загружая прокси, как только один из его открытых методов вызывается, но есть некоторые исключения, такие как __construct или __wake, где это не имеет смысла, поэтому вы можете попасть в неприятности например, чтение поля в конструкторе.)
  • PHP имеет некоторые запутанные поведения, связанные с магическими методами - e. г. empty($entity->field) не будет вызывать __get (и, следовательно, будет нарушать поведение прокси-сервера, если используется)
6 голосов
/ 27 декабря 2010

Если некоторая информация должна быть обнародована, определите для нее метод получения.Если это модифицируемо, добавьте установщик (еще лучше, добавьте беглый установщик!).

API более чистые, без магии.Я не люблю магию в своем коде.

Только мои два цента:)


Под "плавным установщиком" я подразумевал один, реализующий плавный шаблон интерфейса .

2 голосов
/ 14 января 2012

Вместо того, чтобы иметь отдельные методы получения и установки или даже использовать магические функции. Есть ли проблема с наличием чего-то подобного в классе

public function Set($attrib, $value)
{
    $this->$attrib = $value;    
}

public function Get($attrib)
{
    return $this->$attrib;
}   

Это облегчает доступ к атрибутам и средствамони будут динамически установлены из массивов пар ключей ... какие-либо комментарии?или альтернативные предложения?

2 голосов
/ 16 декабря 2010

Да, методы получения и установки являются способом доступа к вашим данным.Они немного громоздки, поэтому некоторым людям не нравится учение или спящий режим.Но вам нужно сделать это только один раз для каждой сущности, и тогда они будут очень гибкими для получения выходного форматирования, на которое вы надеетесь.Вы можете использовать Cli, чтобы сделать это для вас.Но когда вы заставляете их катиться, я не вижу в этом ничего особенного.Тем более, что вы делаете это только с нужными вам свойствами.

Cheers

1 голос
/ 15 декабря 2011

Doctine 2 предоставляет [инструмент командной строки] [1] для генерации базовых классов сущностей

используйте следующее, чтобы получить базовое определение класса Entity из вашего отображения, дополненное функциями получения / установки для каждого свойства:

path/to/doctrine_cli orm:generate-entities --generate-methods=true path/to/entities/

Вы по-прежнему несете ответственность за изменение каждого метода получения / установки, чтобы убедиться, что они имеют правильный тип данных, так как методы получения / установки, созданные для сущности, не выполняют приведение / преобразование типов.

...