ZendFramework 2.0.0beta4 Service Manager配置-子项之间的区别 - php

编辑:在我发布此问题几周后,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_factories,别名,工厂,可调用项,服务和共享。如果我只想注册一个模型类,该模型类将在我的控制器中使用以从数据库中提取数据,哪个是最好的?我专门尝试将下面的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的确切方式,所以我在下面创建了一个简单条目,以将问题减少到其基本组件-“测试模型”。当我注释掉“仪表板表”条目并从控制器中的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的第一个问题,因此,欢迎提出有关格式化问题的任何建议。谢谢。

参考方案

有两种很好的选择可以从服务经理那里获得工厂。一种是创建工厂类,这通常在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 getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP:从函数返回值并直接回显它? - php

这可能是一个愚蠢的问题,但是……的PHPfunction get_info() { $something = "test"; return $something; } html<div class="test"><?php echo get_info(); ?></div> 有没有办…

php:是否有充分的理由引用所有数组键/索引? - php

我正在遍历别人的代码,他们总是避免转义其数组键。例如:$ row_rsCatalogsItems [名称]代替$ row_rsCatalogsItems ['名称']因此,我不断地对自己接触的所有事物进行微小的更改,以应对这些惰性。但是现在我想知道这样做是否有很多好处。我得到它会在默认为字符串之前检查常量(我在处理常量时会讨厌php中的行为,因为即使未定义,…

php fopen相对路径断开-神秘 - php

我知道“必须进行某些更改”,但是我的代码似乎整夜无故中断。我的服务器目录结构是这样的: / /脚本 /审计 /其他事情我在“脚本”文件夹中有一个脚本(假设它被称为“ /scripts/MyScript.php”),该脚本使用curl收集网页中的数据,并将其日期过的副本保存在“审核”文件夹中。要写入审核文件夹,我使用了 $ fh = fopen(“ ./ au…

标头和包含项之间有什么区别,应在何处使用 - php

我对两个词感到困惑header ("Location:homepage_php");include("homepage.php");我猜想标题是在检查密码过程后使用的,关于include,您可以在任何地方使用它。但是我不确定它们之间的实际区别是什么以及应该使用这两个中的哪个位置。 参考方案 标头将用户转发到新页面,因此…