hossam-tarek/laravel-presenter

介绍 Laravel 的 Presenter 模式实现

v1.0.1 2023-08-19 21:23 UTC

This package is auto-updated.

Last update: 2024-09-15 20:10:26 UTC


README

Laravel Presenter 包是一个优雅的解决方案,它将 Presenter 设计模式无缝集成到您的 Laravel 应用程序中。该包通过将数据格式化和操纵逻辑从模型和视图中分离出来,帮助提高代码库的可维护性和可读性。

内容

Presenter 模式的优势

Presenter 模式提供了几个关键优势

  • 代码分离: Presenter 将数据操纵逻辑与您的模型分离,防止模型被与展示相关的代码所充斥。
  • 更清洁的视图: 通过在 Presenter 中格式化数据,您的视图可以专注于显示数据而不是实现逻辑。
  • 可重用性: Presenter 允许您在多个视图中重用相同的格式化逻辑,确保一致的数据表示。
  • 可维护性: 将格式化逻辑隔离在 Presenter 中简化了未来的更改,使代码维护更加流畅。

安装

您可以通过执行以下命令轻松通过 Composer 安装 Laravel Presenter 包

composer require hossam-tarek/laravel-presenter

如果您使用的是 Laravel 5.5 之前的版本,请确保将 LaravelPresenterServiceProvider 包含在您的 config/app.php 文件中。

'providers' => [
    // Other providers
    HossamTarek\LaravelPresenter\LaravelPresenterServiceProvider::class,
],

创建新的 Presenter

  • 要创建一个新的 Presenter,您可以使用以下 Artisan 命令

    php artisan make:presenter {className}

    {className} 替换为您希望您的 Presenter 所使用的名称。此命令将在 app/Presenters 目录下生成一个新的 Presenter 类。

  • 通过将 HasPresenter 特性导入到您的模型中,并设置 $presenterName 变量来关联 Presenter

    use HossamTarek\LaravelPresenter\Traits\HasPresenter;
    use App\Presenters\OrderPresenter;
    
    class User extends Model
    {
        use HasPresenter;
    
        protected static $presenterName = UserPresenter::class;
    }

使用

避免在您的视图中重复以下逻辑,并违反 SOLID 原则

@if(empty($user_website_url))
    <p>{{ $user->first_name }} {{ $user->last_name }}</p>
@else
    <p>
        <a target="_blank" href="{{ $user->website_url }}">
            {{ $user->first_name }} {{ $user->last_name }}
        </a>
    </p>
@endif

使用命令 php artisan make:presenter UserPresenter 创建一个新的 UserPresenter,并将展示逻辑放在其中。

然后将 UserPresenterUser 模型关联,并使用 HasPresenter 特性。

class User extends Model
{
    use \HossamTarek\LaravelPresenter\Traits\HasPresenter;
    
    protected static $presenterName = UserPresenter::class;
}

现在使用 UserPresenter 将展示逻辑从视图和模型中分离出来。

class UserPresenter extendsPresenter
{
    protected $model;
    
    public function formattedName($class = '')
    {
        if (empty($user->website_url)) {
            return "<p class='{$class}'>{$user->first_name} {$user->last_name}</p>"
        }
        
        return <<<HTML
            <p class="{$class}">
                <a target="_blank" href="{$user->website_url}">{$user->first_name} {$user->last_name}</a>
            </p>
        HTML;
    }
}

现在您已经准备好释放 Presenter 模式的力量了。

在您的视图中

{!! $user->formattedName() !!}

如果没有参数,则使用更短的语法(蛇形命名法),不使用括号,就像它是对象的属性一样。

{!! $user->formatted_name !!}

如果您想为 p 标签添加更多自定义类。

{!! $user->formattedName("mx-2 my-3") !!}

贡献

我们非常重视您的贡献,因为我们共同努力增强 Laravel Presenter 包。请随时报告问题并提出改进建议,以解锁干净代码、组织结构以及提高可维护性的力量。

许可证

Laravel Presenter 包是在 MIT 许可下许可的开源软件。

鸣谢

Laravel Presenter 包由 Hossam Tarek 撰写和维护。