seiffert/helper-bundle

该包的最新版本(dev-master)没有可用的许可证信息。

此包提供辅助对象的结构。

dev-master 2013-03-15 20:39 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:45:08 UTC


README

此包引入了辅助对象的结构。

概念

开发Symfony2应用程序一段时间后,我遇到了一些辅助对象的使用场景。例如,控制器:一旦你停止使用FrameworkBundle的默认控制器作为基类,你可能开始编写代码来替换默认控制器中的辅助函数。这段代码可能需要用在大多数控制器中。在这种情况下,你可以创建所有都有很多依赖项的控制器类,重新引入一个基控制器类,或者使用某种辅助对象。

此包通过引入由依赖注入容器管理的辅助对象(因此它们是延迟创建的,将被重用)并通過单个辅助对象HelperBroker提供,来解决这类问题。一个代理器聚合多个在容器编译期间收集和配置的辅助器,并将调用代理到实际的辅助对象。

配置

通过composer安装包

composer.json:

    "require": {
        ...
        "seiffert/helper-bundle": "*",
        ...
    }

在AppKernel中激活包

app/AppKernel.php:

    public function registerBundles()
    {
        $bundles = array(
            ...
            new Seiffert\HelperBundle\SeiffertHelperBundle(),
            ...
        );
        ...
    }

使用

有不同方式使用辅助器和辅助代理。以下将解释两种对我来说最有用的方式。

通过标记服务

要将辅助器配置为服务,只需实现你的自定义辅助类,将它们添加到DIC中,并像这样标记

services:
    my.helper:
        class: My\Helper\MyHelper
        tags:
            - { name: seiffert.helper, broker: my.helper.broker }
    my.second.helper:
        class: My\Helper\MySecondHelper
        tags:
            - { name: seiffert.helper, broker: my.helper.broker }
    my.service.that.requires.help:
        class: My\Service\ThatRequiresHelpService
        arguments:
            - @my.helper.broker

注入到类My\Service\ThatRequiresHelpService的参数是类型为Seiffert\HelperBundle\HelperBroker的,并响应该类中定义的所有辅助器类My\Helper\MySecondHelperMy\Helper\MyHelper的方法。这是通过使用__call将这些方法调用代理到实际的辅助器类来完成的。为了进一步说明使用与上述相同场景的辅助代理器,我将概述这些类

My\Helper\MyHelper:

<?php

namespace My\Helper;

use Seiffert\HelperBundle\HelperInterface;

class MyHelper implements HelperInterface
{
    public static function getHelperMethodNames()
    {
        return array('fooHelp');
    }
    
    public function fooHelp()
    {
        return 'foo';
    }
}

My\Helper\MySecondHelper:

<?php

namespace My\Helper;

use Seiffert\HelperBundle\HelperInterface;

class MySecondHelper implements HelperInterface
{
    public static function getHelperMethodNames()
    {
        return array('barHelp');
    }
    
    public function barHelp()
    {
        return 'bar';
    }
}

My\Service\ThatRequiresHelpService:

<?php

namespace My\Service;

use Seiffert\HelperBundle\HelperBroker;

class ThatRequiresHelperService
{
    /**
     * @var HelperBroker $h
     */
    private $h;
    
    public function __construct(HelperBroker $helper)
    {
        $this->h = $helper;
    }
    
    public function doYourJob()
    {
        return $this->h->fooHelp() . '|' . $this->h->barHelp();
    }
}    

通过使用辅助代理器,你可以最小化自己服务的依赖项,并将需要在类似场景中使用的辅助器分组。辅助器类的示例可以在相关的SeiffertControllerHelperBundle中找到。

通过辅助集

配置辅助代理器的另一种方法是使用辅助集。辅助集是一组辅助对象,知道如何将其辅助器添加到辅助代理器中。辅助集的好处是,你可以将所有辅助器的实例化放在一个地方(这并不像将它们放在使用这些辅助器的业务逻辑外部那么重要)。这个地方是你的自定义子类Seiffert\HelperBundle\HelperSet

My\HelperSet:

<?php

namespace My;

use Seiffert\HelperBundle\HelperSet as BaseHelperSet;

class HelperSet extends BaseHelperSet
{
    /**
     * @return array|object[]
     */
    public function getHelpers()
    {
        return array(
            new MyHelper(),
            new MySecondHelper()
        );
    }
}

现在,如果你想使用这个集合创建一个辅助代理器,你只需将其实例传递给辅助代理器构造函数

其他地方

<?php

use My\HelperSet;
use Seiffert\HelperBundle\HelperBroker;

$h = new HelperBroker(new HelperSet());

echo $h->fooHelp();

高级主题

未实现HelperInterface的辅助类

可以使用未实现Seiffert\HelperBundle\HelperInterface的类作为辅助对象。在这种情况下,此类中所有公共方法都将通过辅助代理器提供。

默认代理器

如果您没有在辅助服务的标签中添加属性broker,辅助服务将被添加到默认的代理seiffert.helper.broker

在多个代理处注册辅助对象

辅助对象可以被多个代理使用。要实现这一点,只需复制辅助对象的标签seiffert.helper并声明不同的代理。

services:
    my.helper:
        class: My\Helper\MyHelper
        tags:
            - { name: seiffert.helper, broker: my.helper.broker }
            - { name: seiffert.helper, broker: my.other.helper.broker }