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

标签 php zend-framework2 zend-db servicemanager

编辑: 在我发布这个问题几周后,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/

相关文章:

performance - 请解释这个 Symfony 与 Zend Framework 2 的性能结果

zend-framework2 - 如何使用 Zend Framework 2 中的安全功能?

zend-framework - 无法解析插件 "multidb"

zend-framework - 使用 Zend_Db 数据库连接

php - 使用 php 和 zend 框架导入大型 .sql 文件

php - Magento:如何禁用或更改核心观察者方法的工作方式

php - 使用 JavaScript 和 PHP 的动态文本?

php - 为什么我在 url 中输入验证码文件路径它返回一个二进制文件而不是图像文件

php - SQL中如何选择字段并对每个字段进行计数?

php - 如何在 Zend\Db (Zend Framework 2) 中处理多对多关系