mccool / laravel-auto-presenter

一个用于自动装饰模型为展示对象的系统。

7.7.0 2022-02-09 09:14 UTC

README

此包在视图渲染过程中自动装饰绑定到视图的对象。

Banner

Build Status StyleCI Status Software License Packagist Downloads Latest Version

特性

  • 自动装饰绑定到视图的对象
  • 自动装饰分页实例内的对象
  • 自动装饰数组和集合内的对象

安装

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)
  • 现在通过继承自 BasePresentersetWrappedObject 方法注入模型。
  • 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接口添加到另一个对象中。

安全

如果您在这个包中发现了安全漏洞,请发送电子邮件到[email protected]。所有安全漏洞都将得到及时处理。您可以在这里查看我们的完整安全策略这里

许可证

Laravel Auto Presenter遵循MIT许可证(MIT)

企业版

作为Tidelift订阅的一部分提供

mccool/laravel-auto-presenter的维护者以及成千上万的其他包维护者正在与Tidelift合作,为构建应用程序时使用的开源依赖项提供商业支持和维护。节省时间,降低风险,并提高代码质量,同时支付您实际使用的依赖项的维护者。了解更多信息请点击这里。