无法在ZF2构造函数中初始化我的插件函数

时间:2015-05-27 05:52:11

标签: php zend-framework frameworks zend-framework2 doctrine

我是ZF2的新手,我正在准备一个简单登录和CRUD系统的演示应用程序。现在登录我准备了一个插件,其中包含一些功能,用于验证用户,返回登录的用户数据,返回登录状态等。但是我面临的问题是我无法将任何变量初始化为我的控制器的构造函数,它将存储插件的任何返回值。它始终显示服务未找到异常。

请在下面找到我的插件代码:

AuthenticationPlugin.php

<?php
namespace Album\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;
use Zend\Session\Container as SessionContainer;
use Zend\View\Model\ViewModel;
use Album\Entity\User;

class AuthenticationPlugin extends AbstractPlugin{

    protected $entityManager;
    protected $usersession;

    public function __construct(){

        $this->usersession = new SessionContainer('UserSession');   
    }

    public function dologin($email,$password)
    {
        $getData = $this->em()->getRepository('Album\Entity\User')->findOneBy(array('email' => $email, 'password' => $password));

        if(count($getData)){

            $this->usersession->offsetSet('userid', $getData->getId());

            return true;
        }
        else{

            return false;
        }   
    }

    public function isloggedin(){

        $userid = $this->usersession->offsetGet('userid');

        if(!empty($userid)){

            return true;    
        }   
        else{

            return false;   
        }
    }

    public function logindata(){

        $userid = $this->usersession->offsetGet('userid');
        $getData = $this->em()->getRepository('Album\Entity\User')->findOneBy(array('id' => $userid));

        return $getData;
    }

    public function logout(){

        $this->usersession->offsetUnset('userid');  
    }

    public function em(){

        return $this->entityManager = $this->getController()->getServiceLocator()->get('Doctrine\ORM\EntityManager');   
    }
}
?>

在我的 module.config.php

'controller_plugins' => array(
        'invokables' => array(
            'AuthPlugin' => 'Album\Controller\Plugin\AuthenticationPlugin',
        )
    ),

现在我在我的控制器中执行此操作:

protected $entityManager;
protected $isloggedin;
protected $authentication;

public function __construct(){

    $this->authentication = $this->AuthPlugin();
    $this->isloggedin = $this->authentication->isloggedin();    
}

我得到的错误如下:

  

发生错误执行期间发生错误;请再试一次   后来。附加信息:   的Zend \的ServiceManager \异常\ ServiceNotFoundException的

     

文件:

D:\xampp\htdocs\subhasis\zf2-tutorial\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php:555
     

消息:

Zend\Mvc\Controller\PluginManager::get was unable to fetch or create an instance for AuthPlugin

但是如果我在任何控制器操作中编写上面的构造函数代码,一切都很好。在ZF1中,我可以初始化init()方法中的任何变量,并可以在我的任何操作中使用该变量。我怎样才能在ZF2中做到这一点?在这里,我想检测用户是否登录了构造函数本身。现在我必须在我不想要的每一个动作中调用插件。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您收到的错误是因为您尝试在控制器的ServiceManager方法中使用Zend\Mvc\Controller\PluginManager(通过__construct)。

当控制器注册为invokable类时,服务管理器(ControllerManager)负责创建控制器实例。 创建后,它会调用controllers various default 'initializers' also inlcudes the plugin manager。通过将代码放在__construct中,它会在设置之前尝试使用插件管理器。

您可以使用控制器 factory 解决此问题,而不是module.config.php中的可调用内容。

'controllers' => [
    'factories' => [
        'MyModule\Controller\Foo' => 'MyModule\Controller\FooControllerFactory',
    ],
],

然后工厂

namespace MyModule\Controller\FooControllerFactory;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class FooControllerFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $controllerManager)
    {
        $serviceManager = $controllerManager->getServiceLocator();
        $controllerPluginManager = $serviceManager->get('ControllerPluginManager');

        $authPlugin = $controllerPluginManager->get('AuthPlugin');

        return new FooController($authPlugin);
    }
}

最后,更新控制器__construct以添加新参数并删除$this->authPlugin()的调用

class FooController extends AbstractActionController
{
    public function __construct(AuthPlugin $authentication)
    {
        $this->authentication = $authentication;
        $this->isloggedin     = $authentication->isloggedin();
    }
}