IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

É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.

Exemple

<?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
   }
}
...

Laravel

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',
    ];

Laravel spark

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:

Vegeu també

Enllaços externs