hardevine/laravel-auto-presenter

一个自动装饰模型为展示对象(presenter objects)的系统。

4.0 2023-11-07 08:18 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();
    }
}

请注意,模型是通过调用继承自 BasePresentersetWrappedObject 方法注入的。

我们需要 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合作,为构建应用程序时使用的开源依赖项提供商业支持和维护。节省时间,降低风险,并提高代码质量,同时为使用的确切依赖项支付维护者费用。了解更多。