engageinteractive / laravel-view-models
在您的blade文件和JSON响应中使用视图模型而不是数据库模型。
2.0.1
2024-09-25 10:34 UTC
Requires
- laravel/framework: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- mockery/mockery: ^1.2
- orchestra/testbench: ^7
- phpunit/phpunit: ^9
This package is auto-updated.
Last update: 2024-09-25 10:34:28 UTC
README
在blade文件和JSON响应中使用映射器/视图模型而不是数据库模型的简单模式。
安装
composer require engageinteractive/laravel-view-models
映射器
创建一个映射器,用于为您的Eloquent模型构建视图模型
namespace App\Domain\Posts; use EngageInteractive\LaravelViewModels\Mapper; use App\Domain\Posts\Post; class PostShowMapper extends Mapper { /** * Map a Post to a basic PHP array. * * @param \App\Domain\Posts\Post * @return array */ public function map(Post $post) { return $post->only('title', 'author_name'); } }
通过容器在控制器中请求映射器实例
namespace App\Domain\Posts; use App\Domain\Posts\Post; use App\Domain\Posts\PostMapper; use App\Http\Controllers\Controller; class PostController extends Controller { /** * Show a Post. * * @param \App\Domain\Posts\Post * @param \App\Domain\Posts\PostMapper * @return \Illuminate\Views\View */ public function show(Post $post, PostShowMapper $model) { return view('post.show', [ 'model' => $mapper->one($post), ]), } }
视图模型
创建一个视图模型,以构建传递给视图的数据
namespace App\Domain\Posts; use EngageInteractive\LaravelViewModels\ViewModel; use Illuminate\Support\Str; class PostViewModel extends ViewModel { protected $post; /** * Intialise the View ViewModel. * * @param \App\Domain\Posts\Post * @return void */ public function __construct(Post $post): void { $this->post = $post; } /** * Returns the post title in title-case. * * @return string */ public function postTitle(): string { if (!isset($this->post->title)) { return 'Untitled'; } return Str::title($this->post->title); } }
将ViewModel数组传递给视图
namespace App\Domain\Posts; use App\Domain\Posts\Post; use App\Domain\Posts\PostViewModel; use App\Http\Controllers\Controller; class PostController extends Controller { /** * Show a Post. * * @param \App\Domain\Posts\Post * @return \Illuminate\Views\View */ public function show(Post $post) { $model = new PostViewModel($post); return view('post.show', $model->array()), } }
以下是将数据传递给视图的示例
[
'model' => [
'post_title' => 'This Is The Title',
],
]
结合视图模型和映射器
首先,为帖子创建一个映射器。
namespace App\Domain\Posts; use EngageInteractive\LaravelViewModels\Mapper; use App\Domain\Posts\Post; class PostsMapper extends Mapper { /** * Map a Post to a basic PHP array. * * @param \App\Domain\Posts\Post * @return array */ public function map(Post $post) { return $post->only('title', 'author_name'); } }
创建一个ViewModel,并调用映射器。
namespace App\Domain\Posts; use EngageInteractive\LaravelViewModels\ViewModel; use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Str; class PostArchiveViewModel extends ViewModel { protected $posts; /** * Initialise the View model. * * @param \Illuminate\Database\Eloquent\Collection * @return void */ public function __construct(Collection $posts): void { $this->posts = $posts; } /** * Returns an array of posts. * * @return string */ public function posts(): array { return (new PostsMapper)->all($this->posts); } /** * Returns the application home URI. * * @return string */ public function HomeUri(): string { return route('home'); } }
将视图模型传递给视图,并将帖子映射到所需的格式。
namespace App\Domain\Posts; use App\Domain\Posts\Post; use App\Domain\Posts\PostArchiveViewModel; use App\Http\Controllers\Controller; class PostArchiveController extends Controller { /** * Show a Post. * * @return \Illuminate\Views\View */ public function show() { $posts = Post::all(); $model = new PostArchiveViewModel($posts); return view('post-archive.show', $model->array()), } }
Laravel 兼容性
在Laravel 5.5+上运行。
许可
Laravel 视图模型是开源软件,根据MIT许可证许可。