# Create new article

# Definition

Creates a new article for the given user with the given data. It uses the authenticated user when used as a controller and provides some custom authorization and validation.

class CreateNewArticle
    use AsAction;

    public function handle(User $author, array $data): Article
        return $author->articles()->create($data);

    public function getControllerMiddleware(): array
        return ['auth'];

    public function authorize(ActionRequest $request): bool
        return in_array($request->user()->role, ['author', 'admin']);

    public function rules(): array
        return [
            'title' => ['required', 'min:8'],
            'body' => ['required', IsValidMarkdown::class],
            'published' => ['required', 'boolean'],

    public function asController(ActionRequest $request): Article
        $data = $request->only('title', 'body');
        $data['published_at'] = $request->get('published') ? now() : null;

        return $this->handle($request->user(), $data);

# Using as an object

Note how we can use this action different based on how it's running. Internally, we might want to allow ourselves to define a custom publication date whereas we only allow a published boolean to the outside world.

CreateNewArticle::run($author, [
    'title' => 'My article',
    'body' => '# My article',
    'published_at' => now()->addWeek(),

It is also important to note that the authorization and validation logic will only be applied to the action when it is running as a controller.

# Registering as a controller

To use as a controller simply register the action in your routes file.

Route::post('articles', CreateNewArticle::class);