DEV Community

Oussama
Oussama

Posted on • Originally published at coderflex.com on

Decorate Your Model Attributes Using Laravel Presenter Package

Introduction

Laravel Presenter by @ousid is a clean way to decorate your models,
and incrementally refactor from the simplest solution to a clean, reusable system.

Prerequisite

You need to know the following:

Why this package?

Sometimes we need to present some custom attributes and re-use them in many places in our app, and the simplest way is to put them inside your model class, but is it efficient?
This page allows you to make a place for all your custom attribute methods and decorate them to use them wherever you want, and help you to maintain/refactor your code easily.

Installation

You can install the package via composer:

composer require coderflexx/laravel-presenter
Enter fullscreen mode Exit fullscreen mode

You can publish the config file with:

vendor:publish --provider="Coderflex\LaravelPresenter\LaravelPresenterServiceProvider"
Enter fullscreen mode Exit fullscreen mode

This is the contents of the published config file:

return [

    /*
    |--------------------------------------------------------------------------
    | Presenter Namespace
    |--------------------------------------------------------------------------
    |
    | This value informs LaravelPresenter which namespace you will be 
    | selecting to store your presenters by default.
    | If this value equals to null, "App\Presenter" will be used 
    | by default.
    |
    */

    'presenter_namespace'   => 'App\\Presenters',
];
Enter fullscreen mode Exit fullscreen mode

Usage

The implementation of this package is so simple, all what you need to do is the following:

Model Implementation

  • Implement CanPresent Interface
  • Use UsesPresenters Trait
use Coderflex\LaravelPresenter\Concerns\CanPresent;
use Coderflex\LaravelPresenter\Concerns\UsesPresenters;
// ...

class User extends Authenticatable implements CanPresent
{
    use UsesPresenters;

    // ...
}
Enter fullscreen mode Exit fullscreen mode

Create New Model Presenter class

This package gives you an easy way to generate new Presenter class, all you need to do is to use presenter:make command.

php artisan presenter:make UserPresneter
Enter fullscreen mode Exit fullscreen mode

UserPresenter in our case, leaves by default in App\Presenters.

This is the contents of the UserPresenter file:

<?php

namespace App\Presenters;

use Coderflex\LaravelPresenter\Presenter;

class UserPresenter extends Presenter
{
    // 
}

Enter fullscreen mode Exit fullscreen mode

If you want to change the directory, you have two options.

First options is to set the full namespace while you're creating the presenter class

php artisna presneter:make App\Models\Presenter\UserPresenter
Enter fullscreen mode Exit fullscreen mode

Or change presenter_namespace from config/laravel-presenter file.

return [
    ...

    'presenter_namespace'   => 'App\\Presenters',

    ...
];
Enter fullscreen mode Exit fullscreen mode

Using the Presenter Generated Class

After you create the presenter class, you need to register it on the Model by adding the $presenters protected property:

use App\Presenters\UserPresenter;
use Coderflex\LaravelPresenter\Concerns\CanPresent;
use Coderflex\LaravelPresenter\Concerns\UsesPresenters;
// ...

class User extends Authenticatable implements CanPresent
{
    use UsesPresenters;

    protected $presenters = [
        'default' => UserPresenter,
    ];
}
Enter fullscreen mode Exit fullscreen mode

By default, the type of your presenter class is default, but you can use as many of presenters you want, just by identifying the type in $presenters property.

Real Life Example

Now, after we generated the presenter class, and we implemented it successfully in our model, we can use it like so:

In your UserPresenter class or any presenter class you generated.

...
class UserPresenter extends Presenter
{
    public function fullName()
    {
        return "{$this->model->first_name} {$this->model->last_name}";
    }
}
...
Enter fullscreen mode Exit fullscreen mode

We add a new method to present the fullName.

In your blade or any place you want, you can do:

$user->present()->fullName
Enter fullscreen mode Exit fullscreen mode

Your application will show the full name from the method you added.

Adding Another Presenter Type:

Like I said above, by default the type will be deafult but, you can add more types as you need.

Here is an example:

use App\Presenters\UserPresenter;
use Coderflex\LaravelPresenter\Concerns\CanPresent;
use Coderflex\LaravelPresenter\Concerns\UsesPresenters;
// ...

class User extends Authenticatable implements CanPresent
{
    use UsesPresenters;

    protected $presenters = [
        'default' => UserPresenter,
        'setting' => UserSettingPresenter,
    ];
}
Enter fullscreen mode Exit fullscreen mode

Generate new UserSettingPresenter

php artisan presenter:make UserSettingPresenter
Enter fullscreen mode Exit fullscreen mode

Add anything to UserSettingPresenter method

...
class UserSettingPresenter extends Presenter
{
    public function lang()
    {
        return $this->model->settings->defaultLang;
    }
}
...
Enter fullscreen mode Exit fullscreen mode

Finally, set setting as a type:

$user->present('setting')->lang;
Enter fullscreen mode Exit fullscreen mode

By that, you can split your logic and make your code base even cleaner.

Changelog

You can follow the changes on this package by accessing the changelog or the releases

Contributing

If you want to contribute, feel free to read the CONTRIBUTING guidelines, and make your PR

Conclusion

Today we s learned about Laravel Presenter package, and how to use it. To make our development process easier and save us time.

Top comments (0)