1

我一直在学习 ZF2 教程,并且正在尝试重新编写 Controller 中的 indexAction 方法,因此我不需要每次都创建一个新的 ViewModel 对象。

我使用以下代码向模块添加了一个 onBootstrap 方法:

    $di = new \Zend\Di\Di;
    $di->instanceManager()->setParameters('Album\ViewModel', array('albums' => $config-     >albums));

我将 indexAction 方法更改为:

    return $di->get('Album\ViewModel');

谁能告诉我哪里出了问题或者我应该做什么?

4

2 回答 2

1

您可以从控制器中的 Actions 返回一个数组,ZF2 将围绕它自己创建一个 ViewModel。不太确定那是你所追求的,但它可能是。

于 2012-09-26T17:14:24.760 回答
1

如果您只是想保存代码,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;
    }
}

同样,可能有点矫枉过正,但我​​想推荐它,以防更灵活的依赖注入与您的用例相关。

于 2012-09-28T00:41:06.283 回答