2017-04-02 60 views
0

我是zend3的新手,遇到問題,版本3中不再存在getservicelocator,我正在使用控制器,我想知道如何實現此遷移,任何人都知道如何使這種變化如何將getServicelocator更新爲zend 3

namespace Base\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 
use Zend\Paginator\Paginator; 
use Zend\Paginator\Adapter\ArrayAdapter; 

abstract class AbstractController extends AbstractActionController 
{ 

    /** 
    * Entity manager 
    * @var 
    */ 
    protected $em; 
    /** Entity 
    * @var 
    */ 
    protected $entity; 
    /** 
    * Controller 
    * @var 
    */ 
    protected $controller; 
    /** 
    * @var 
    */ 
    protected $route; 
    /** 
    * @var 
    */ 
    protected $service; 
    /** 
    * @var 
    */ 
    protected $form; 

    private $configTable; 
    /** 
    * AbstractController constructor. 
    */ 
    abstract function __construct(); 
... 
/** 
    * 
    * @return \Zend\Http\Response 
    */ 
    public function excluirAction() 
    { 
     $service = $this->getServiceLocator()->get($this->service); 
     $id = $this->params()->fromRoute('id',0); 
     // Abstract service 
     if ($service->remove(array('id' => $id))) { 
      $this->flashMessenger()->addSuccessMessage('Success'); 
     } else { 
      $this->flashMessenger()->addErrorMessage('Error'); 
     } 

     return $this->redirect()->toRoute($this->route, array('controller' => $this->controller)); 

    } 

回答

1

架構是不是在你的情況真的很不錯,你爲什麼會在一個抽象的控制器的動作......

正確的方法將是控制器不抽象並通過構造函數傳遞服務。

錯誤的方法是使用a delegator注入服務定位器。

刪除服務定位器的想法是在類的依賴關係上更清晰,所以代碼更可讀性(例如「哦,我看到這個類需要...和...做NAME_OF_THE_ACTION「)。 此外,它極大地提高了代碼的可測試性(您知道模擬/假冒的依賴關係)。