Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-05-2013 15:39:31

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

[Erreur] Quand les services sont là

Bonjour,

Je débute en ZF2 et certaines notions me sont encore un peu flou, J'ai effectué le tutoriel album en entier, je me suis donc lancer à présent dans la gestion des ACL.

J'ai utiliser ces tuto là :


ACL

Architecture ZF2

Malheureusement je suis tombé sur quelques problèmes quand j'ai essayé de l'adapter au squelette de base, plus précisément au niveau des services ... dans le module User j'ai cette configuration :

Code:

[lang=php]public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'User\Model\UserTable' =>  function($sm) {
                    $tableGateway = $sm->get('UserTableGateway');
                    $table = new UserTable($tableGateway);
                    return $table;
                },
                'UserTableGateway' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new User());
                    return new TableGateway('user', $dbAdapter, null, $resultSetPrototype);
                },
            ),
        );
    }

j'aimerai utiliser ce qu'il y a dans les différents model dans la classe Adapter afin de pouvoir vérifier si l'utilisateur peut se connecter ou non. mais la page ce bloque complètement dans le code suivant à la ligne 84:

Code:

[lang=php]<?php
/**
 * File for Auth Adapter Class
 *
 * @category  User
 * @author    Ritesh Jha (mailrkj@gmail.com)
 */

namespace User\Auth;

use Zend\Authentication\Adapter\AdapterInterface;
use Zend\Authentication\Result as AuthenticationResult;

use User\Model\User;


class Adapter implements AdapterInterface{

    protected $userTable;    
    /**
     * Digest authentication user
     *
     * @var string
     */
    protected $email;

    /**
     * Password for the user of the realm
     *
     * @var string
     */
    protected $password;
    
   /**
     * Sets the username option value
     *
     * @param  mixed $email
     * @return Digest Provides a fluent interface
     */
    public function setIdentity($email) {
        $this->email = (string) $email;
        return $this;
    }

    /**
     * Sets the password option value
     *
     * @param  mixed $password
     * @return Digest Provides a fluent interface
     */
    public function setCredential($password) {
        $this->password = (string) $password;
        return $this;
    }

    /**
     * Defined by Zend\Authentication\Adapter\AdapterInterface
     *
     * @throws Exception\ExceptionInterface
     * @return AuthenticationResult
     */
    public function authenticate() {        
        $user = $this->getUserTable()
            ->find_by_email_and_password($this->email, $this->password);
        
        //$user = User::find_by_email_and_password();

        if ($user) {
            $result['code'] = AuthenticationResult::SUCCESS;
            $result['identity'] = $user;
            $result['messages']['success'] = 'Logged in';
        } else {
            $result['code'] = AuthenticationResult::FAILURE_IDENTITY_NOT_FOUND;
            $result['messages']['invalid'] = "Email '$this->email' and password combination not found";
            $result['identity']= false;
        }

        return new AuthenticationResult($result['code'], $result['identity'], $result['messages']);
    }
    
    public function getUserTable()
    {
        if (!$this->userTable) {
            $sm = $this->getServiceLocator(); //SUR CETTE LIGNE
            $this->userTable = $sm->get('User\Model\UserTable');
        }
        return $this->userTable;
    }
}

Donc je fais appel à vous afin de comprendre comment utiliser ces différents services ...

Je pense qu'il me faudrait juste récupérer le getServiceLocator(), mais pas moyen de trouver comment l'avoir.

Merci d'avance

Dernière modification par Hanyas (23-05-2013 15:50:01)

Hors ligne

 

#2 23-05-2013 16:06:42

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Erreur] Quand les services sont là

Salut, pour récupérer le service locator tu dois implémenter l'interface ServiceLocatorAwareInterface avec les getters et setters qui vont bien.

Hors ligne

 

#3 23-05-2013 16:25:39

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

Re: [Erreur] Quand les services sont là

Bonjour et merci.

j'ai rajouté avant ma classe

Code:

[lang=php]
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

et dans la classe

Code:

[lang=php]protected $services;
    
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->services = $serviceLocator;
    }
    
    public function getServiceLocator()
    {
        return $this->services;
    }

Mais je me trouve avec le même probléme qu'avait cette personne

Ma variable SM est vide, je pense qu'il me manque la configuration dans le onBootstrap(), je vais essayer de comprendre comment elle fonctionne, je reviens si jamais je galère trop (deux jour que je suis sur ça ><)

