# More granular traits

# A collection of traits

If you look closer at the AsAction trait provided by Laravel Actions, you'll notice it's just a collection of smaller traits.

namespace Lorisleiva\Actions\Concerns;

trait AsAction
{
    use AsObject;
    use AsController;
    use AsListener;
    use AsJob;
    use AsCommand;
    use AsFake;
}

Each of these traits:

  • Provide methods to the action and/or
  • Enable the decorator to use methods from the action.

You can check the "References" section of this documentation to see all methods provided and/or used by each of these traits.

# Cherry-picking

This means you can cherry-pick the part of Laravel Actions you want to use.

For example, you could explicitely cherry-pick these traits for each action.

class MyAction
{
    use AsObject;
    use AsController;

    // ...
}

Or, you could create your own AsAction trait that only includes the features of Laravel Actions your application needs.

use Lorisleiva\Actions\Concerns\AsObject;
use Lorisleiva\Actions\Concerns\AsController;
use Lorisleiva\Actions\Concerns\AsJob;
use Lorisleiva\Actions\Concerns\AsFake;

trait AsAction
{
    use AsObject;
    use AsController;
    use AsJob;
    use AsFake;
}

The benefits of this cherry-picking are very small — which is why the documentation focuses on the AsAction trait — but here they are:

  • Remove potential conflicting methods. For example, if you want to define your own rules method on an action that will never run as a controller.
  • Tiny (negligeable) performance improvements since we'll be looping through less patterns to identify how an action is being executed.
  • That's it...

Cherry-picking can be particularly useful if you only need one slice of Laravel Actions. For example, if all you need is a way to run your plain PHP classes as controllers, then all you need to use is the AsController trait.