使用服务管理器时,我收到以下错误消息。 我怎样才能通过不同的方法解决这个问题,比如建构......
不推荐使用:您正在从中检索服务定位器 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行
答案 0 :(得分:0)
在ZF2中使用serviceLocator存在很多问题,Zend tech通过从框架中删除serviceLocatorAware并从控制器中删除serviceManager来做得很好。
为什么?
仅仅因为一些入门和经验丰富的开发人员以丑陋的方式使用它,而且太过分了。
从我的角度来看,serviceLocator只能用于工厂。
这就是为什么我一直建议其他开发人员创建工厂,而不使用匿名功能。
这里是控制器工厂的示例(与服务工厂不同):https://github.com/Grafikart/BlogMVC/blob/master/ZendFramework2/module/Blog/src/Blog/Factory/PostControllerFactory.php
这是服务工厂
<?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:
它的工作方式相同:
'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之前提到的工厂注入它们来避免控制器中的隐藏依赖。