2017-02-26 6 views
1

私はZendFramework applicationです。その実行中のZend Framework 3.私はzend-logを追加し、それをconstructor of the IndexControllerに挿入しました。そういう意味で、インデックスコントローラのインデックスアクションにメッセージを記録します。Zend Framework MVCアプリケーションのデフォルトのZendLogファクトリを設定するにはどうすればよいですか?

public function __construct(Logger $logger) 
{ 
    $this->logger = $logger; 
} 

public function indexAction() 
{ 
    $this->logger->info('Example Log Message'); 
    return new ViewModel(); 
} 

vendor/bin/generate-factory-for-classで工場を生成することができました。私はそれをモジュール設定に追加しました。

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => Controller\IndexControllerFactory::class, 
    ], 
], 

私はインデックスコントローラを実行すると、私は次のエラーを取得する:

/var/www/vendor/zendframework/zend-log/src/Logger.php:434 
No log writer specified 

私は次のようにライターを追加することができます知っている:ここで

$logger->addWriter($writer); 

私の質問はloggerは設定をサポートしていますか?モジュールコンフィグの['service_manager' => 'factories' => [ . . . ] ]に追加するだけですか?私は書き込む工場クラスをどこに置くべきですか?他のサービスでは?

私はこれを「正しい」方法で解決するのに苦労しています。

+0

あなたはロガーファクトリーを作成していますか?コントローラとロガーの工場を貼り付けることができます。 – tasmaniski

答えて

1

通常、ロガー設定はmodule.config.phpに保持されます。しかし確かに、それは他の場所に置くことができます。正しい方法はありませんが、あなたが達成しようとしていることを知らず、伝統に従うことをお勧めします。

あなたmodule.config.phpに入れる:

'service_manager' => [ 
    'factories' => [ 
     'log' => \Zend\Log\LoggerServiceFactory::class, 
    ], 
], 

'log' => [ 
    'writers' => [ 
     [ 
      'name' => 'stream', 
      'options' => [ 
       'stream' => "test.log" 
      ] 
     ] 
    ] 
] 

お使いのコントローラの工場は、次のようになります。

class IndexControllerFactory implements FactoryInterface 
{ 
    public function __invoke (ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $indexController = new IndexController(); 
     $indexController->setLogger ($container->get ('log')); 

     return $indexController; 
    } 
} 

とコントローラ自体:

use Zend\Log\LoggerAwareInterface; 
use Zend\Log\LoggerAwareTrait; 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class IndexController extends AbstractActionController implements LoggerAwareInterface 
{ 
    use LoggerAwareTrait; 

    public function testAction() 
    { 
     $this->logger->info("test"); 
    } 
} 
+0

それは私が欲しいものとほぼ同じです。 –

関連する問題