gpt4 book ai didi

zend-framework2 - zf2 : how to get service manager in mapper

转载 作者:行者123 更新时间:2023-12-04 07:01:11 24 4
gpt4 key购买 nike

在 Zend Framework 1 中,我有几个映射器,它们从父 Mapper 类继承了 setDbTable 和 getDbTable。

现在在 ZF2 中面临的问题是我需要模型中的服务管理器,但我不知道如何获得它:

    class Mapper
{
protected $tableGateway;
protected $module = 'application';

public function setTableGateway($table)
{
if (is_string($table)) {
$class = $this->module . '\Model\DbTable\\' . ucfirst($table);
$sm = $this->getServiceLocator(); <= Fatal error: Call to undefined method Mapper::getServiceLocator()
$tableGateway = (class_exists($class)) ? $sm->get($class) : $sm->get(new TableGateway($table));
} else {
$tableGateway = $table;
}

if (!$tableGateway instanceof Zend\Db\TableGateway\AbstractTableGateway) {
throw new \Exception('Invalid table data gateway provided');
}
$this->tableGateway = $tableGateway;
return $this;
}

// more code

该行:
$sm = $this->getServiceLocator();

给出一个 fatal error :
Call to undefined method Application\Model\Mapper\Doc::getServiceLocator()

如何在我的模型中获取服务管理器?还是我不是按照 ZF2 的方式做事?我知道如何在我的 Controller 中获取服务管理器并将 tableGateway 传递给映射器,但这对我来说似乎有很多重复的代码。

最佳答案

首先,我认为您的意思是要从映射器类而不是模型访问服务管理器。我会避免做后者。有关更多详细信息,请参阅我对 Raj 回答的评论。

其次,有很多方法可以解决这个问题。在这个答案中,我将为您提供一种方法的示例,并仅提及另一种方法。

看着service manager's documentation (向下滚动一点),它声明默认初始值设定项被添加为默认值。此初始化程序检查从服务管理器检索的对象是否实现 Zend\ServiceManager\ServiceLocatorAwareInterface .如果是,则将服务管理器注入(inject)到对象中。因此,如果您只是在映射器类中实现接口(interface),这可能会自动发生。您可以使用抽象基类来避免为每个映射器类重写它。也许像下面这样。

基本映射器类:

namespace User\Mapper;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class AbstractMapper implements ServiceLocatorAwareInterface {
protected $service_manager;

public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->service_manager = $serviceLocator;
}

public function getServiceLocator()
{
return $this->service_manager;
}
}

映射器类:
namespace User\Mapper;

use User\Mapper\AbstractMapper;

class UserMapper extends AbstractMapper {
public function doSomething() {
$sm = $this->getServiceLocator();
$sm->get('something');
}
}

由于服务管理器是在初始化程序运行时注入(inject)的,因此应该从服务管理器中检索映射器。如果您不想/必须将任何东西注入(inject)您的映射器类,那么一个可调用的就足够了。它们可以添加到 invokables 下键,嵌套在 service_manager 下键入 module_name/config/module.config.php .或者,可以在模块类中配置' getServiceConfig方法。但是,您的映射器类现在或将来很可能会有一些依赖项,因此您可能希望使用工厂来代替。这样,您可以让服务管理器将表网关注入(inject)映射器类。
// Remember to include the appropriate namespaces
return array(
'factories' => array(
'User\Mapper\UserMapper' => function($service_manager) {
$table_gateway = $service_manager->get('User\Model\DbTable\UserGateway');
return new UserMapper($table_gateway);
},
),
);

以上可以添加到 getServiceConfig模块的 Module.php 中的方法文件 - 或添加 factories service_manager 中的键键入 module_name/config/module.config.php .您仍然需要添加一个创建数据库网关的工厂;以上只是一个例子。

这就是我将如何去做。当然,可以简单地在映射器类中为服务管理器提供一个 getter 和 setter 方法,然后从 Controller 访问它们( Controller 有一个 getServiceLocator 方法)并像这样注入(inject)它。不过,我自己不会采用这种方法。

关于zend-framework2 - zf2 : how to get service manager in mapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14021870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com