És un patró que permet convertir una entitat de programació com un mètode o una classe que realitza una tasca complexa en una cadena de subtasques més simples.
<?php class DoSomethingComplex { public function handle() { $tasks = [ DoThis::class, DoThat::class, DoRunSomething::class, AddFooBar::class, ... ]; foreach($tasks as $task) { (new $task)->handle(); } } } class DoThis { public function handle() { //TODO } } class DoThat { public function handle() { //TODO } } class DoRunSomething { public function handle() { //TODO } } ...
Al Kernel HTTP:
https://github.com/laravel/framework/blob/05f905209df066a4e01e2cb866517607395b42aa/src/Illuminate/Foundation/Console/Kernel.php
Durant el boostrap de Laravel cal executar múltiples tasques que en aquest cas es deleguen a classes "bootstrappers" que executen cada subtasca de forma individual:
protected $bootstrappers = [ 'Illuminate\Foundation\Bootstrap\DetectEnvironment', 'Illuminate\Foundation\Bootstrap\LoadConfiguration', 'Illuminate\Foundation\Bootstrap\ConfigureLogging', 'Illuminate\Foundation\Bootstrap\HandleExceptions', 'Illuminate\Foundation\Bootstrap\RegisterFacades', 'Illuminate\Foundation\Bootstrap\SetRequestForConsole', 'Illuminate\Foundation\Bootstrap\RegisterProviders', 'Illuminate\Foundation\Bootstrap\BootProviders', ];
Un altre exemple a:
https://github.com/laravel/spark-installer/blob/master/src/NewCommand.php
Hi ha un mètode execute complex que executa múltiples subtasques:
public function execute(InputInterface $input, OutputInterface $output) { $this->input = $input; $this->output = new SymfonyStyle($input, $output); $this->path = getcwd().'/'.$input->getArgument('name'); $installers = [ Installation\CreateLaravelProject::class, Installation\DownloadSpark::class, Installation\UpdateComposerFile::class, Installation\ComposerUpdate::class, Installation\AddCoreProviderToConfiguration::class, Installation\RunSparkInstall::class, Installation\AddAppProviderToConfiguration::class, Installation\RunNpmInstall::class, Installation\RunGulp::class, ]; foreach ($installers as $installer) { (new $installer($this, $input->getArgument('name')))->install(); } }
Recursos: