ZendFramework 2 - 如何从Model类调用zfcUser

时间:2014-04-25 10:04:00

标签: zend-framework2

我正在尝试从我的模型中的类调用 ZFCUser ,但我不断收到此消息:

Call to undefined method Members\Model\MemberTable::zfcUserAuthentication()

这就是我试图称之为:

public function getUserEntity()
    {
        if($this->zfcUserAuthentication()->getAuthService()->hasIdentity())
        {
            if (!$this->user_entity) 
            {
                $this->setUserEntity($this->zfcUserAuthentication()->getAuthService()->getIdentity());
            }
            return $this->user_entity;
        }
    } 

我怀疑我需要实现/扩展一个类以便ZFcuser被识别。

我真的会对此提出一些快速建议。

谢谢

顺便说一下

当我从我的控制器调用ZFCUser时,ZFCUser正常工作,因此使用Zend \ Mvc \ Controller \ AbstractActionController显然可以识别它。

但是对于框架中的其他类,AbstractActionController的等价物是什么。

2 个答案:

答案 0 :(得分:1)

zfcUserAuthentication()是一个控制器插件,因此可以从控制器调用它。您不能(或不应该)尝试从非控制器访问它。如果您需要另一个类中的用户实体,则应将其作为该类的依赖项传递。

编辑:更新您的成员表工厂,以便设置用户实体:

'Members\Model\MemberTable' => function($sm) {
    $tableGateway = $sm->get('MemberTableGateway');
    $table = new MemberTable($tableGateway);

    $authService = $serviceLocator->get('zfcuser_auth_service');
    $userEntity = $authService->getIdentity();

    $table->setUserEntity($userEntity);

    return $table;
}

为您的MemberTable课程添加一个属性:

protected $userEntity;

和getters / setter:

public function setUserEntity($userEntity)
{
    $this->userEntity = $userEntity;
}

public function getUserEntity()
{
    return $this->userEntity;
}

然后在需要时调用$this->getUserEntity()

答案 1 :(得分:0)

有多种方法可以做到这一点 -

其中一种方法是 - 在“MemberTable.php”文件中执行以下操作。
也许我们的项目中已经提供了以下大部分代码。

一个。在'namespace'语句后添加以下行 -

use Zend\ServiceManager\ServiceLocatorAwareInterface;         //Added Line
use Zend\ServiceManager\ServiceLocatorInterface;              //Added Line 

湾将类语句更改为 -

class MemberTable implements ServiceLocatorAwareInterface {    //Modified Line
     ....
     .....
}

℃。在类语句的顶部添加以下行 -

class MemberTable implements ServiceLocatorAwareInterface {
     protected $serviceLocator;                                //Added line
     ....
     .....
}

d。添加以下功能 -

public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
    $this->serviceLocator = $serviceLocator;
}

public function getServiceLocator() {
    return $this->serviceLocator;
}

即在Members / Module.php中,进行更改

'Members\Model\MemberTable' => function($sm) {
    $tableGateway = $sm->get('MemberTableGateway');
    $table = new MemberTable($tableGateway);
    $table->setServiceLocator($sm);                   //This is the important line.
    return $table;
}


现在您在MemberTable类中可以使用'ServiceLocator'。
要访问zfcUserAuthentication()或任何ControllerPlugin,您可以执行以下操作 -

public function getUserEntity()
{
    $zfcUserAuth = $this->getServiceLocator()->get('controllerPluginManager')->get('zfcUserAuthentication');

    if($zfcUserAuth->getAuthService()->hasIdentity())
    {
        if (!$this->user_entity) 
        {
            $this->setUserEntity($zfcUserAuth->getAuthService()->getIdentity());
        }
        return $this->user_entity;
    }
}