Como implementar Actions en Laravel

Angel Cruz
Angel Cruz
Tabla de contenidos

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 function
12 *
13 * @param array $input
14 * @return Article
15 */
16 public function __invoke(array $input): Article
17 {
18 // todo
19 }
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 function
10 *
11 * @param array $data
12 * @return Article
13 */
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 function
13 *
14 * @param array $input
15 * @return Article
16 */
17 public function __invoke(array $input): Article
18 {
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 function
12 *
13 * @param ArticlesCreate $articleCreate
14 * @return \Illuminate\Http\Response
15 */
16 public function __invoke(ArticlesCreate $articleCreate)
17 {
18 $article = $articleCreate($request->all());
19 }
20}

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 ServiceProvider
10{
11 public array $bindings = [
12 ArticlesCreate::class => ArticleCreateAction::class,
13 ];
14}

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

Te podrá interesar
Cursor anunció un ajuste en sus precios a partir del 15 de septiembre de 2025. Descubre cómo afectará a los usuarios, por qué ocurre este cambio y qué alternativas existen.
GitHub no cierra, pero ya no será lo mismo. Con la salida de Thomas Dohmke como CEO y la decisión de Microsoft de no reemplazarlo, la plataforma dejará de operar como entidad independiente y pasará a formar parte del equipo CoreAI, liderado por Jay Parikh.
Aprende cómo crear reglas personalizadas en Cursor IDE paso a paso. Incluye ejemplos, mejores prácticas y un generador de reglas online para facilitar el proceso.
Logo de Angel Cruz

Made with ♥️ & 🧉 in Montevideo, Uruguay Buenos Aires, Argentina.

[AC].dev is not affiliated with Laravel or Laravel LLC. Laravel is a Trademark of Taylor Otwell.

Code highlighting provided by Torchlight.