gpt4 book ai didi

php - ZendFramework 2.0.0beta4 服务管理器配置-子键区别

转载 作者:行者123 更新时间:2023-12-03 23:30:11 24 4
gpt4 key购买 nike

编辑: 在我发布这个问题几周后,Evan Coury 写了一篇关于 ZF2 ServiceManager 主题的优秀博客文章,我从中找到了问题的最佳答案:http://blog.evan.pro/introduction-to-the-zend-framework-2-servicemanager

--

我正在使用 ZendFramework 2.0.0beta4 开发一个项目,但在使用 Zend\ServiceManager 处理依赖项时遇到了问题。这是当前的 ZF2 ServiceManager documentation

它列出了在向 ServiceManager 注册类以用于我们的模块时使用的 6 个子键:abstract_factoriesaliasesfactories可调用服务共享。如果我只想注册一个模型类,我将在我的 Controller 中使用它从数据库中提取数据,哪个最好?我特别尝试改编来自 ZF2 Skeleton Application 的示例下面展示了我自己的应用程序(DashboardTable 是一个模型),这个例子使用了工厂方式。

public function getServiceConfiguration()
{
return array(
'factories' => array(
'album-table' => function($sm) {
$dbAdapter = $sm->get('db-adapter');
$table = new DashboardTable($dbAdapter);
return $table;
},
'test-model' => Dashboard\Model\TestModel(),
),
);
}

但是,在我的 SkeletonApplication 的单独工作示例中,我不知道“db-adapter”如何进入 ServiceManager ($sm) - 它与自动加载的 global.php 配置文件中的条目有关有一个包含数据库信息的“db”条目。因为我不知道它是如何从配置文件到 ServiceManager 的,所以我在下面创建了一个简单的条目,以将问题减少到它的基本组件——“测试模型”。当我注释掉“仪表板表”条目并从我的 Controller 中的 TestModel 调用一个函数时,它只输出一些文本。下面是我的 Module.php 中的 ServiceManager 配置

<?php

namespace Dashboard\Model;

class TestModel {

public function testMethod()
{
$testResult = "Hello";
return $testResult;
}

}

然后从我的 Controller 传递到 View :

<?php

namespace Dashboard\Controller;

use Zend\Mvc\Controller\ActionController;
use Zend\View\Model\ViewModel;
use Dashboard\Model\AlbumTable;
use Dashboard\Model\TestModel;
use Dashboard\Model\Dashboard;

class DashboardController extends ActionController
{
public function indexAction()
{
return new ViewModel(array(
'users' => $this->getTestModel()->testMethod(),
));
}

public function getAlbumTable()
{
if (!$this->albumTable) {
$sm = $this->getServiceLocator();
$this->albumTable = $sm->get('album-table');
}
return $this->albumTable;
}

public function getTestModel()
{
if (!$this->testModel) {
$sm = $this->getServiceLocator();
$this->testModel = $sm->get('test-model');
}
return $this->testModel;
}

}

这段代码给我一个完全空白的页面,没有错误。当我从 Module.php 中注释掉 ServiceManager 配置并只呈现一个新的 ViewModel 而没有在我的 DashboardController.php 文件中传递任何参数时,页面正常呈现 - 加载 layout.phtml 和 index.phtml。

我相信我误解了一般如何使用 ServiceManager 或可能的 ZF2 的基本部分,并且非常感谢任何人可以提供的任何见解。这也是我在 StackOverflow 上的第一个问题,所以我欢迎任何关于格式化我的问题的建议。谢谢。

最佳答案

从服务经理处获取工厂有两个不错的选择。一种是创建工厂类,这大部分发生在 Zend Framework 代码本身中。第二个是像您一样使用闭包。

请确保您没有键入以下内容:

'test-model' => Dashboard\Model\TestModel(),

但是像您的第一个这样的真正闭包就是一个很好的例子。其次,当您尝试获取无法实例化的服务时,服务管理器总是会给出异常。请注意,此异常不包括消息原因:可能找不到该类或在实例化期间抛出异常(例如,因为服务管理器无法实例化您尝试获取的服务的依赖项)。

最后要注意的是,您不需要在您尝试获取 的位置使用use 语句导入FQCN(完全限定的类名)。但是当您尝试实例化时,您需要导入 FQCN。

所以这是可行的:

<?php

class MyClass
{
protected $sm;

public function setServiceManager($sm)
{
$this->sm = $sm;
}

public function doSomething()
{
$this->sm->get('some-special-key');
}
}

还有这个:

<?php

use Foo\Bar\Baz;

$serviceConfig = array(
'factories' => array(
'some-special-key' => function($sm) {
return new Baz;
}
),
);

但这不是(如果您尝试获取 Foo\Bar\Baz):

<?php

$serviceConfig = array(
'factories' => array(
'some-special-key' => function($sm) {
return new Baz;
}
),
);

您可能想查看我的 SlmCmfKernel存储库。在我的 Module.php我包括一个服务配置文件,它放在 separate location 中.在 another part of the code我得到经理的服务。

关于php - ZendFramework 2.0.0beta4 服务管理器配置-子键区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11166583/

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