编辑:在我发布这个问题几周后,Evan Coury 写了一篇关于 ZF2 ServiceManager 主题的优秀博客文章,这是我找到问题的最佳答案的地方:http ://blog.evan.pro/introduction-to -the-zend-framework-2-servicemanager
--
我正在使用 ZendFramework 2.0.0beta4 开发一个项目,并且在使用 Zend\ServiceManager 处理依赖项时遇到了麻烦。这是当前的ZF2 ServiceManager 文档
它列出了在使用 ServiceManager 注册类以在我们的模块中使用时使用的 6 个子键:abstract_factories、aliases、factory、invokables、services和shared。如果我只想注册一个模型类,我将在控制器中使用它从数据库中提取数据,那么哪个最好?我特别尝试将下面显示的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(),
),
);
}
但是,我不知道“db-adapter”是如何在来自 SkeletonApplication 的单独工作示例中进入 ServiceManager ($sm) - 它与自动加载的 global.php 配置文件中的一个条目有关db' 包含数据库信息的条目。因为我不确切知道如何从配置文件到 ServiceManager,所以我在下面创建了一个简单的条目,以将问题减少到它的基本组件 - “test-model”。当我注释掉“仪表板表”条目并从控制器中的 TestModel 调用一个函数时,它只输出一些文本。下面是我的 Module.php 中的 ServiceManager 配置
<?php
namespace Dashboard\Model;
class TestModel {
public function testMethod()
{
$testResult = "Hello";
return $testResult;
}
}
然后从我的控制器传递到视图:
<?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 上的第一个问题,所以我欢迎任何关于格式化我的问题的建议。谢谢。