Penses tu que c'est la bonne voie ?

Hors ligne

 

#4 23-05-2013 16:45:21

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Erreur] Quand les services sont là

Salut ServiceLocatorInterface tu peux le dégager ça n'a rien à voir c'est l'interface lié au service locator donc c'est dans le cas où tu veux faire ton propre service manager.

Oui tu es sur la bonne voie. En fait pour que les interfaces de type "aware" fonctionnent il faut deux critères :
- avoir l'initializer qui va bien de déclarer. Je te rassure toutes celles présentent dans le ZF2 ont leur initializer de déclaré donc dans le cas de ServiceLocatorAwareInterface tu n'as rien à faire. Généralement c'est nécessaire de le faire sur des modules externes car ça peut alourdir le code puisque à chaque création d'objet par le service manager chaque initializer va être appelé (c'est un truc du genre si ma classe instanceof moninterface alors tu set la valeur qui va bien)
- ne pas créer l'objet avec un new MonObjet() directement mais bien $serviceManager->get('monObjet'). Pour cela rien de plus simple il suffit de déclarer dans le cas d'une classe simple une entrée dans la configuration sur la clé invokables dans le cas contraire dans factories.

Hors ligne

 

#5 23-05-2013 16:54:32

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

Re: [Erreur] Quand les services sont là

Quand j’enlève le "use Zend\ServiceManager\ServiceLocatorInterface;" la classe ne charge plus, est-ce normale ?

Sinon je n'ai rien trouvé sur le bootstrap pour m'aiguiller, tu n'aurais pas un site sous la main ?

Edition :

Désoler je n'avais pas tous compris, si je veux initialiser mon objet je devrais donc faire comme ça :

Code:

[lang=php]

public function onBootstrap($e)
    {
        $app = $e->getParam('application');
        $simpleClass = $app->getServiceManager()->get('User\Auth\Adapter');
    }

Dernière modification par Hanyas (23-05-2013 16:58:47)

Hors ligne

 

#6 23-05-2013 17:10:24

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Erreur] Quand les services sont là

Désolé autant pour moi ServiceLocatorInterface faut bien le laisser. Je voulais le supprimer de mon message avant de le poster et j'ai zappé. Donc t'en a bien besoin ^^.

En fait le service manager fonctionne avec un tableau d'entrées faisant référence à une classe. Suivant si la classe a besoin de configurations supplémentaires ou non tu as deux méthodes. Soit tu passes par une fabrique (factory) qui va permettre de créer ta classe de façon complexe ou en l'invoquant ce qui correspond grosso modo à un new MaClasse() en amélioré puisque le service manager va tenir compte des interfaces que tu implémentes en fonction des initializer qu'il connait.

Voici un exemple d'initializer lié aux formulaires pour avoir accès à l'entity manager depuis ceux-ci (dans le fichier Module.php) :

Code:

[lang=php]public function getFormElementConfig()
    {
        return array(
            'initializers' => array(
                'ObjectManagerInitializer' => function ($element, $formElements) {
                    if ($element instanceof ObjectManagerAwareInterface) {
                        $services = $formElements->getServiceLocator();
                        $entityManager = $services->get('orm_em');

                        $element->setObjectManager($entityManager);
                    }
                },
            ),
        );
    }

A noter que la méthode getFormElementConfig a peut être changé avec la version 2.2 du ZF2 puisqu'il y a eu des modifications sur le plugin manager lié aux formulaires. Il se passe exactement la même chose lorsque tu as l'interface ServiceLocatorAwareInterface il va passer à ta classe le serviceLocator.

Ensuite tu dois, comme je l'ai dit plus haut, déclarer auprès de ton service manager une entrée pour qu'il sache comment créer ta classe. Tu vas donc pour ça aller dans le fichier module.config.php de ton module et y ajouter une entrée. Si on prend l'exemple d'invokables tu vas avoir quelque chose comme ça :

Code:

[lang=php]'invokables' => array(
        // Par convention on met le FQCN de la classe ça permet de s'y retrouver aussi plus facilement quand on reli le code
        'clé' => 'namespace de la classe',
        'User\Auth\Adapter' => 'User\Auth\Adapter',
    ),

Donc à partir de là pour récupérer une instance de ta classe tu devras donc faire $serviceLocator->get('User\Auth\Adapter')

