Перед Доктрины 2.4 путь по умолчанию, чтобы поймать события жизненного цикла (например, prePersist
) является глобальной event listener, что уволит всех подразделений. Запуск такого слушателя, как сервис Symfony, облегчил внедрение других сервисов (например, объектов request
или request_stack
).Как создать объект прослушивателя лениво и ввести в него зависимостей
Теперь лучшим решением является так как это происходит с гораздо меньшими накладными расходами!
Итак, давайте начнем эту вещь в заголовок наши лица ...:
* @ORM\EntityListeners({ "AppBundle\Entity\Listener\LanguageListener" })
А вот класс:
namespace AppBundle\Entity\Listener;
use Doctrine\ORM\Event\LifecycleEventArgs;
class LanguageListener
{
public function prePersist($obj_entity, LifecycleEventArgs $obj_eventArgs)
{
$request = ???;
// set entity to users preferred language (for example 'de')
$obj_entity->setLanguage($request->getLocale());
}
}
Как вы можете видеть, я не имею ни малейшего понятия, как доступ к услугам Symfonys (в данном случае объект request
).
Но подождите! Существует способ:
global $kernel;
if ('AppCache' == get_class($kernel))
{
$kernel = $kernel->getKernel();
}
$request = $kernel->getContainer()->get('request');
И он тоже работает.
Но во всех моих исследованиях я нашел много связанных вопросов, строго предупреждающих о том, что это! Только разница: все эти вопросы имели в виду лиц, а не к Entity слушателей ...
... ведет меня по этим двум вопросам:
- ли вышеупомянутое решение способ идти?
- А если нет: как это сделать?
[Edit:] Еще раз (см первое предложение) позвольте мне пояснить, что этот вопрос также о том, как не использовать услугу. Услуги приходят за определенную стоимость, см. Expensive Service Construction. И особенно в этом случае я редко нуждаюсь в функциональности - вот почему я хочу пойти с Entity Listeners, которые делают не работать как сервис.
Извините, я не подчеркивал этот боковой аспект. Не знаю, почему это квалифицировалось для снижения курса, хотя ...
[Edit2:] Чтобы сделать все более ясным, я добавил еще один пример кода (первый), который показывает, как отображается предмет.
Вы уже видели [Рецептор восприятия сущностей] (http://docs.doctrine-project.org/en/latest/reference/events.html#entity-listeners-resolver)? – Matteo
Я думаю, что это решение в сочетании с методом symfony [Entity Listeners] (http://symfony.com/doc/current/bundles/DoctrineBundle/entity-listeners.html) – Matteo
Возможно, я действительно не понял концепция резольвера. Читайте об этом ранее сегодня, хотя, хорошо читайте: [Ресивер приемника сущностей] (http://egeloen.fr/2013/12/01/symfony2-doctrine2-entity-listener-as-serice/) Но все равно это все еще не решит мою проблему. – Eddie