Package Data | |
---|---|
Maintainer Username: | ryanwinchester |
Maintainer Contact: | shawn@heybigname.com (Shawn McCool) |
Package Create Date: | 2016-02-05 |
Package Last Update: | 2016-08-05 |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2024-12-15 15:19:39 |
Package Statistics | |
---|---|
Total Downloads: | 1,542 |
Monthly Downloads: | 0 |
Daily Downloads: | 0 |
Total Stars: | 1 |
Total Watchers: | 3 |
Total Forks: | 0 |
Total Open Issues: | 0 |
This package automatically decorates objects bound to views during the view render process.
Either PHP 5.5+ or HHVM 3.6+ are required.
To get the latest version of Laravel Auto Presenter, simply require the project using Composer:
$ composer require ryanwinchester/laravel-auto-presenter
Instead, you may of course manually update your require block and run composer update
if you so choose:
{
"require": {
"ryanwinchester/laravel-auto-presenter": "^4.0"
}
}
Then, in your config/app.php
add this line to your 'providers' array.
'McCool\LaravelAutoPresenter\AutoPresenterServiceProvider',
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;
class Post extends Model
{
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 Example\Accounts\Post;
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 Example\Accounts\Post;
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;
class Post extends Model 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.
If you discover a security vulnerability within this package, please send an e-mail to Graham Campbell at graham@alt-three.com. All security vulnerabilities will be promptly addressed.
Laravel Auto Presenter is licensed under The MIT License (MIT).