Hors ligne

 

#7 24-05-2013 11:42:48

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

Re: [Erreur] Quand les services sont là

Bonjour,

Je sens qu'on y est presque, je récapitule déjà pour être sur que j'ai tous compris :

les différents services sont configurés dans le module, cela permet à l’initialisation de certaine classe de leur rajouter des services supplémentaires. Par exemple ici, on utilise l'adapter afin de renvoyer un objet TableGateway.

Code:

[lang=php]
'UserTableGateway' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new User());
                    return new TableGateway('user', $dbAdapter, null, $resultSetPrototype);
                },

J'avais lu quelque part que les différents paramètres comme "invokables" pouvaient aussi ce trouver dans le getServiceConfig, pour moi ça marche (dans la méthode onBootstrap du module), est-ce plus conseillé de le mettre dans le confi.module.php ?

En revanche, mon $sm = $this->getServiceLocator() est toujours "Uninitialized":

Code:

[lang=php]
use Zend\Authentication\Adapter\AdapterInterface;
use Zend\Authentication\Result as AuthenticationResult;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

use User\Model\User;

class Adapter implements AdapterInterface,ServiceLocatorAwareInterface {

protected $services;
    
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->services = $serviceLocator;
    }
    
    public function getServiceLocator()
    {
        return $this->services;
    }

     public function getUserTable()
     {
          if (!$this->userTable) {
               $sm = $this->getServiceLocator();
               $this->userTable = $sm->get('User\Model\UserTable');
          }
          return $this->userTable;
     }
}

je doit créer une "factories" de cette class (avec le service associé) et l'appeler dans le contrôleur avec ma factories ? si c'est le cas, je trouve que c'est usine à gaz ... je pense plutôt que je n'ai rien compris ><

Désoler de te prendre un peu de ton temps, j'avoue que je bloque pas mal sur cet aspect que son les services dans ZF2.

http://img15.hostingpics.net/pics/87906724052013113006.png

Dernière modification par Hanyas (24-05-2013 11:43:11)

Hors ligne

 

#8 24-05-2013 12:02:53

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Erreur] Quand les services sont là

Oui je pense plutôt que tu as pas tout compris. En fait les objets ne sont pas initialisés à chaque requête mais bien quand tu les appelles. L'avantage c'est que comme c'est classes sont partagées par défaut si tu les appelles plusieurs fois dans la même requêtes tu récupères toujours le même objet. Donc niveau perf ça a quand même certains avantages.

Oui tu peux le faire dans la fonction getServiceConfig() de la classe Module.php. Dans le onBootstrap c'est crado mais il y a certaines choses nécessaire à faire pour que l'application fonctionne (le skeleton les fait de base).

En fait tu as deux choix pour créer une classe via le service manager.
- Soit c'est une classe simple sans paramètres dans le constructeur que tu pourrais initialiser par toi même de cette façon : $maClasse = new MaClasse();. La seule différence entre le new classique et l'appel via le service manager c'est que si ta classe implémente une interface du type "Aware" il va lui passer la référence à la classe. Dans le cas de ServiceLocatorAwareInterface il va lui passer le service locator. Du coup ta classe pourra l'utiliser. Si tu avais à le faire à la main il faudrait faire un truc du genre
$maClasse = new MaClass($serviceLocator); ou $maClasse = new MaClass(); $maClasse->setServiceLocator($serviceLocator);.
C'est ce que fais le service manager mais via des initializers
- Soit tu utilises une fabrique parce que tu as besoin de récupérer plein d'infos :

Code:

[lang=php]
$class1 = $serviceLocator->get('class1');
$class2 = $serviceLocator->get('class2');
$maClass = new MaClass($class1, $class2);
$maClass->setParam1('toto');
$maClass->setParamX('x');

return $maClass;

Ca forcément le service manager peut pas le deviner tout seul donc ce qu'il se passe c'est que dans l'entrée factories au lieu de lui indiquer le namespace de ta classe tu vas lui indiquer le namespace de sa fabrique qui elle renverra une instance de ta classe. Un peu comme tu le fais pour ta tableGateway sauf qu'au lieu de passer par une fabrique tu passes par une fonction anonyme. C'est un peu moins performant et pose problème lorsque tu veux mettre les fichiers de conf en cache mais au final ça fait la même chose.

