Где хранить переменную Doctrine, созданную в компоненте, чтобы она была доступна где угодно? - PullRequest
0 голосов
/ 29 мая 2011

Примечание. Я имею в виду один запрос, а не несколько запросов и сеансов.

У меня есть несколько компонентов, для которых требуется пользовательский объект Doctrine, некоторые расположены в макете, другие - в шаблонах. Иногда мне нужен этот объект пользователя Doctrine в действии. В настоящее время я добавил функцию в класс sfUser, которая загружает этот объект из базы данных, что означает, что каждый раз, когда я вызываю эту функцию, я вызываю db. Я хотел бы знать, где хранить этот объект, чтобы я мог получить к нему доступ, не запрашивая БД каждый раз, когда мне это нужно. Опять же, мы говорим об одном запросе, а не о нескольких запросах или о чем-то, что потребовало бы сессии.

Можно ли как-нибудь сохранить его в sfContext? Какие-нибудь другие места, чтобы он был доступен везде?

Ответы [ 2 ]

1 голос
/ 29 мая 2011

Вы можете сохранить его в классе Table вашей модели, потому что таблицы всегда доступны как одиночные тоны.

class sfGuardUserTable extends PluginsfGuardUserTable
{
  protected $specialUser = null;

  public function getSpecialUser()
  {
    if (null === $this->specialUser)
    {
      $this->specialUser = $this->findOneById(1);
    }
    return $this->specialUser;
  }
}

Теперь вы можете использовать это в таких действиях и компонентах, как:

$u = sfGuardUserTable::getInstance()->getSpecialUser();

И у вас всегда будет один запрос.

0 голосов
/ 29 мая 2011

вы можете настроить Кэш доктрины , чтобы результат этого конкретного запроса всегда кэшировался.Что хорошего в том, что если вы используете, скажем, серверную часть APC, она будет кэшироваться между запросами .Вы также получаете запрос кэширование в качестве бонуса (это не результат кэширование, прочитайте ссылку, которую я предоставил внимательно)!

...