hardevine / laravel-auto-presenter
一个自动装饰模型为展示对象(presenter objects)的系统。
Requires
- php: ^7.1.3 || ^8.0
- illuminate/container: ^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0
- illuminate/contracts: ^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0 || ^10.0
- illuminate/events: ^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0 || ^10.0
- illuminate/pagination: ^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0 || ^10.0
- illuminate/support: ^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0 || ^10.0
- illuminate/view: ^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0 || ^10.0
Requires (Dev)
- graham-campbell/analyzer: ^2.4 || ^3.0
- graham-campbell/testbench: ^5.4
- mockery/mockery: ^1.3.1
- phpunit/phpunit: ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.7
This package is auto-updated.
Last update: 2024-09-07 10:04:15 UTC
README
此包在视图渲染过程中自动装饰与视图绑定对象。
特性
- 自动装饰与视图绑定对象
- 自动装饰分页实例内的对象
- 自动装饰数组和集合内的对象
安装
Laravel Auto Presenter 需要 PHP 7.1-8.1,并支持 Laravel 5.5-9。如果您需要支持旧版本的 Laravel 或 PHP 版本,请选择 Laravel Auto Presenter 的旧版本。
要获取最新版本,只需使用 Composer 依赖此项目。
$ composer require mccool/laravel-auto-presenter
安装后,如果您不使用自动包发现,则需要将 McCool\LaravelAutoPresenter\AutoPresenterServiceProvider
服务提供者在您的 config/app.php
文件中注册。
您还可以可选地别名我们的外观
'AutoPresenter' => McCool\LaravelAutoPresenter\Facades\AutoPresenter::class,
升级
版本 6 到 7
在 Laravel Auto Presenter 7 中,请注意
- 现在支持 Laravel 5.5-8。如果您需要 L5.1-5.4,请使用 V6。
- 我们新的最低 PHP 版本要求是 7.1.3,比 7.0.0 提高了一步。
版本 5 到 6
从 Laravel Auto Presenter 5 升级到 6,请注意
- 我们有一个新的
Decoratable
接口来决定关系是否可以被装饰。虽然这并不是一个 BC 断裂,因为HasPresenter
继承了它,但这确实值得注意。 - v6 现在支持 Laravel 5.5,同时仍然支持 5.1+。
- 我们新的最低 PHP 版本要求是 7.0.0,比 5.5.9 提高了一步。
版本 4 到 5
如果您是从 Laravel Auto Presenter 4 升级到 5,请注意
BasePresenter
不再具有构造函数,因此您不能调用parent::__construct($resource)
。- 模型现在使用继承自
BasePresenter
的setWrappedObject
方法进行注入。 - V5 现在也支持 Laravel 5.4 以及 5.1、5.2 和 5.3。
用法
为了说明如何使用,我们将假设我们有一个 Eloquent Post 模型。它不一定是 Eloquent,它可以是任何类型的类。但是,这是一个正常的情况。Post 模型代表一篇博客文章。
这里使用的是非常基本的代码示例,所以请只关注如何使用自动展示器,并忽略其他内容。
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'); } }
此外,我们还需要一个控制器...
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')); } }
以及一个视图...
@foreach($posts as $post) <li>{{ $post->title }} - {{ $post->published_at }}</li> @endforeach
在这个例子中,published_at 属性可能具有如下格式:“Y-m-d H:i:s” 或 “2013-08-10 10:20:13”。在现实世界中,我们不希望在视图中看到这种格式。因此,让我们创建一个展示器,以便我们可以更改 Post 类的数据在视图中的渲染方式。
use Carbon\Carbon; use Example\Accounts\Post; use McCool\LaravelAutoPresenter\BasePresenter; class PostPresenter extends BasePresenter { public function published_at() { $published = $this->wrappedObject->published_at; return Carbon::createFromFormat('Y-m-d H:i:s', $published) ->toFormattedDateString(); } }
请注意,模型是通过调用继承自 BasePresenter
的 setWrappedObject
方法注入的。
我们需要 post 类实现该接口。
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; } }
现在,没有任何其他更改,我们的视图将以所需格式显示日期。
Decoratable
接口用于允许模型的关系被装饰,而 HasPresenter
接口(它扩展了该接口)用于让模型本身被装饰。
故障排除
如果视图中的对象没有被正确装饰,那么它很可能在视图开始渲染时不存在。例如,延迟加载的关系不会被装饰。您可以通过预加载它们来修复此问题。Auth::user() 将永远不会被装饰。我更喜欢将 $currentUser 绑定到我的视图中。
如果一个对象是另一个对象的关系,并且它没有在视图中装饰,那么你可能没有将该对象的Decoratable
接口添加到其他对象中。为了解决这个问题,请将Decoratable
接口添加到其他对象中。
安全
如果你在此软件包中发现安全漏洞,请发送电子邮件至security@tidelift.com。所有安全漏洞都将得到及时处理。您可以在此查看我们的完整安全政策这里。
许可协议
Laravel Auto Presenter遵循MIT许可协议(MIT)。
企业版
作为Tidelift订阅的一部分提供
mccool/laravel-auto-presenter
的维护者以及成千上万的其他包维护者正在与Tidelift合作,为构建应用程序时使用的开源依赖项提供商业支持和维护。节省时间,降低风险,并提高代码质量,同时为使用的确切依赖项支付维护者费用。了解更多。