我将ZfcUser设置为身份验证模块。该模块运行良好,除了我必须在每个操作中再次定义它:
$sm = $this->getServiceLocator();
$auth = $sm->get('zfcuser_auth_service');
if ($auth->hasIdentity()) {
fb($auth->getIdentity()->getEmail());
}
else return $this->redirect()->toRoute('zfcuser');
我尝试将代码放在构造中,但是效果不好。 然后我检查了服务管理器,但无法正确定义所有出现的多个版本。
这是我的Module类的代码:
public function getServiceConfig() {
return array(
'factories' => array(
'Todo\Model\TodoTable' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$table = new TodoTable($dbAdapter);
return $table;
},
),
);
}
如何正确设置服务?
答案 0 :(得分:5)
你考虑过一个控制器插件吗?这将允许将这六行压缩为一次调用。
否则另一种更通用的方法是创建一个附加'dispatch'事件的基本控制器。 Matthew Weier O'Phinney写了一篇博文,在“事件”标题下显示了这种方法http://mwop.net/blog/2012-07-30-the-new-init.html。
public function setEventManager(EventManagerInterface $events)
{
parent::setEventManager($events);
$controller = $this;
$events->attach('dispatch', function ($e) use ($controller) {
if (is_callable(array($controller, 'checkIdentity')))
{
call_user_func(array($controller, 'checkIdentity'));
}
}, 100);
}
public function checkIdentity()
{
// Existing ZfcUser code
}