2

В настоящее время я разрабатываю приложение Symfony 2, и я хочу войти в систему, когда в моих моделях вызывается несколько сеттеров.Injecting Logger в Symfony 2 ODM Documents

Как я вижу, нет никакого способа, чтобы ввести регистратор по умолчанию или доступ к нему через статический реестр в Symfony 2, поэтому мой подход заключается в следующем:

Я добавил статический метод и свойство к основанию класс моих моделей и установите там Logger. Я также добавил геттер, который затем доступен в моих моделях.

Я установил там регистратор через событие ядра запроса, поэтому регистратор доступен только после этого события.

Это решение работает, но для меня это кажется довольно хриплым. Кто-нибудь лучше понял, как подойти к этому? Метод установки, который не полагается на событие ядра запроса, будет приятным. Метод, который не полагается на статические свойства, будет еще лучше!

Внимание! Добавление регистратора в базовый документ может привести к проблемам с сериализацией.

ответ

-1

Вы можете использовать Монолог (official documentation) для регистрации действий. Зарегистрируйтесь регистратор как услугу, и эта услуга будет доступна в контейнере обслуживания.

В app/config.yml, под услугами, зарегистрируйте службу регистрации и ее обработчик. При регистрации обработчика укажите файл журнала с аргументами. В приведенном ниже примере имя файла будет либо dev.api.log, либо prod.api.log в зависимости от среды.

bt.api.logger: 
    class: Symfony\Bridge\Monolog\Logger 
    arguments: [app] 
    calls: 
    - [pushHandler, [@bt.api.logger_handler]] 

bt.api.logger_handler: 
    class: Monolog\Handler\StreamHandler  
    arguments: [%kernel.logs_dir%/%kernel.environment%.api.log, 200] 

После того, как вы зарегистрированный сервис регистратора, он может быть вызван в контроллерах, как показано ниже

$logger = $this->get('bt.api.logger'); 
$msg = "The setter was called"; 
$logger->info(msg); 
+0

Извините, но это не решит мою проблему. У меня уже есть настроенный журнал, проблема заключается в том, как вводить регистратор в мои классы доменов базы данных, которые не могут быть инъецируемыми, но новыми. AFAIK Я не могу получить доступ к контейнеру службы из своих классов домена. –

+0

Единственное решение - как-то определить логист как Сервис. Только услуги получают inject3ed –

0

Я просто поставить его в качестве второго аргумента в инкубаторе:

предположив, что вам есть Субъект поэтому решение ти следующее:

//Namespace Declaration above 
class SomeEntity 
{ 
.... 
private $somefield; 

public function setSomefield($somefield,LoggerService $l) 
{ 
    $this->somefield=$someField; 
    $l->log(""Somefield Has Been Set""); 
} 
} 

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

В случае, если вы используете монолог, а не некоторые пользовательские LoggingClass:

//Namespace Declaration above 
use Symfony\Bridge\Monolog\Logger; 

class SomeEntity 
{ 
.... 
private $somefield; 

public function setSomefield($somefield,Logger $l) 
{ 
    $this->somefield=$someField; 
    $l->info("Somefield Has Been Set"); 
} 
} 

Я надеюсь, что это соответствует вашим потребностям. Это поможет вам лучше регистрировать сеттеры без проблем с сериализацией.