gpt4 book ai didi

php - ControllerPlugin 类中的 ZF2 getServiceLocator

转载 作者:可可西里 更新时间:2023-11-01 12:49:57 26 4
gpt4 key购买 nike

我正在尝试在插件类中获取服务定位器/实体管理器,我该如何获取它。

在我的 Controller 中,我是这样得到它的。

public function getEntityManager()
{
if(null === $this->em){
$this->em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
}
return $this->em;
}

public function setEntityManager(EntityManager $em)
{
$this->em = $em;
}

但在插件类中,我在 $this->getServiceLocator() 行上遇到错误。因为这在插件类中不可用。

我怎样才能做同样的事情,以便我可以获取一些记录并在插件的数据库中插入一些记录。

我的插件类中确实有 MvcEvent $e 对象,我可以利用它来获取实体管理器吗?

我用过this plugin创建我的插件

任何指南都将被应用。

更新:

namespace Auth\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;
use Zend\EventManager\EventInterface as Event;
use Zend\Authentication\AuthenticationService;

use Doctrine\ORM\EntityManager;
use Auth\Entity\User;
use Zend\Mvc\MvcEvent;
class AclPlugin extends AbstractPlugin
{

/*
* @var Doctrine\ORM\EntityManager
*/
protected $em;

public function checkAcl($e)
{

$auth = new AuthenticationService();
if ($auth->hasIdentity()) {
$storage = $auth->getStorage()->read();
if (!empty($storage->role))
$role = strtolower ( $storage->role );
else
$role = "guest";
} else {
$role = "guest";
}
$app = $e->getParam('application');
$acl = new \Auth\Acl\AclRules();

$matches = $e->getRouteMatch();
$controller = $matches->getParam('controller');
$action = $matches->getParam('action', 'index');

$resource = strtolower( $controller );
$permission = strtolower( $action );

if (!$acl->hasResource($resource)) {
throw new \Exception('Resource ' . $resource . ' not defined');
}

if ($acl->isAllowed($role, $resource, $permission)) {

$query = $this->getEntityManager($e)->createQuery('SELECT u FROM Auth\Entity\User u');
$resultIdentities = $query->execute();

var_dump($resultIdentities);
exit();


return;

} else {
$matches->setParam('controller', 'Auth\Controller\User'); // redirect
$matches->setParam('action', 'accessdenied');

return;
}


}


public function getEntityManager($e) {

var_dump($this->getController()); // returns null
exit();
if (null === $this->em) {
$this->em = $this->getController()->getServiceLocator()->get('doctrine.entitymanager.orm_default');

}
return $this->em;
}

public function setEntityManager(EntityManager $em) {
$this->em = $em;
}

}

我在 module.php 中调用上面的类

    public function onBootstrap(Event $e) 
{

$application = $e->getApplication();
$services = $application->getServiceManager();

$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach('dispatch', array($this, 'loadConfiguration'),101);

}

public function loadConfiguration(MvcEvent $e)
{

$e->getApplication()->getServiceManager()
->get('ControllerPluginManager')->get('AclPlugin')
->checkAcl($e); //pass to the plugin...

}

我正在 module.config.php 中注册这个插件

return array(  
'controllers' => array(
'invokables' => array(
'Auth\Controller\User' => 'Auth\Controller\UserController',
),
),

'controller_plugins' => array(
'invokables' => array(
'AclPlugin' => 'Auth\Controller\Plugin\AclPlugin',
),
),
);

最佳答案

“插件类”是什么意思?如果你在谈论 Controller 插件,你可以使用(从 Controller 插件的范围)访问它:$this->getController()->getServiceLocator()->get('doctrine.entitymanager.orm_default') ;

对于其他类,我通常创建一个自动注入(inject) ServiceManager 实例的工厂。例如,在模块类中:

public function getServiceConfig()
{
return array(
'factories' => array(
'myServiceClass' => function(ServiceManager $sm) {
$instance = new Class();
$instance->setServiceManager($sm);
// Do some other configuration

return $instance;
},
),
);
}

// access it using the ServiceManager where you need it
$myService = $sm->get('myService');

关于php - ControllerPlugin 类中的 ZF2 getServiceLocator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12421565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com