php - Zend 框架 2 : Service locator in view helper

标签 php zend-framework2 view-helpers service-locator

我正在尝试访问 View 助手中的服务定位器,以便我可以访问我的配置。我将这个 View 助手用于递归函数,所以我不知道在哪里声明服务定位器。

namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;
use CatMgt\Model\CategoryTable as RecursiveTable;

class CategoryRecursiveViewHelper extends AbstractHelper
{
    protected $table;

    public function __construct(RecursiveTable $rec)
    {
        $this->table = $rec; 
    }

    public function __invoke($project_id, $id, $user_themes_forbidden, $level, $d, $role_level)
    {

       $config = $serviceLocator->getServiceLocator()->get('config');

       //So i can access $config['templates']

       $this->__invoke($val->project_id, $id, $user_themes_forbidden, $level, $d, $role_level);

    }

}

我尝试了此处提供的解决方案 link

但是没有用,这样可以吗?

namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;
use CatMgt\Model\CategoryTable as RecursiveTable;
use Zend\View\HelperPluginManager as ServiceManager;

class CategoryRecursiveViewHelper extends AbstractHelper
{
    protected $table;
    protected $serviceManager;

    public function __construct(RecursiveTable $rec, ServiceManager $serviceManager)
    {
        $this->table = $rec; 
        $this->serviceManager = $serviceManager;
    }

    public function __invoke($project_id, $id, $user_themes_forbidden, $level, $d, $role_level)
    {

       $config = $this->serviceManager->getServiceLocator()->get('config');

       //So i can access $config['templates']

       $this->__invoke($val->project_id, $id, $user_themes_forbidden, $level, $d, $role_level);

    }

}

最佳答案

首先,您的 ViewHelper 是一个无限循环,您的应用程序会像那样崩溃。您在 __invoke 中调用 __invoke - 这是行不通的。

使用依赖项注册 ViewHelper

首先,您要像这样编写 ViewHelper:

class FooBarHelper extends AbstractHelper
{
    protected $foo;
    protected $bar;

    public function __construct(Foo $foo, Bar $bar)
    {
        $this->foo = $foo;
        $this->bar = $bar;
    }

    public function __invoke($args)
    {
        return $this->foo(
            $this->bar($args['something'])
        );
    }
}

接下来是注册 ViewHelper。由于它需要依赖项,因此您需要使用 factory 作为目标。

// module.config.php
'view_helpers' => [
    'factories' => [
        'foobar' => 'My\Something\FooBarHelperFactory'
    ]
]

目标现在是我们尚未编写的工厂类。所以继续:

class FooBarHelperFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $sl)
    {
        // $sl is instanceof ViewHelperManager, we need the real SL though
        $rsl = $sl->getServiceLocator();
        $foo = $rsl->get('foo');
        $bar = $rsl->get('bar');

        return new FooBarHelper($foo, $bar);
    }
}

现在您可以在任何 View 文件中通过 $this->foobar($args) 使用您的 ViewHelper

永远不要将 ServiceLocator 作为依赖项使用

每当您依赖 ServiceManager 作为依赖项时,您就会陷入糟糕的设计。您的类将具有未知类型的依赖项,并且它们是隐藏的。每当您的类需要一些外部数据时,直接通过 __construct() 使其可用,并且不要通过注入(inject) ServiceManager 来隐藏依赖项。

关于php - Zend 框架 2 : Service locator in view helper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531462/

相关文章:

php - ZF2 子路由中的可选路由约束

php - Zend View Helper 中的数据库连接

ruby-on-rails - 如何模拟 rspec 辅助测试的请求对象?

php - 如何以干净的方式传递测试更新方法的所有必填字段?

php - 更新语句错误

php - Zend框架2 : passing variables ("options") to form using formelementmanager

ruby-on-rails - Ruby on Rails content_tag 选项哈希 - 设置 bool html 属性?

php - 如何将数组的相同键与其值相加

php - 显示数据库记录 MySQLI

php - 如何在 Doctrine2/ZF2 中使用 Memcached?