如何更新 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 的依赖性)。