7
votes

ZF2 GetVicElocator en classe ControllerPlugin

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. xxx

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.

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.

J'ai un objet mvcevent $ E dans ma classe de plug-in, je peux utiliser cela pour obtenir un gestionnaire d'entité?

J'ai utilisé Ce plugin pour créer mon plugin

Tout guide sera spécifié.

mise à jour: xxx

Je demande la classe ci-dessus dans module.php xxx

Je registre ce plugin dans module.config.php xxx


0 commentaires

3 Réponses :


8
votes

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): $ ceci-> getController () -> getVicElocator () -> obtenir ('doctrine.entitymanager.orm_default') ; .

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: xxx


7 commentaires

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 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 ..


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.



2
votes

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

}


0 commentaires

1
votes

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


0 commentaires