如何更新 getServicelocator 到 zend 3
How to update getServicelocator to zend 3
我是 zend3 的新手,我遇到了一个问题,版本 3 中不再存在 getservicelocator,我正在使用控制器,我想知道如何实现此迁移,任何人都知道如何制作这个变化
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));
}
您的架构不是很好,为什么要在抽象控制器中执行操作...
正确的做法是控制器不要抽象,通过构造函数传递服务。
错误的方法是使用a delegator注入服务定位器。
删除服务定位器的想法是让 class 的依赖关系更加清晰,因此代码更具可读性(如 "oh, I see this class needs ... and ... to do NAME_OF_THE_ACTION")。
此外,它极大地提高了代码的可测试性(你知道 mock/fake 的依赖性)。
我是 zend3 的新手,我遇到了一个问题,版本 3 中不再存在 getservicelocator,我正在使用控制器,我想知道如何实现此迁移,任何人都知道如何制作这个变化
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));
}
您的架构不是很好,为什么要在抽象控制器中执行操作...
正确的做法是控制器不要抽象,通过构造函数传递服务。
错误的方法是使用a delegator注入服务定位器。
删除服务定位器的想法是让 class 的依赖关系更加清晰,因此代码更具可读性(如 "oh, I see this class needs ... and ... to do NAME_OF_THE_ACTION")。 此外,它极大地提高了代码的可测试性(你知道 mock/fake 的依赖性)。