This package automatically decorates objects bound to views during the view render process.
- Automatically decorate objects bound to views
- Automatically decorate objects within paginator instances
- Automatically decorate objects within collection objects
You should install this package with Composer. Add the following "require" to your composer.json
file and run the composer install
command to install it.
{
"require": {
"mccool/laravel-auto-presenter": "~3.0"
}
}
{
"require": {
"mccool/laravel-auto-presenter": "~2.2"
}
}
{
"require": {
"mccool/laravel-auto-presenter": "~1.2"
}
}
Then, in your config/app.php
add this line to your 'providers' array.
'McCool\LaravelAutoPresenter\LaravelAutoPresenterServiceProvider',
To show how it's used, we'll pretend that we have an Eloquent Post model. It doesn't have to be Eloquent, it could be any kind of class. But, this is a normal situation. The Post model represents a blog post.
I'm using really basic code examples here, so just focus on how the auto-presenter is used and ignore the rest.
use Example\Accounts\User;
use Illuminate\Database\Eloquent\Model as Eloquent;
class Post extends Eloquent
{
protected $table = 'posts';
protected $fillable = ['author_id', 'title', 'content', 'published_at'];
public function author()
{
return $this->belongsTo(User::class, 'author_id');
}
}
Also, we'll need a controller..
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\View;
class PostsController extends Controller
{
public function getIndex()
{
$posts = Post::all();
return View::make('posts.index', compact('posts'));
}
}
and a view...
@foreach($posts as $post)
<li>{{ $post->title }} - {{ $post->published_at }}</li>
@endforeach
In this example the published_at attribute is likely to be in the format: "Y-m-d H:i:s" or "2013-08-10 10:20:13". In the real world this is not what we want in our view. So, let's make a presenter that lets us change how the data from the Post class is rendered within the view.
use Carbon\Carbon;
use McCool\LaravelAutoPresenter\BasePresenter;
class PostPresenter extends BasePresenter
{
public function __construct(Post $resource)
{
$this->wrappedObject = $resource;
}
public function published_at()
{
$published = $this->wrappedObject->published_at;
return Carbon::createFromFormat('Y-m-d H:i:s', $published)
->toFormattedDateString();
}
}
Here, the automatic presenter decorator is injecting the Post model that is to be decorated. Please be aware that the constructor parameter should always be named $resource
to allow Laravel's IoC container to correctly resolve the dependency.
We need the post class to implement the interface.
use Example\Accounts\User;
use Example\Blog\PostPresenter;
use McCool\LaravelAutoPresenter\HasPresenter;
use Illuminate\Database\Eloquent\Model as Eloquent;
class Post extends Eloquent implements HasPresenter
{
protected $table = 'posts';
protected $fillable = ['author_id', 'title', 'content', 'published_at'];
public function author()
{
return $this->belongsTo(User::class, 'author_id');
}
public function getPresenterClass()
{
return PostPresenter::class;
}
}
Now, with no additional changes our view will show the date in the desired format.
If an object isn't being decorated correctly in the view then there's a good chance that it's simply not in existence when the view begins to render. For example, lazily-loaded relationships won't be decorated. You can fix this by eager-loading them instead. Auth::user() will never be decorated. I prefer to bind $currentUser to my views, anyway.
Laravel Auto Presenter is licensed under The MIT License (MIT).