Après dans ton contrôleur ou n'importe où à partir du moment où tu as le service manager tu peux récupérer une instance de ta classe en faisant $serviceManager->get('maClass');

Voila

Hors ligne

 

#9 24-05-2013 12:34:52

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

Re: [Erreur] Quand les services sont là

Donc j'ai bien compris la première partie qui initialise les class complexes ... la partie que je n'ai pas vraiment compris c'est comment affecter le serviceLocator à ma classe.

ce code là, ne sert qu'à l'utiliser je pense :

Code:

[lang=php]
protected $services;
    
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->services = $serviceLocator;
    }
    
    public function getServiceLocator()
    {
        return $this->services;
    }

Donc il me manque la partie constructeur de ma classe qui initialise le serviceLocator ? Qu'est-ce qu'un type "aware" ?

Hors ligne

 

#10 24-05-2013 12:44:49

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: [Erreur] Quand les services sont là

Orkin a écrit:

L'avantage c'est que comme c'est classes sont partagées par défaut ...

Oh le vilain. big_smile


22914720

Hors ligne

 

#11 24-05-2013 13:26:00

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

Re: [Erreur] Quand les services sont là

Je viens de relire un peu tous.

Normalement le serviceLocator s'initialise automatiquement ? mon problème viens donc d'autre par non ?

Code:

[lang=php]
<?php
/**
 * File for Auth Adapter Class
 *
 * @category  User
 * @author    Ritesh Jha (mailrkj@gmail.com)
 */

namespace User\Auth;

use Zend\Authentication\Adapter\AdapterInterface;
use Zend\Authentication\Result as AuthenticationResult;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

use User\Model\User;

class Adapter implements AdapterInterface,ServiceLocatorAwareInterface {

    protected $services;
    
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->services = $serviceLocator;
    }
    
    public function getServiceLocator()
    {
        return $this->services;
    }
    
    protected $userTable;    
    
    /**
     * Digest authentication user
     *
     * @var string
     */
    protected $email;

    /**
     * Password for the user of the realm
     *
     * @var string
     */
    protected $password;
    
   /**
     * Sets the username option value
     *
     * @param  mixed $email
     * @return Digest Provides a fluent interface
     */
    public function setIdentity($email) {
        $this->email = (string) $email;
        return $this;
    }

    /**
     * Sets the password option value
     *
     * @param  mixed $password
     * @return Digest Provides a fluent interface
     */
    public function setCredential($password) {
        $this->password = (string) $password;
        return $this;
    }

    /**
     * Defined by Zend\Authentication\Adapter\AdapterInterface
     *
     * @throws Exception\ExceptionInterface
     * @return AuthenticationResult
     */
    public function authenticate() {        
        $user = $this->getUserTable()
            ->find_by_email_and_password($this->email, $this->password);        
        //$user = User::find_by_email_and_password();

        if ($user) {
            $result['code'] = AuthenticationResult::SUCCESS;
            $result['identity'] = $user;
            $result['messages']['success'] = 'Logged in';
        } else {
            $result['code'] = AuthenticationResult::FAILURE_IDENTITY_NOT_FOUND;
            $result['messages']['invalid'] = "Email '$this->email' and password combination not found";
            $result['identity']= false;
        }

        return new AuthenticationResult($result['code'], $result['identity'], $result['messages']);
    }
    
    public function getUserTable()
    {
        if (!$this->userTable) {
            $sm = $this->getServiceLocator();
            $this->userTable = $sm->get('User\Model\UserTable');
        }
        return $this->userTable;
    }
}

Hors ligne

 

#12 24-05-2013 14:14:14

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Erreur] Quand les services sont là

Bouks a écrit:

Oh le vilain. big_smile

C'est toi le vilain

EvanDotPro a écrit:

By default, all services are set to shared.

http://blog.evan.pro/introduction-to-th … icemanager

Maintenant je vais te laisser réfléchir un peu parce que tu as TOUS les éléments de réponses

Hanyas a écrit:

Donc il me manque la partie constructeur de ma classe qui initialise le serviceLocator ? Qu'est-ce qu'un type "aware" ?

Non non non et non ... Je te résume vite fait. La partie qui se charge d'initialiser le service locator c'est l'interface de type "Aware". Une interface de type "Aware" tu en utilises une donc si tu ne sais pas ce que c'est ... ServiceLocatorAwareInterface. Il y a aware pour avertir le service manager que cette classe là vas avoir besoin d'une instance du service locator/manager qui est passé à ta classe via un initializer qui va faire un test sur ta classe de ce genre :

