談可維護性與彈性設計
mombuyish
@yishlai
yish
渲染畫面、畫面最終輸出的結果
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
@foreach($posts as $post)
<div>
<img src="{{ $post->name }}">
<div class="caption">
<h3>{{ $post->title }}</h3>
<p>{{$post->description }}</p>
</div>
</div>
@endforeach
</div>
<div>
{!! $posts->links() !!}
</div>
</div>
@stop
回傳指定格式資料
[
{
id: 1,
user_id: 2,
title: "Hayley Satterfield",
description: "Voluptatem ab est enim id.",
status: 1,
created_at: "2017-05-13 10:16:00",
updated_at: "2017-05-13 10:16:00"
},
{
id: 2,
user_id: 3,
title: "Rusty Batz",
description: "Dolore et non eos molestiae voluptates sit.",
status: 1,
created_at: "2017-05-13 10:16:00",
updated_at: "2017-05-13 10:16:00"
},
....
]
放置接口呼叫方法,並 response 結果
<?php
//PostController
public function store(Request $request)
{
$post = $this->postService->create($request->all());
return redirect()->to(route('posts.show', $post->id));
}
僅用於放置 Relations, Scope 和 Eloquent 類的方法
<?php
//Post
namespace App\Entities;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = [
'subject', 'description', 'status'
];
protected $table = 'posts';
public function comments()
{
return $this->hasMany(Comment::class);
}
}
<?php
//web.php
Route::get('/', function (Post $post) {
return view('posts.index', compact('post'));
});
//api.php
Route::get('/', function(Post $post) {
return response()->json($post->all());
});
ABC
就是過去的你
* 也許是未來的你(通常就是)
Controller
Model
View
Response
HTTP REQUEST
middleware
Foundation
Repository
Roadmap
與 Entities 和 DB 做查詢邏輯與資源庫
* 加入標籤
把 Repository DI 到 Service
Controller
Model
View
Response
HTTP REQUEST
middleware
Foundation
Repository
Roadmap
Service
放置商業邏輯與流程
Accessors/Mutators
https://laravel.com/docs/5.4/eloquent-mutators#accessors-and-mutators
是要讓 Model 腫起來嗎
他負責的事情已經很多了
Controller
Model
View
Response
HTTP REQUEST
middleware
Foundation
Repository
Roadmap
Service
Presenter
轉換渲染顯示
//UserTransformer
//UserController
//UserTransformer
Controller
Model
View
Response
HTTP REQUEST
middleware
Foundation
Repository
Roadmap
Service
Presenter
Transformer
轉換資料
A
B
加入 Formatter,讓每次資料 response 前經過這層處理制定格式
A
B
Controller
Model
View
Response
HTTP REQUEST
middleware
Foundation
Repository
Roadmap
Service
Presenter
Formatter
Transformer
制定回傳格式
Post.php
Controller
Model
View
Response
HTTP REQUEST
middleware
validation
Foundation
Repository
Roadmap
Service
Presenter
Formatter
Transformer
Foundation
獨立運行方法/額外掛載功能
我在每個專案都要這樣用嗎?
依照情境和專案複雜度。
舉例來說如果今天 CURD 相當單純沒有邏輯判斷(或簡單邏輯判斷)直接用上 Repository or Eloquent 也沒有問題。
這些做法是怎麼產生的?
需求,在寫測試時因為職責分配不清導致難以寫 test case,表示不單一職責,一個類負責太多事。
每個累就只會有一種改變的理由
和夥伴們一起取得共識
https://github.com/Mombuyish/Laravel-Oh-Generators
$ php artisan make:service UserService
<?php
class PostsController extends Controller
{
public function show(Post $post, PostFormatter $formatter, PostTransformer $transformer)
{
return response()->json($formatter->format($transform->transform($post)));
}
}
// or using help methods.
public function show(Post $post)
{
return response()->json(
format(request(), PostFormatter::class,
transform(PostTransformer::class, $post)));
}