Como implementar Actions en Laravel
Este artículo tiene más de un año de antigüedad, el contenido pudiera estar obsoleto.
Que son las actions? Pues basicamente son clases que se encargan de tareas especificas dentro de nuestra aplicación.
Tomemos el ejemplo de crear un blog y necesitamos crear articulos y para eso vamos a crear dentro de nuestra aplicacion varias carpetas y archivos para lograr nuestro cometido.
Primero creemos los siguientes directorios, dentro de app tendremos: Actions/Article
y vamos a crear un archivo llamado ArticleCreate
y quedaria de la siguiente forma:
1<?php 2 3namespace App\Actions\Article; 4 5use App\Models\Article; 6 7class ArticleCreate 8{ 9 10 /**11 * Undocumented function12 *13 * @param array $input14 * @return Article15 */16 public function __invoke(array $input): Article17 {18 // todo19 }20 21}
Tambien, dentro de app vamos a crear estos otros directorios Contratcs/Actions
junto a un archivo llamado ArticlesCreate
debe quedar de esta forma:
1<?php 2namespace App\Contracts\Actions; 3 4use App\Models\Article; 5 6interface ArticlesCreate 7{ 8 /** 9 * Undocumented function10 *11 * @param array $data12 * @return Article13 */14 public function __invoke(array $data): Article;15}
Y ya, es lo unico que vamos hacer con este archivo.
Pasemos a lo mas divertido
Volviendo a nuestro archivo ArticleCreate
vamos a implementar nuestro contrato ArticlesCreate
para que quede de la siguiente forma:
1<?php 2 3namespace App\Actions\Article; 4 5use App\Contracts\Actions\ArticlesCreate; 6use App\Models\Article; 7 8class ArticleCreate implements ArticlesCreate 9{10 11 /**12 * Undocumented function13 *14 * @param array $input15 * @return Article16 */17 public function __invoke(array $input): Article18 {19 return Article::create([20 'title' => $input['title'],21 'body' => $input['body'],22 ]);23 }24 25}
Con este cambio dejamos listo nuestra accion para crear articulos. Tenemos ahora que hacer la implementacion de nuestra accion para hacer el uso de ella.
Para implementar la accion vamos hacer uso de los "Single Action Controllers" y haremos lo siguiente:
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Contracts\Actions\ArticlesCreate; 6use App\Http\Controllers\Controller; 7 8class ArticleStoreController extends Controller 9{10 /**11 * Undocumented function12 *13 * @param ArticlesCreate $articleCreate14 * @return \Illuminate\Http\Response15 */16 public function __invoke(ArticlesCreate $articleCreate)17 {18 $article = $articleCreate($request->all());19 }20}
Nuestra accion al hacer de tipo invocable, nos permite acceder a ella como si fuera una funcion
Necesitamos crear un service provider con lo siguiente:
1<?php 2 3namespace App\Providers; 4 5use App\Actions\Article\ArticleCreateAction; 6use App\Contracts\Actions\ArticlesCreate; 7use Illuminate\Support\ServiceProvider; 8 9class ActionServiceProvider extends ServiceProvider10{11 public array $bindings = [12 ArticlesCreate::class => ArticleCreateAction::class,13 ];14}
No olviden agregarlo en la lista de service providers en app.php
Y ya para finalizar tengo que agradecer a Luke Downing y su charla en el Laracon "Actions are a Dev's Best Friend", para el mi agradecimiento porque su charla me motivo a realizar este pequeño articulo y refactorizar este blog.
Btw, visiten a Luke en su perfil de twitter: @LukeDowning19