Code:

[lang=php]if ($maClasse instanceof ServiceLocatorAwareInterface) {
$maClasse->setServiceLocator($serviceLocator);
}

Donc lorsque le service manager va t'instancier ta classe il va appeler automatiquement le setter qui va bien. Donc pas besoin de constructeur autre que celui par défaut. La section invokables c'est pour l'instanciation simple la partie factories c'est pour fabriquer une instance d'une de ta classe de façon complexe. Cf l'exemple ci-dessus.

Hanyas a écrit:

Normalement le serviceLocator s'initialise automatiquement ? mon problème viens donc d'autre par non ?

Comment tu récupères ton adapter ?

Enfin je t'invite à lire cette section de la doc officielle : http://framework.zend.com/manual/2.2/en … intro.html et le lien que j'ai mi au dessus je l'ai survolé mais il a l'air assez clair et aborde la plus part des sujets que je t'ai expliqué.

Hors ligne

 

#13 24-05-2013 14:26:29

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

Re: [Erreur] Quand les services sont là

Mon adaptateur est récupéré par la librairie que j'ai récupéré, elle se passe en plusieurs étapes.

Quand l'utilisateur n'est pas connecté on arrive ici

Code:

[lang=php]
class UserController extends AbstractActionController {
 public function loginAction() {
        $form = new LoginForm();
        $form->setInputFilter(new LoginFilter());

        $request = $this->getRequest();
        $errorMessage = '';

        if ($request->isPost()) {
            $form->setData($this->getRequest()->getPost());
            if ($form->isValid()) {
                $uAuth = $this->userAuthentication();
                $authAdapter = $uAuth->getAuthAdapter();
                
                $data = $form->getData();
                
                $authAdapter->setIdentity($data['email']);
                $authAdapter->setCredential($data['password']);
                $auth = $uAuth->getAuthService()->authenticate($authAdapter);
                
                if ($auth->isValid()) {
                    return $this->redirect()->toRoute('user');
                } else {
                    $errorMessage = $auth->getMessages();
                    $errorMessage = $errorMessage['invalid'];
                }
            }
        }

        return array('form' => $form, 'errorMessage' => $errorMessage);
    }
}

le morceau de code suivant, récupère l'adaptateur ce trouvant dans le plugin UserAuthentication.

Code:

[lang=php]
$uAuth = $this->userAuthentication();
                $authAdapter = $uAuth->getAuthAdapter();

Code:

[lang=php]
class UserAuthentication extends AbstractPlugin {
/**
     * Sets Auth Adapter
     *
     * @param \Zend\Authentication\Adapter\DbTable $authAdapter
     * @return UserAuthentication
     */
    public function setAuthAdapter(AuthAdapter $authAdapter) {
        $this->_authAdapter = $authAdapter;

        return $this;
    }

    /**
     * Returns Auth Adapter
     *
     * @return \Zend\Authentication\Adapter\DbTable
     */
    public function getAuthAdapter() {
        if ($this->_authAdapter === null) {
            $this->setAuthAdapter(new AuthAdapter());
        }

        return $this->_authAdapter;
    }
}

Hors ligne

 

#14 24-05-2013 14:36:31

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Erreur] Quand les services sont là

Ok et il n'y a pas un truc qui te choque ?
$this->setAuthAdapter(new AuthAdapter());

Donc en gros tu créés une entrée dans le service manager pour qu'il se charge d'instancier ta classe et tu l'instancies manuellement donc forcément utiliser ServiceLocatorAwareInterface n'a aucun sens dans ce cas là.

Hors ligne

 

#15 24-05-2013 15:04:24

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

Re: [Erreur] Quand les services sont là

Pour résumer.

Etape 1 : Initialiser les configurations pour recevoir les services

Code:

[lang=php]
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class Adapter implements AdapterInterface,ServiceLocatorAwareInterface {

    protected $services;
    
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->services = $serviceLocator;
    }
    
    public function getServiceLocator()
    {
        return $this->services;
    }
}

Etape 2 : Ajouter la classe dans la configuration pour la changer avec les services

Code:

