Zend framework 已弃用:ServiceLocatorAwareInterface已弃用,将在版本3.0中与ServiceLocatorAwareInitializer一起删除

Zend framework 已弃用:ServiceLocatorAwareInterface已弃用,将在版本3.0中与ServiceLocatorAwareInitializer一起删除,zend-framework,zend-framework2,Zend Framework,Zend Framework2,我在使用服务管理器时收到以下错误消息。 我如何通过不同的方法解决这个问题,比如construct 不推荐:您正在从中检索服务定位器 类用户\控制器\登录控制器。请注意 ServiceLocatorAwareInterface已弃用,将在中删除 版本3.0,以及ServiceLocatorAwareInitializer。你会 需要更新类以在创建时接受所有依赖项, 通过构造函数参数或setter,并使用工厂 进行注射。在里面 C:\wamp64\www\zendskletonapplication

我在使用服务管理器时收到以下错误消息。 我如何通过不同的方法解决这个问题,比如construct

不推荐:您正在从中检索服务定位器 类用户\控制器\登录控制器。请注意 ServiceLocatorAwareInterface已弃用,将在中删除 版本3.0,以及ServiceLocatorAwareInitializer。你会 需要更新类以在创建时接受所有依赖项, 通过构造函数参数或setter,并使用工厂 进行注射。在里面 C:\wamp64\www\zendskletonapplication master\vendor\zendframework\zend mvc\src\Controller\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版本 在Zend framework 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::\uu construct()必须是的实例 Users\Form\LoginForm,未给定,已调用 C:\wamp64\www\zendskletonapplication master\vendor\zendframework\zend servicemanager\src\AbstractPluginManager.php 第252行,并在中定义 C:\wamp64\www\zendskletonapplication master\module\Users\src\Users\Controller\LoginController.php 第22行


在ZF2中使用serviceLocator时存在很多问题,Zend tech通过从框架中删除serviceLocatorAware和从控制器中删除serviceManager做了大量工作

为什么?

只是因为一些入门级和有经验的开发人员以一种丑陋的方式使用它,而且使用得太多了

在我看来,serviceLocator只能在工厂中使用

这就是为什么我一直建议其他开发人员在不使用匿名函数的情况下创建工厂

这里是控制器工厂的示例(与服务工厂不同):

和它的配置行

这里是一家服务工厂

<?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);
    }
}

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

有关弃用ServiceLocatorAwareInterface的深入讨论,请阅读Matthew Weier O'Phinney的文章。基本上,您应该避免控制器中隐藏的依赖项,只需像前面提到的那样通过工厂将它们注入setter即可。

问题是什么?你想知道弃用是什么意思吗?您想知道如何停止出现错误消息吗?您想知道改用什么吗?我在使用service manager时收到上面的错误消息。我如何通过不同的方法解决这个问题,比如构造…按照消息中的说明进行操作。看看这个,10秒后谷歌找到了我。如果这就是你所需要的,删除这个问题,因为它显然是一个重复的我已经通过了url,但无法编写代码它仍然可以正常工作,直到你升级到ZF3,你没有阅读我给你的任何链接吗
'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',
        ),
    ),