Search code examples
zend-framework2zend-framework-modules

ZF2, using ZFCUser -> using the service manager


I setup ZfcUser as an authentication module. The module works great, except for the fact that I have to define it again in every action:

$sm = $this->getServiceLocator();
$auth = $sm->get('zfcuser_auth_service');
if ($auth->hasIdentity()) {
    fb($auth->getIdentity()->getEmail());
}
else return $this->redirect()->toRoute('zfcuser');

I tried putting the code in construct, but that didn't work out well. Then I checked around for the Service Manager, but couldn't define it properly with all of the multiple versions that came out.

This is the code from my Module class:

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;
            },
        ),
    );
}

How do I setup the service correctly?


Solution

  • Have you considered a controller plugin? It would allow those six lines to be condensed down to one call.

    Otherwise another more generic approach would be to create a base controller that attached a 'dispatch' event. Matthew Weier O'Phinney wrote a blog post showing this approach http://mwop.net/blog/2012-07-30-the-new-init.html under the "Events" heading.

    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
    }