[lang=php]
'invokables' => array(
                'User\Auth\Adapter' => 'User\Auth\Adapter',
            ),

Etape 3 : Appeler la class avec le service manager


PS: si je passe à Caen laisse moi te payer des bières ^^ (j'ai du t'en faire baver, désoler)


Edition :

Bon j'abandonne pour le moment ... je n'ai pas encore le niveau pour modifier le code ZF2 de quelqu'un d'autre.

Je vous tiens au courant quand même, j'ai donc modifié ma class UserAuthentication pour qu'elle puisse utilisé  $this->getServiceLocator() et appeler ma class grâce à  $this->setAuthAdapter($sm->get('AuthAdapter'));

Code:

[lang=php]
<?php
/**
 * File for UserAuthentication Class
 *
 * @category   User
 * @package    User_Controller
 * @subpackage User_Controller_Plugin
 * @author     Marco Neumann <webcoder_at_binware_dot_org>
 * @copyright  Copyright (c) 2011, Marco Neumann
 * @license    http://binware.org/license/index/type:new-bsd New BSD License
 */
/**
 * @namespace
 */

namespace User\Controller\Plugin;

/**
 * @uses Zend\Mvc\Controller\Plugin\AbstractPlugin
 * @uses Zend\Authentication\AuthenticationService
 * @uses Zend\Authentication\Adapter\DbTable
 */
use Zend\Mvc\Controller\Plugin\AbstractPlugin,
    Zend\Authentication\AuthenticationService,
    User\Auth\Adapter as AuthAdapter;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

/**
 * Class for User Authentication
 *
 * Handles Auth Adapter and Auth Service to check Identity
 *
 * @category   User
 * @package    User_Controller
 * @subpackage User_Controller_Plugin
 * @copyright  Copyright (c) 2011, Marco Neumann
 * @license    http://binware.org/license/index/type:new-bsd New BSD License
 */
class UserAuthentication extends AbstractPlugin implements ServiceLocatorAwareInterface{

    protected $services;
    
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->services = $serviceLocator;
    }
    
    public function getServiceLocator()
    {
        return $this->services;
    }
    
    /**
     * @var AuthAdapter
     */
    protected $_authAdapter = null;

    /**
     * @var AuthenticationService
     */
    protected $_authService = null;

    /**
     * Check if Identity is present
     *
     * @return bool
     */
    public function hasIdentity() {
        return $this->getAuthService()->hasIdentity();
    }

    /**
     * Return current Identity
     *
     * @return mixed|null
     */
    public function getIdentity() {
        return $this->getAuthService()->getIdentity();
    }

    /**
     * Clear user authentication 
     * @return void 
     */
    public function clearIdentity() {
        return $this->getAuthService()->clearIdentity();
    }

    /**
     * Sets Auth Adapter
     *
     * @param \Zend\Authentication\Adapter\DbTable $authAdapter
     * @return UserAuthentication
     */
    public function setAuthAdapter(AuthAdapter $authAdapter) {
        $this->_authAdapter = $authAdapter;

        return $this;
    }

    /**
     * Returns Auth Adapter
     *
     * @return \Zend\Authentication\Adapter\DbTable
     */
    public function getAuthAdapter() {
        if ($this->_authAdapter === null) {
            //$this->setAuthAdapter(new AuthAdapter());    
            $sm =  $this->getServiceLocator();
            $this->setAuthAdapter($sm->get('AuthAdapter'));
        }

        return $this->_authAdapter;
    }

    /**
     * Sets Auth Service
     *
     * @param \Zend\Authentication\AuthenticationService $authService
     * @return UserAuthentication
     */
    public function setAuthService(AuthenticationService $authService) {
        $this->_authService = $authService;

        return $this;
    }

    /**
     * Gets Auth Service
     *
     * @return \Zend\Authentication\AuthenticationService
     */
    public function getAuthService() {
        if ($this->_authService === null) {
            $this->setAuthService(new AuthenticationService());
        }

        return $this->_authService;
    }

}

Mais je me retrouve avec cette erreur :

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

Pourtant, dans elle est bien définie dans le getServiceConfig().

Enfin je vais clore le sujet ... mais je n'abandonne pas, je reviendrais

Merci Orkin, j'ai beaucoup appris sur les services, même si je n'arrive pas encore à les maitriser

Dernière modification par Hanyas (24-05-2013 17:20:18)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages