coderflexx / laravel-presenter
Write Clean/Reusable Code with Presenters.
Fund package maintenance!
coderflex
Installs: 82 807
Dependents: 1
Suggesters: 0
Security: 0
Stars: 28
Watchers: 0
Forks: 4
Open Issues: 0
Requires
- php: ^8.0|^8.1
- illuminate/console: ^8.75|^9.0|^10.0|^11.0
- illuminate/contracts: ^8.0|^9.0|^10.0|^11.0
- spatie/laravel-package-tools: ^1.9.2
Requires (Dev)
- nunomaduro/collision: ^5.10|^6.1|^7.0|^8.1
- nunomaduro/larastan: ^1.0|^2.0
- orchestra/testbench: ^8.0|^9.0
- pestphp/pest: ^1.22|^2.34
- pestphp/pest-plugin-laravel: ^1.3|^2.3
- phpstan/extension-installer: ^1.2
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5|^10.0
README
A clean way to present your model attributes without putting them in the wrong file.
Installation
You can install the package via composer:
composer require coderflexx/laravel-presenter
You can publish the config file with:
php artisan vendor:publish --provider="Coderflex\LaravelPresenter\LaravelPresenterServiceProvider"
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', ];
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; // ... }
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 UserPresenter
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 { // }
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 presenter:make App\Models\Presenter\UserPresenter
Or change presenter_namespace
from config/laravel-presenter
file.
return [ ... 'presenter_namespace' => 'App\\Presenters', ... ];
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, ]; }
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.
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}"; } } ...
We add a new method to present the fullName
.
In your blade or any place you want, you can do:
$user->present()->fullName
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 default
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, ]; }
Generate new UserSettingPresenter
php artisan presenter:make UserSettingPresenter
Add anything to UserSettingPresenter
method
... class UserSettingPresenter extends Presenter { public function lang() { return $this->model->settings->defaultLang; } } ...
Finally, set setting
as a type:
$user->present('setting')->lang;
By that, you can split your logic and make your code base even cleaner.
Testing
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
License
The MIT License (MIT). Please see License File for more information.