Make your Laravel actions classes fast and in a simple way.
You can install the package via composer:
composer require panchodp/laravel-actions --devUse the following command to publish the configuration file:
php artisan vendor:publish --provider="Panchodp\LaravelAction\LaravelActionServiceProvider" --tag="laravel-actions-config"This will create a config/laravel-actions.php file in your application.
return [
'base_folder' => 'Actions',
'method_name' => 'handle',
'directory_permissions' => 0750,
];There are three configuration options available:
base_folder: This is the base folder where your action classes will be created. By default, it is set toActions, which means your action classes will be created in theapp/Actionsdirectory.method_name: This is the name of the method that will be created in your action classes. By default, it is set tohandle, which means your action classes will have ahandlemethod where you can implement your action logic.directory_permissions: This option defines the permissions for newly created actions folders. This option defines the permissions for newly directories created by the package.
By default, Laravel Actions generates instance methods for better flexibility and dependency injection support. However, you can create static methods when needed for simpler usage.
// Usage
$action = new MyAction();
$action->handle($attributes);
// Generated code
public function handle(array $attributes): void
{
// Implementation
}// Usage
MyAction::handle($attributes);
// Generated code
public static function handle(array $attributes): void
{
// Implementation
}- To make an action class, you can use the
make:actioncommand:
php artisan make:action MyActionThis will create a new action class in the app/Actions directory with the name MyAction.php.
The class will have a handle method where you can implement your action logic.
<?php
declare(strict_types=1);
namespace App\Actions;
use Throwable;
final class MyAction
{
public function handle(array $attributes): void
{
// This is where the action logic will be implemented.
}
}- To make an action class in a specific subfolder of Action, you can use:
php artisan make:action MyAction FolderThis will create a new action class in the app/Actions/Folder directory with the name MyAction.php.
<?php
declare(strict_types=1);
namespace App\Actions\Folder;
use Throwable;
final class MyAction
{
public function handle(array $attributes): void
{
// This is where the action logic will be implemented.
}
}Or you can use more than one subfolder like this:.
php artisan make:action MyAction Folder1/Folder2This will create a new action class in the app/Actions/Folder1/Folder2/ directory with the name MyAction.php.
--tThis flag prepare the action class with Database trasactions. For example, if you want to create an action class with transactions, you can use:
php artisan make:action MyAction --twill result in the following action class:
<?php
declare(strict_types=1);
namespace App\Actions;
use Illuminate\Support\Facades\DB;
use Throwable;
final class MyAction
{
public function handle(array $attributes): void
{
DB::transaction(function () use ($attributes) {
// Logic to be executed within the transaction
});
}
}--uThis flag inyect User $user in the handle method.
For example, if you want to create an action class with User injection, you can use:
php artisan make:action MyAction --uwill result in the following action class:
<?php
declare(strict_types=1);
namespace App\Actions;
use App\Models\User;
use Throwable;
final class MyAction
{
public function handle(User $user,array $attributes): void
{
// This is where the action logic will be implemented.
}
}--tuor--utUse both flags together to prepare the action class with Database transactions and User injection.
bash php artisan make:action MyAction --tu or bash php artisan make:action MyAction --ut
will result in the following action class:
<?php
declare(strict_types=1);
namespace App\Actions;
use Illuminate\Support\Facades\DB;
use App\Models\User;
use Throwable;
final class MyAction
{
public function handle(User $user,array $attributes): void
{
DB::transaction(function () use ($attributes) {
// Logic to be executed within the transaction
});
}
}
--rThis flag generates a Laravel Request class and injects it into the action method.
For example, if you want to create an action class with Request injection, you can use:
php artisan make:action MyAction --rThis will generate both an Action class and a Request class (MyActionRequest), and will result in:
<?php
declare(strict_types=1);
namespace App\Actions;
use App\Http\Requests\MyActionRequest;
final class MyAction
{
public function handle(MyActionRequest $request): void
{
// This is where the action logic will be implemented.
}
}--sThis flag generates static methods instead of instance methods.
For example, if you want to create an action class with static methods, you can use:
php artisan make:action MyAction --swill result in the following action class:
<?php
declare(strict_types=1);
namespace App\Actions;
final class MyAction
{
public static function handle(array $attributes): void
{
// This is where the action logic will be implemented.
}
}You can combine multiple flags to create actions with different features. All possible combinations are supported:
Two-flag combinations:
--tror--rt: Database transactions with Request injection--uror--ru: User injection with Request injection--tuor--ut: Database transactions with User injection (as shown above)--tsor--st: Database transactions with static method--usor--su: User injection with static method--rsor--sr: Request injection with static method
Three-flag combinations:
--tur,--tru,--utr,--urt,--rtu,--rut: All features combined (instance)--tus,--tsu,--uts,--ust,--stu,--sut: Transactions + User + Static--trs,--tsr,--rts,--rst,--str,--srt: Transactions + Request + Static--urs,--usr,--rus,--rsu,--sru,--sur: User + Request + Static
Four-flag combinations (all features):
--turs,--trsu,--utrs,--urts,--rtus,--ruts: All features with static method--stru,--stur,--sutr,--surt,--srtu,--srut: All permutations supported
For example with instance method (default):
php artisan make:action CompleteAction --turThis will generate:
<?php
declare(strict_types=1);
namespace App\Actions;
use Illuminate\Support\Facades\DB;
use App\Models\User;
use App\Http\Requests\CompleteActionRequest;
final class CompleteAction
{
public function handle(User $user, CompleteActionRequest $request): void
{
DB::transaction(function () use ($request) {
// Logic to be executed within the transaction
});
}
}For example with static method:
php artisan make:action CompleteAction --tursThis will generate a static method with all features:
<?php
declare(strict_types=1);
namespace App\Actions;
use Illuminate\Support\Facades\DB;
use App\Models\User;
use App\Http\Requests\CompleteActionRequest;
final class CompleteAction
{
public static function handle(User $user, CompleteActionRequest $request): void
{
DB::transaction(function () use ($request) {
// Logic to be executed within the transaction
});
}
}Individual flags are also supported:
--t: Only database transactions--u: Only user injection--r: Only request injection--s: Only static method
By default, actions are generated as instance methods. Use the --s flag to generate static methods:
# Creates instance method (default)
php artisan make:action MyAction
# Creates static method
php artisan make:action MyAction --sYou can show the Actions directory tree in the terminal with the following command:
php artisan actions:listThis will display the structure of the app/Actions or the base directory specified in the config file, showing all action classes and their subdirectories.
Actions/
├── Folder1/
│ ├── SecondAction
│ └── ThirdAction
├── Folder2/
│ └── FourthAction
├── FirstAction
└── LastActionPull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.
