daniiltserin / 演示者
Laravel 的简单视图演示者库。
Requires
- php: >=5.5.9
README
视图演示者是一种非常实用的装饰对象绑定的方法。这允许你在合理的位置执行与视图相关的逻辑,而不是直接在视图中或更糟糕的是在你的模型中放置它。
还有其他几个 库 提供类似的功能。这个包仅仅是我的首选实现,因为所有配置都是独立于被装饰的对象。
安装
您可以使用 Composer 安装此包
$ composer require daniiltserin/presenter
或在您的 composer.json
{ "require": { "daniiltserin/presenter": "*" } }
运行 composer update
后,您需要在您的 config/app.php
文件中注册 服务提供者。
'providers' => [ Daniiltserin\Presenter\PresenterServiceProvider::class ]
使用
配置演示者
有几种配置演示者的方法。首先,您可以利用配置文件,可以使用以下命令发布
$ php artisan vendor:publish --provider="Daniiltserin\Presenter\PresenterServiceProvider"
默认情况下没有配置演示者。发布的文件仅包含有关如何配置您的演示者的说明。您必须提供一组键值对,将对象与其演示者链接起来。
return [ App\User::class => App\Presenters\UserPresenter::class, App\Post::class => App\Presenters\PostPresenter::class ];
如果您愿意,可以直接在装饰器上设置演示者的数组。您可能选择从服务提供者那里这样做。
$this->app['decorator']->setBindings([ \App\User::class => \App\Presenters\UserPresenter::class, \App\Post::class => \App\Presenters\PostPresenter::class ]);
最后,您可以使用 register
方法逐个配置演示者,同样,在提供者内部。
$this->app['decorator']->register(\App\User::class, \App\Presenters\UserPresenter::class);
创建演示者
演示者应该扩展自 Daniiltserin\Presenter\AbstractPresenter
,然而,这并不是必须的,但强烈推荐,因为您将能够访问几个方法和魔法方法,它们提供了一些有用的功能。
我喜欢将我的演示者放在 Presenters
文件夹中,但是您可以根据自己的喜好组织。
namespace App\Presenters; use Daniiltserin\Presenter\AbstractPresenter; class UserPresenter extends AbstractPresenter { }
如果您想注入依赖项,唯一的要求是您必须命名一个参数 $object
,以便 Laravel 可以正确注入绑定的对象,并且您需要调用父构造函数。
namespace App\Presenters; use App\SomeNamespace\SomeClass; use Daniiltserin\Presenter\AbstractPresenter; class UserPresenter extends AbstractPresenter { protected $class; public function __construct($object, SomeClass $class) { $this->class = $class; parent::__construct($object); } }
然后您的演示者可以定义方法来执行可以在您的视图中使用的逻辑。
public function prettySlug() { return '/'.ltrim($this->slug, '/'); }
您可以直接引用包装对象的属性(如上所示),或使用 $object
属性。
public function prettySlug() { return '/'.ltrim($this->object->slug, '/'); }
从视图内部
现在您已经配置了演示者并创建了它们,您只需要在视图内部使用它们。只需调用您定义的方法或属性即可。
{{ $post->prettySlug }} Or: {{ $post->prettySlug() }}
您仍然可以访问您的关系和其他模型属性。
{{ $post->title }} @foreach($post->comments as $comment) ... @endforeach
享受
这就是全部内容。