2013-07-03 2 views
7

Я пробовал некоторые идеи из других сообщений и примеров, но у меня все еще нет решения. Я не могу получить servicelocator в моей модели.zf2: как получить Service Locator в модели

мой module.php содержит следующий завод в функции getServiceConfig():

'Backend\Model\Beuser' => function($sm){ 
        $serviceLocator = $sm->getServiceLocator(); 
        return new \Backend\Model\Beuser($serviceLocator); 
       }, 

моя модель Beuser.php выглядит следующим образом:

namespace Backend\Model; 

use Zend\InputFilter\Factory as InputFactory; 
use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilterInterface; 


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

class Beuser implements ServiceLocatorAwareInterface 
{ 

    public $idx_be_user; 
    public $be_user_email; 
    public $be_user_password; 
    public $be_user_firstname; 
    public $be_user_lastname; 
    public $be_user_phone; 
    public $be_user_photo; 
    public $be_user_shorttext; 

    protected $inputFilter;  

    protected $serviceLocator; 

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

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

    public function exchangeArray($data) 
    { 

     $this->idx_be_user   = (!empty($data['idx_be_user'])) ? $data['idx_be_user'] : null; 
     $this->be_user_email  = (!empty($data['be_user_email'])) ? $data['be_user_email'] : null; 
     $this->be_user_password = (!empty($data['be_user_password'])) ? $data['be_user_password'] : null; 
     $this->be_user_firstname = (!empty($data['be_user_firstname'])) ? $data['be_user_firstname'] : null; 
     $this->be_user_lastname = (!empty($data['be_user_lastname'])) ? $data['be_user_lastname'] : null; 
     $this->be_user_phone  = (!empty($data['be_user_phone'])) ? $data['be_user_phone'] : null; 
     $this->be_user_photo  = (!empty($data['be_user_photo'])) ? $data['be_user_photo'] : null; 
     $this->be_user_shorttext = (!empty($data['be_user_shorttext'])) ? $data['be_user_shorttext'] : null; 

    } 

    public function getArrayCopy() 
    { 
     return get_object_vars($this); 
    } 

    public function setInputFilter(InputFilterInterface $inputFilter) 
    { 
     throw new \Exception("Not used"); 
    } 

    public function getInputFilter() 
    { 

     var_dump($this->getServiceLocator()); 
     die(); 
     if (!$this->inputFilter) { 
      $inputFilter = new InputFilter(); 
      $factory  = new InputFactory(); 

      $inputFilter->add($factory->createInput(array(
       'name'  => 'idx_be_user', 
       'required' => true, 
       'filters' => array(
        array('name' => 'Int'), 
       ), 
      ))); 

      $inputFilter->add($factory->createInput(array(
       'name'  => 'be_user_email', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min'  => 1, 
          'max'  => 100, 
         ), 
        ), 
         /* 
          array(
           'name' => 'Db\NoRecordExists', 
           'options' => array(
            'table'  => 'users', 
             'field'  => 'email', 
          //  'adapter' => $this->getServiceLocator()->get('dbAdapter'), 
          ), 
         ), 
          */ 

       ), 
      ))); 

      $inputFilter->add($factory->createInput(array(
       'name'  => 'be_user_password', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min'  => 6, 
          'max'  => 100, 
         ), 
        ), 
       ), 
      ))); 

      $inputFilter->add($factory->createInput(array(
       'name'  => 'be_user_firstname', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min'  => 1, 
          'max'  => 100, 
         ), 
        ), 
       ), 
      ))); 

      $inputFilter->add($factory->createInput(array(
       'name'  => 'be_user_lastname', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min'  => 1, 
          'max'  => 100, 
         ), 
        ), 
       ), 
      ))); 

      $inputFilter->add($factory->createInput(array(
       'name'  => 'be_user_phone', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min'  => 1, 
          'max'  => 100, 
         ), 
        ), 
       ), 
      ))); 


       $inputFilter->add(
       $factory->createInput(array(
        'name'  => 'be_user_photo', 
        'required' => false, 
       )) 
      ); 


      $inputFilter->add($factory->createInput(array(
       'name'  => 'be_user_shorttext', 
       'required' => false, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min'  => 5, 
          'max'  => 255, 
         ), 
        ), 
       ), 
      ))); 

      $this->inputFilter = $inputFilter; 
     } 

     return $this->inputFilter; 
    } 

} 

Но var_dump($this->getServiceLocator()); возвращает NULL. То будет reasion почему любой вызов $this->getServiceLocator()->get('something') создает PHP Fatal error: Call to a member function get()[...]

Не могли бы вы помочь мне найти проблему?

PS: Я также попытался следующими фабриками:

'Backend\Model\Beuser' => function($sm){ 
     $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
     $beuser = new \Backend\Model\Beuser(); 
     $beuser->setDbAdapter($dbAdapter); 
     return $beuser; 
    }, 

мой module.php:

namespace Backend; 

use Zend\Db\ResultSet\ResultSet; 
use Zend\Db\TableGateway\TableGateway; 
use Zend\ModuleManager\Feature\AutoloaderProviderInterface; 
use Zend\Authentication\Storage; 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\Authentication\AuthenticationService; 
use Zend\Authentication\Adapter\DbTable as AuthAdapter; 
use Zend\Authentication\Result as Result; 
use Zend\Session\Container; // We need this when using sessions 

//Be User 
use Backend\Model\Beuser; 
use Backend\Model\BeuserTable; 


