vox / pipeline-bundle
v1.0.0
2018-01-16 19:26 UTC
Requires
- php: >=7
- symfony/symfony: >=2.7
Requires (Dev)
- doctrine/doctrine-bundle: ^1.6
- doctrine/orm: ^2.5
- incenteev/composer-parameter-handler: ^2.0
- sensio/distribution-bundle: ^5.0.19
- sensio/framework-extra-bundle: ^3.0.2
- sensio/generator-bundle: ^3.0
- symfony/monolog-bundle: ^3.1.0
- symfony/phpunit-bridge: ^3.0
- symfony/polyfill-apcu: ^1.0
This package is auto-updated.
Last update: 2024-09-13 11:14:05 UTC
README
配置
vox_pipeline: # nome do bundle pipelines: # deve declarar um array de pipelines primeiro_passo_filter: # será o nome do serviço que poderar ser referenciado na injeção de dependencia type: kernel-subscriber # tipo de serviço, pode ser kernel-subscriber, doctrine-subscriber e service subscribedEvents: # eventos que os subscribers irão escutar - api.form.post_build.primeiroPasso services: # serviços que compõem a pipeline, srão executados na ordem de declaração - AppBundle\Pipeline\Form\DadosProcessoPipelineService - AppBundle\Pipeline\Form\EmpresaPipelineService - AppBundle\Pipeline\Form\PassoDois\Empresario\EmpresarioPipelineService
声明管道项目
所有管道项目必须是“可调用”的,它们接收一个上下文对象
class PipelineItem { /** * se houver esse método declarado, ele será chamado antes de chamar o __invoke * e caso ele retone false, não será chamado o __invoke * essa interface é implicita, não sendo necessário implementar nenhuma interface */ public function shouldCall(PipelineContext $context): boolean { return true; } public function __invoke(PipelineContext $context) { //code } }
管道类型
- 内核订阅者(kernel-subscriber)
监听由 symfony 的事件调度器触发的事件,将接收到一个包含实际事件的 PipelineContext 对象,该事件可以通过以下方式获取:
public function __invoke(PipelineContext $context) { $event = $context->event; $event = $context->get('event'); }
- Doctrine 订阅者(doctrine-subscriber)
监听 doctrine 的任何事件,并以与内核订阅者相同的方式接收事件。在配置中,应在 subscribedEvents 使用 doctrine 事件的名称。例如:
subscribedEvents: - prePersist - postPersist - preUpdtade - postUpdate - onFlush
- 服务(service)
此类型不监听任何事件,它只是将服务作为注入到其他服务中的服务,它是一个 PiplineRunner 类型的对象。以下是一个使用管道的示例:
config 服务
vox_pipeline: pipelines: primeiro_passo_filter: type: service services: - AppBundle\Pipeline\Form\DadosProcessoPipelineService - AppBundle\Pipeline\Form\EmpresaPipelineService - AppBundle\Pipeline\Form\PassoDois\Empresario\EmpresarioPipelineService services: AppBundle\Service\SomeService: arguments: ['@primeiro_passo_filter']
class SomeService { private $pipelineRunner; public function __contruct(PipelineRunner $pipelineRunner) { $this->pipelineRunner = $pipelineRunner; } public function soSomething() { $context = new PipelineContext(); $this->pipelineRunner->run($context); // o pipeline runner é também um callable, pode ser executado como uma função call_user_func($this->pipelineRunner, $context); // ou $this->pipelineRunner($context); } }
流程控制
有一些方法可以控制管道的流程
通过异常
public function __invoke(PipelineContext $context) { //para a execução dessa pipe e vai para a proxima throw new CannotHandleContextException(); }
public function __invoke(PipelineContext $context) { //para a execução dessa pipe e termina a execução, evitando de chamar que chame as proximas throw new ShouldStopPropagationException(); }
public function __invoke(PipelineContext $context) { // se esse metodo for chamado, os proximos itens da pipeline não serão mais chamados // a execução desse item continua até o final $context->stopPropagation(); }