J'essaie d'obtenir un localisateur de services / gestionnaire d'entité dans la classe Plugin, comment puis-je obtenir cela.
Dans mon contrôleur, je l'obtiens comme ça. p> mais dans la classe de plugin, je reçois une erreur sur $ ceci-> getverservicelocator (). Parce que cela n'est pas disponible dans la classe Plugin. P> Comment puis-je faire la même chose pour que je puisse récupérer des enregistrements et insérer peu dans la base de données dans le plugin. P> J'ai un objet mvcevent $ E dans ma classe de plug-in, je peux utiliser cela pour obtenir un gestionnaire d'entité? p> J'ai utilisé Ce plugin pour créer mon plugin p> Tout guide sera spécifié. p> mise à jour: p> Je demande la classe ci-dessus dans module.php p> Je registre ce plugin dans module.config.php p>
3 Réponses :
Que voulez-vous dire avec "classe de plugin"? Dans le cas où vous parlerez de vous parler des plug-ins de contrôleur, vous pouvez y accéder à l'aide de (à partir de la portée du plugin du contrôleur): Pour d'autres classes, je crée généralement une usine qui injecte automatiquement l'instance ServiceManager. Par exemple, dans la classe de module: p> $ ceci-> getController () -> getVicElocator () -> obtenir ('doctrine.entitymanager.orm_default') ; code>.
La classe du plug-in est sous contrôleur \ plugin \ et est invoquable à l'aide de la matrice de retour ('contrôleur_plugins' => tableau ('invokables' => tableau ('ACLPLUGIN' => 'Auth \ contrôleur \ plugin \ aclplugin',),),),), ; Mais d'une manière ou d'une autre, je reçois une erreur quand j'utilise $ ceci-> getController () -> getvicelocator () -> obtenir ('doctrine.e ntitymanager.orm_def Ault'); Dans l'erreur de la classe Plugin est une erreur fatale: appelez à une fonction de membre GETVICELOCATOR () sur un non-objet dans /Module/auth/src/auth/controller/plugin/aclplugin.php
Pouvez-vous placer votre classe de plug-in contrôleur? Je fais cela exactement de la même manière et ça marche pour moi. En outre, veuillez indiquer votre version ZF2 (Betan / RCN / 2.0.0).
La version est la relase stable ZF2 2.0.0. S'il vous plaît voir la classe en question ci-dessus
Comment utilisez-vous / appelez-vous cette classe?
Oh - OK, c'est le problème. Les plugins de contrôleur sont conçus pour être utilisés à l'intérieur d'un contrôleur. Ils mettent en œuvre un motif de méthode pluggable et peuvent être invoqués à l'aide de $ ceci-> PlugInName () -> Dosomethanit code> dans le contexte du contrôleur. Dans l'affaire Thee, le système de plug-in du contrôleur s'occupe de l'instanciation et attribue à l'instance du contrôleur. Toutefois, vous pouvez implémenter le servicanagerawareinterface dans cette classe et injecter le servicanager du module avant d'appeler la méthode checkacl code> ..
n'importe quel exemple que vous pouvez recommander?
Je peux recommander Cette approche . Vous devez lire un peu mais je l'ai fait surtout de cette façon et cela fonctionne comme un charme.
a changé la classe ACLPlugin ci-dessus comme ci-dessous
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;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\ServiceManager\ServiceManager;
class AclPlugin extends AbstractPlugin implements ServiceManagerAwareInterface
{
/*
* @var Doctrine\ORM\EntityManager
*/
protected $em;
protected $sm;
public function checkAcl($e)
{
$this->setServiceManager( $e->getApplication()->getServiceManager() );
$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);
foreach ($resultIdentities as $r)
echo $r->username;
exit();
return;
} else {
$matches->setParam('controller', 'Auth\Controller\User'); // redirect
$matches->setParam('action', 'accessdenied');
return;
}
}
public function getEntityManager() {
if (null === $this->em) {
$this->em = $this->sm->getServiceLocator()->get('doctrine.entitymanager.orm_default');
}
return $this->em;
}
public function setEntityManager(EntityManager $em) {
$this->em = $em;
}
/**
* Retrieve service manager instance
*
* @return ServiceManager
*/
public function getServiceManager()
{
return $this->sm->getServiceLocator();
}
/**
* Set service manager instance
*
* @param ServiceManager $locator
* @return void
*/
public function setServiceManager(ServiceManager $serviceManager)
{
$this->sm = $serviceManager;
}
}
réellement obtenir le servicanager dans le plugin du contrôleur est assez facile!
Il suffit d'utiliser: $ ceci-> getController () -> getverservicelocator () code> P> P> > namespace Application\Controller\Plugin;
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
class Translate extends AbstractPlugin
{
public function __invoke($message, $textDomain = 'default', $locale = null)
{
/** @var \Zend\I18n\Translator\Translator $translator */
$translator = $this->getController()->getServiceLocator()->get('translator');
return $translator->translate($message, $textDomain, $locale);
}
}