class Module implements AutoloaderProviderInterface 
{ 

    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\ClassMapAutoloader' => array(
       __DIR__ . '/autoload_classmap.php' 
      ), 
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 

    public function getConfig() 
    { 
    return include __DIR__ . '/config/module.config.php'; 
    } 

    public function getServiceConfig() 
    { 
     return array(

       //factories 
      'factories'=>array(

        //Storage 
        'BackendStorage' => function($sm){ 
         return new BackendStorage('backend'); 
        },     
        //DB Adapter 
        'dbAdapter' => function($sm) {   
         $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');      
         return $dbAdapter;      
       },        
        //nur DB 
        'db' => function($sm) { 
         $dba= $sm->get('dbAdapter'); 
         $db = new db\Db($dba); 
         return $db; 
        },     
        //mache Auth Info verfuegbar        
        'AuthService' => function($sm) {  
         //$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');            
         $dbTableAuthAdapter = new AuthAdapter($sm->get('dbAdapter'),'tbl_be_user','be_user_email','be_user_password', 'MD5(?)');    
         //$authService = new AuthenticationService();    
         $authService = new AuthenticationService(new Storage\Session('Auth_Backend')); 
         $authService->setAdapter($dbTableAuthAdapter); 
         return $authService;      

        }, 
        //Navigation 
        'NavigationFactory' => 'Backend\Service\NavigationFactory', 

        // Backend User  
        'Backend\Model\BeuserTable' => function($sm) { 
        $tableGateway = $sm->get('BeuserTableGateway'); 
        $table = new BeuserTable($tableGateway); 
        return $table; 
       },        
       'BeuserTableGateway' => function ($sm) { 
        $dbAdapter = $sm->get('dbAdapter'); 
        $resultSetPrototype = new ResultSet(); 
        $resultSetPrototype->setArrayObjectPrototype(new Beuser()); 
        return new TableGateway('tbl_be_user', $dbAdapter, null, $resultSetPrototype); 
       }, 

        'Backend\Model\Beuser' => function($sm){ 
         $model = new \Backend\Model\Beuser(); 
         $model->setServiceLocator($sm); 

         return $model; 
        }, 

      ), 



     );     

    } 

    public function getViewHelperConfig() 
    { 
     return array(
      'invokables' => array(
       'PageTitle' => 'Backend\ViewHelper\PageTitle', 
      ), 
      'factories' => array(
       //hasIdentity true or false 
       'AuthStatusFactory' => function ($serviceManager) { 
         // Get the service locator 
       $serviceLocator = $serviceManager->getServiceLocator(); 
       // pass it to your helper 
       return new \Backend\ViewHelper\AuthStatusFactory($serviceLocator); 
      }, 
       'BeUserName' => function ($serviceManager) { 
         // Get the service locator 
       $serviceLocator = $serviceManager->getServiceLocator(); 
       // pass it to your helper 
       return new \Backend\ViewHelper\BeUserName($serviceLocator); 
      }, 
      ) 
     ); 
    } 


} 

ответ

7

Вы передаете его через долю не существующий конструктор ... просто использовать сеттер. Service Manager реализует ServiceLocatorInterface, просто передайте его в вашу модель.

Изменения конфигурации службы:

'Backend\Model\Beuser' => function($sm){ 
    $model = new \Backend\Model\Beuser(); 
    $model->setServiceLocator($sm); 

    return $model; 
}, 

Пример доступ в контроллере:

public function testAction() 
{ 
    // The service manager will then inject itself into your model 
    // when it is instantiated. 
    $myModel = $this->getServiceLocator()->get('Backend\Model\Beuser'); 

    // now you have the Service Locator injecte4d into your model .. 
    //var_dump($myModel->getServiceLocator()); 
} 

Вы также должны убедиться, что использование локатора службы, чтобы получить какие-либо экземпляры вам нужно созданные модели, в противном случае ничего будет введено:

'BeuserTableGateway' => function ($sm) { 
    $dbAdapter = $sm->get('dbAdapter'); 
    $resultSetPrototype = new ResultSet(); 
    // Beuser will not have the service locator injected below.. 
    // and will return null if the object wasn't created via the service manager. 
    //$resultSetPrototype->setArrayObjectPrototype(clone $sm->get('Backend\Model\Beuser')); 
    $resultSetPrototype->setArrayObjectPrototype(new Beuser()); 

    return new TableGateway('tbl_be_user', $dbAdapter, null, $resultSetPrototype); 
}, 
+0

Я изменил свой завод в сервисный конфигурации к вашему предложение, но var_dump ($ this-> getServiceLocator()); возвращает еще NULL. Кажется, я не полностью понял инъекцию ...: -/ – christiana83

+0

, где и как вы овладеваете своей моделью, чтобы сделать var_dump? отправьте код, пожалуйста? вы используете локатор службы, чтобы получить модель для вас? – Andrew

+0

Я хочу использовать сервис-локатор в моей модели, да ... его, потому что мне нужен адаптер для проверки: – christiana83

0

Спасибо Эндрю - ваши ответы были шо wn меня правильный путь :-) Я решил свою проблему. Я забыл получить модель альбома в контроллере ServiceLocator.

Контроллер:

public function addAction(){ 
    [...] 
    //Adapter an Beuser Model uebergeben 
    $beuser->setDbAdapter($this->getServiceLocator()->get('dbAdapter')); 
    [...] 
} 

public function editAction(){ 
    [...] 
    //Adapter an Beuser Model uebergeben 
    $beuser->setDbAdapter($this->getServiceLocator()->get('dbAdapter')); 
    [...] 
} 

Модель:

private $adapter; 

public function setDbAdapter($dbAdapter) { 
    $this->adapter = $dbAdapter; 
} 

public function getDbAdapter() { 
    return $this->adapter;  
} 

И теперь я могу назвать адаптер в модели таким образом

$this->getDbAdapter(); 
Смежные вопросы