zend框架2控制器工厂条件加载

时间:2014-05-26 13:25:14

标签: php zend-framework2 lazy-loading

我正在寻找一种通过工厂处理控制器创建的正确方法(以避免严格依赖控制器本身的服务以允许单元测试)。

我有一个带有2个动作的控制器:

  1. 搜索表单提交,其中我只使用Zend Form和验证器 确定是否向其发送了有效查询,如果是, 重定向以显示结果操作

  2. 显示结果 - 我使用https://github.com/ripaclub/sphinxsearch 与狮身人面像搜索

  3. 交谈

    现在,我创建控制器的工厂看起来像这样:

    $ctrl = new Album\Controller\SearchController();
    $ctrl->setSearchForm(new Album\Form\SearchForm());
    $ctrl->setSearchEntity(new Album\Model\Search());
    $sphinxqlAdapter = $serviceLocator->getServiceLocator()->get('SphinxSearch\Db\Adapter\Adapter');
    $ctrl->setSphinxqlAdapter($sphinxqlAdapter);
    $ctrl->setSphinxqlMatch($serviceLocator->getServiceLocator()->get('sphinxqlMatch'));
    $ctrl->setSphinxqlSearch($serviceLocator->getServiceLocator()->get('SphinxQlSearchFactory'));
    return $ctrl;
    

    问题是,即使我的第一个动作(简单形式验证+重定向)也会获得注入并准备使用的所有Sphinx类......但它们在那里没用。我尝试使用这里所述的Lazy Services http://framework.zend.com/manual/2.2/en/modules/zend.service-manager.lazy-services.html,它适用于我的sphinxqlMatch' service - 调用表单操作时不会实例化此类。问题出在SphinxSearch \ Db \ Adapter \ Adapter上,因为它使用工厂创建数据库适配器来运行SphinxQL服务。虽然我没有例外,但我检查了适配器是否立即实例化,因此没有代理发生。

    任何人都有懒惰服务的经验以及如何让它与工厂一起工作?或者也许其他一些模式在这里更好 - 请提供提示/解决方案。

    我知道我可以选择将这两个动作分成单独的控制器作为最后的手段,但对我而言,搜索表单提交例程和显示搜索结果在逻辑上是一致的是有意义的。)

0 个答案:

没有答案