---
title: "Como implementar Actions en Laravel"
excerpt: "Que son las actions? Pues basicamente son clases que se encargan de tareas especificas dentro de nuestra aplicación."
date: "2022-02-10T03:05:21.000Z"
category: "Laravel"
seo_title: "Implementar Actions en Laravel: clases invocables con DI"
seo_description: "Cómo implementar el patrón Actions en Laravel con clases invocables, interfaces y service providers. Mantén tu lógica de negocio aislada y testeable con Single Action Controllers."
author:
  name: "angel cruz"
  picture: "https://angelcruzdevcdn.nyc3.cdn.digitaloceanspaces.com/images/me/angel-cruz.png"
ogImage:
  url: "/images/open-graph/laravel-opengraph-image.png"
---

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:


```php
<?php

namespace App\Actions\Article;

use App\Models\Article;

class ArticleCreate
{

	/**
	 * Undocumented function
	 *
	 * @param array $input
	 * @return Article
	 */
    public function __invoke(array $input): Article
    {
        // todo
    }

}
```


Tambien, dentro de app vamos a crear estos otros directorios `Contratcs/Actions` junto a un archivo llamado `ArticlesCreate` debe quedar de esta forma:


```php
<?php
namespace App\Contracts\Actions;

use App\Models\Article;

interface ArticlesCreate
{
	/**
	 * Undocumented function
	 *
	 * @param array $data
	 * @return Article
	 */
	public function __invoke(array $data): Article;
}

```

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:


```php
<?php

namespace App\Actions\Article;

use App\Contracts\Actions\ArticlesCreate;
use App\Models\Article;

class ArticleCreate implements ArticlesCreate
{

	/**
	 * Undocumented function
	 *
	 * @param array $input
	 * @return Article
	 */
    public function __invoke(array $input): Article
    {
		return Article::create([
			'title' => $input['title'],
			'body' => $input['body'],
		]);
    }

}
```

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:


```php
<?php
 
namespace App\Http\Controllers;

use App\Contracts\Actions\ArticlesCreate;
use App\Http\Controllers\Controller;
 
class ArticleStoreController extends Controller
{
	/**
	 * Undocumented function
	 *
	 * @param ArticlesCreate $articleCreate
	 * @return \Illuminate\Http\Response
	 */
    public function __invoke(ArticlesCreate $articleCreate)
    {
		$article = $articleCreate($request->all());
    }
}
```

<div class="not-prose">
	<div class="flex bg-yellow-100 rounded p-4 mb-4 text-sm text-yellow-700" role="alert">
		<svg class="w-5 h-5 inline mr-3" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
			<path fill-rule="evenodd"
				d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z"
				clip-rule="evenodd"></path>
		</svg>
		<div>
			<p>
				Nuestra accion al hacer de tipo invocable, nos permite acceder a ella como si fuera una funcion
			</p>
		</div>
	</div>
</div>

Necesitamos crear un service provider con lo siguiente:

```php
<?php

namespace App\Providers;

use App\Actions\Article\ArticleCreateAction;
use App\Contracts\Actions\ArticlesCreate;
use Illuminate\Support\ServiceProvider;

class ActionServiceProvider extends ServiceProvider
{
	public array $bindings = [
		ArticlesCreate::class => ArticleCreateAction::class,
	];
}
```


<div class="not-prose">
	<div class="flex bg-yellow-100 rounded p-4 mb-4 text-sm text-yellow-700" role="alert">
		<svg class="w-5 h-5 inline mr-3" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
			<path fill-rule="evenodd"
				d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z"
				clip-rule="evenodd"></path>
		</svg>
		<div>
			<p>
				No olviden agregarlo en la lista de service providers en <code>app.php</code> 
			</p>
		</div>
	</div>
</div>


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: @<a href="https://twitter.com/LukeDowning19" target="_blank" rel="noopener noreferrer">LukeDowning19</a>

---

## Sitemap

Índice completo del sitio: [/sitemap.md](https://angelcruz.dev/sitemap.md)

Canónico HTML: [https://angelcruz.dev/post/como-implementar-actions-en-laravel](https://angelcruz.dev/post/como-implementar-actions-en-laravel)
