因此,您需要以某种方式告诉记录器正在调用哪个控制器。
我建议您将事件从控制器传递到记录器服务。如果您可以访问所需的所有信息:
1) 控制器插件:
您可以为此使用控制器插件管理器:
<?php
namespace Application\Controller\Plugin;
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
use Zend\Mvc\MvcEvent;
class ControllerEventLogger extends AbstractPlugin{
protected $map = [
'Application\Controller\OneController' => 'one.log',
'Application\Controller\TwoController' => 'two.log'
];
/**
* @param MvcEvent $event
*/
public function __invoke(MvcEvent $event){
$routeMatch = $event->getRouteMatch();
$action = $routeMatch->getParam('action');
$controller = $routeMatch->getParam('controller');
// map your controller to a log file name here
$logFileName = $this->map[ $controller ];
// do your logging
}
}
在你的module.config.php:
<?php
return array(
// ...
'controller_plugins' => array(
'invokables' => array(
'ControllerEventLogger' => 'Application\Controller\Plugin\ControllerEventLogger',
)
),
// ...
);
在你的控制器类中:
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class OneController extends AbstractActionController{
public function indexAction(){
$this->ControllerEventLogger(event);
return new ViewModel();
}
}
注意:为了让事情更整洁,您仍然可以创建一个单独的记录器服务,通过工厂将其注入到控制器插件中。那么你的控制器插件就是你的控制器和记录器服务之间的粘合剂。
2) 基于监听器的事件:
您还可以制作一个基于事件的记录器。在这种情况下,您可以简单地记录每个调度事件。像这样,您的控制器甚至不会意识到日志记录(更清洁,因为控制器内部根本没有任何记录器代码)。侦听器类似于:
<?php
namespace Application\Listener;
use Zend\EventManager\AbstractListenerAggregate;
use Zend\EventManager\EventManagerInterface;
use Zend\Mvc\MvcEvent;
class ControllerLoggerListener extends AbstractListenerAggregate
{
protected $map = [
'Application\Controller\OneController' => 'one.log',
'Application\Controller\TwoController' => 'two.log'
];
/**
* @param EventManagerInterface $events
*/
public function attach(EventManagerInterface $events)
{
$this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, array($this, 'onDispatch'));
}
/**
* @param MvcEvent $event
*/
public function onDispatch(MvcEvent $event)
{
$routeMatch = $event->getRouteMatch();
$action = $routeMatch->getParam('action');
$controller = $routeMatch->getParam('controller');
// map your controller to a log file name here
$logFileName = $this->map[ $controller ];
// do your logging
}
}
有一百种方法可以做到这一点,这完全取决于您的具体需求。