如果您只是想保存代码,Steve Griffiths 的答案应该可以工作。如果您想将此扩展为您的动作控制器的更通用的依赖注入,那么我会将您的控制器实现为工厂而不是可调用对象。但是,如果您只是想用数据填充 ViewModel,那么这种灵活性可能会过大。例如,在您的 module.config.php 文件中,您可以添加如下内容:
'controllers' => array(
'factories' => array(
'FooModule\Controller\FooController' => 'FooModule\Service\FooControllerFactory',
),
),
然后,当您通过 ZF2 的 MVC 路由在应用程序代码中调用控制器时,将使用您放在该工厂类中的任何实例化代码来调用它。其代码可能如下所示,具体取决于您要实例化它的依赖项。
<?php
namespace FooModule\Service;
use FooModule\Controller\FooController; // actual controller code
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\View\Model\ViewModel;
class FooControllerFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $controllers)
{
$services = $controllers->getServiceLocator();
$fooBar = $services->get('foo_bar_service'); // a service you registered already in the service manager
$view = new ViewModel();
$controller = new FooController();
$controller->setAuthService($authService);
return $controller;
}
}
因此,您可以从控制器中访问 $fooBar 服务,而无需任何额外的 DI,如下所示:
<?php
namespace FooModule\Controller;
use Zend\Authentication\FooBarService;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class FooController extends AbstractActionController
{
protected $fooBar; // already injected by your factory
protected $view; // ViewModel object also injected by your factory
public function indexAction()
{
$result = $this->fooBar->doSomething();
$this->view->setVariable('name', $result);
return $this->view;
}
}
同样,可能有点矫枉过正,但我想推荐它,以防更灵活的依赖注入与您的用例相关。