不推荐使用:ServiceLocatorAwareInterface已弃用,将在3.0版中与ServiceLocatorAwareInitializer

时间:2016-08-03 08:26:22

标签: zend-framework zend-framework2

使用服务管理器时,我收到以下错误消息。 我怎样才能通过不同的方法解决这个问题,比如建构......

  

不推荐使用:您正在从中检索服务定位器   class Users \ Controller \ LoginController。请注意   不推荐使用ServiceLocatorAwareInterface,将其删除   版本3.0,以及ServiceLocatorAwareInitializer。你会   需要更新您的类以接受创建时的所有依赖项,   通过构造函数参数或setter,并使用工厂   进行注射。在   C:\ wamp64 \ WWW \ ZendSkeletonApplication主\厂商\ zendframework \ Zend的-MVC \ SRC \控制器\ AbstractController.php   在第258行

我在module.php中添加了以下代码

public function getServiceConfig() {
        return array(
            'abstract_factories' => array(),
            'aliases' => array(),
            'factories' => array(
                // FORMS
                'LoginForm' => function ($sm) {
                    $form = new \Users\Form\LoginForm();
                    $form->setInputFilter($sm->get('LoginFilter'));
                    return $form;
                },
            )
        )
}

并从登录控制器,我在代码

下调用的索引操作
$form = $this->getServiceLocator()->get('LoginForm');
$viewModel = new ViewModel(array('form' => $form));
return $viewModel;

非常感谢任何帮助。

目前我正在使用Zend framework 2.5.1 Version 在Zend框架2.3版本中它运行良好。

更新

现在我在我的控制器中使用下面的代码

 // Add this property:
    private $table;

    // Add this constructor:
    public function __construct(LoginForm $table) {
        $this->table = $table;
    }

并在module.php中

 // FORMS
                Model\AlbumTable::class => function ($sm) {
                    $form = new \Users\Form\LoginForm();
                    $form->setInputFilter($sm->get('LoginFilter'));
                    return Model\AlbumTable;
                },

但我仍然低于错误

  

可捕获的致命错误:参数1传递给   Users \ Controller \ LoginController :: __ construct()必须是。的实例   用户\ Form \ LoginForm,没有给出,调用   C:\ wamp64 \ WWW \ ZendSkeletonApplication主\厂商\ zendframework \ Zend的-的ServiceManager \ SRC \ AbstractPluginManager.php   在第252行并在中定义   C:\ wamp64 \ WWW \ ZendSkeletonApplication主\模块\用户\ SRC \用户\控制器\ LoginController.php   在第22行

2 个答案:

答案 0 :(得分:0)

在ZF2中使用serviceLocator存在很多问题,Zend tech通过从框架中删除serviceLocatorAware并从控制器中删除serviceManager来做得很好。

为什么?

仅仅因为一些入门和经验丰富的开发人员以丑陋的方式使用它,而且太过分了。

从我的角度来看,serviceLocator只能用于工厂。

这就是为什么我一直建议其他开发人员创建工厂,而不使用匿名功能。

这里是控制器工厂的示例(与服务工厂不同):https://github.com/Grafikart/BlogMVC/blob/master/ZendFramework2/module/Blog/src/Blog/Factory/PostControllerFactory.php

及其配置行https://github.com/Grafikart/BlogMVC/blob/master/ZendFramework2/module/Blog/config/module.config.controllers.php#L8

这是服务工厂

<?php
namespace Blog\Factory;
use Blog\Service\CategoryService;
use Doctrine\Common\Persistence\ObjectManager;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class CategoryServiceFactory implements FactoryInterface
{
    /**
     * @param  ServiceLocatorInterface $serviceLocator
     * @return CategoryService
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        /** @var ObjectManager $em */
        $em = $serviceLocator->get('orm_em');
        return new CategoryService($em);
    }
}

您可以为几乎所有组件(甚至是组件)创建工厂,您只需要在配置中将这些组件声明为:

您可以通过以下方式替换关键字form_elements:

  • 控制器
  • service_manager
  • view_helpers
  • 验证

它的工作方式相同:

'form_elements'   => array( 
        'factories' => array(
            'Application\Item\Form\Fieldset\ProfileFieldset' =>
                'Application\Item\Factory\ProfileFieldsetFactory',
        ),
        'invokables' => array(
            'EntityForm'   => 'Application\Entities\Form\EntityForm',
            'PropertyForm' => 'Application\Item\Form\PropertyForm',
            'ProfileForm'  => 'Application\Item\Form\ProfileForm',
        ),
        'initializers' => array(
            'ObjectManagerInitializer' => 'Application\Initializers\ObjectManagerInitializer',
        ),
    ),

您的上一个错误意味着您的控制器没有正确实例化,您没有提供LoginForm实例,可能是因为您没有创建工厂?您的控制器是否被声明为invokables?

答案 1 :(得分:0)

有关弃用ServiceLocatorAwareInterface的深入讨论,请阅读Matthew Weier O'Phinney撰写的this article。基本上,你应该通过简单的setter通过Hooli之前提到的工厂注入它们来避免控制器中的隐藏依赖。