最近,我在一个 laravel 项目中负责用户管理模块。用户数据存储在数据库中,包含姓名、邮箱、注册时间等字段。在用户列表页面,我们需要将用户的姓名以首字母大写的形式显示,并在用户详情页面显示格式化的注册时间。 如果直接在视图层或控制器中处理这些格式化工作,代码会变得非常混乱,而且难以维护和测试。
为了解决这个问题,我引入了 datacreativa/laravel-presentable 包。安装过程非常简单,只需要使用 composer:
composer require datacreativa/laravel-presentable
安装完成后,我们需要在 Eloquent 模型中使用 HasPresentable trait 并指定 Presenter 类:
use AppModelsPresentersUserPresenter;use TheHiveTeamPresentableHasPresentable;class User extends Model{ use HasPresentable; protected $presenter = UserPresenter::class;}
然后,使用 Artisan 命令生成 Presenter 类:
php artisan make:presenter UserPresenter
在 UserPresenter 类中,我们可以定义各种方法来处理模型数据的呈现逻辑:
namespace AppModelsPresenters;use TheHiveTeamPresentablePresenter;use CarbonCarbon;class UserPresenter extends Presenter{ public function formattedName() { return ucwords($this->model->name); } public function formattedRegistrationDate() { return Carbon::parse($this->model->created_at)->format('Y-m-d H:i:s'); }}
现在,我们可以在模型中直接使用 present() 方法访问 Presenter 中定义的方法:
$user = User::find(1);echo $user->present()->formattedName(); // 输出首字母大写的用户名echo $user->present()->formattedRegistrationDate(); // 输出格式化的注册时间
通过这种方式,我们成功地将数据呈现逻辑从模型和视图层分离出来,使得代码更加清晰、模块化,也更易于维护和测试。 这不仅提高了代码的可读性,也降低了后期维护的成本。 此外,Presenter 类可以方便地进行单元测试,确保数据呈现的准确性。
总结来说,datacreativa/laravel-presentable 包为我们提供了一种简洁高效的方式来处理 Eloquent 模型的数据呈现。通过使用 Presenter,我们可以将复杂的呈现逻辑封装到独立的类中,从而提高代码的可维护性和可测试性,最终提升开发效率。 如果你正在寻找一种优雅的方式来处理 Laravel 中的 Eloquent 模型数据呈现,强烈推荐你尝试一下这个包。