seiffert / helper-bundle
此包提供辅助对象的结构。
Requires
- php: >=5.3.3
- symfony/framework-bundle: >=2.1.0,<2.3-dev
Requires (Dev)
- pdepend/pdepend: 1.1.0
- phpmd/phpmd: 1.4.0
- phpunit/php-code-coverage: 1.2.*
- phpunit/php-timer: 1.0.4
- phpunit/phpunit: 3.7.*
- squizlabs/php_codesniffer: *
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\MySecondHelper
和My\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 }