Slide 1

Slide 1 text

ビューコンポーザーで コントローラを キレイにする 01/26 PHPカンファレンス仙台 前田 和人

Slide 2

Slide 2 text

自己紹介 ■ 前田 和人 ■ @chiroruxxxx ■ 弁護士ドットコム株式会社 ■ ペチカ堂が好き

Slide 3

Slide 3 text

注意事項 ■ Laravelベースで話をすすめます ■ 他のFWでも似たような機能があるので、 脳内置換してください Symfony Embed controller in Template Cake PHP View cell Yii Widget

Slide 4

Slide 4 text

本題

Slide 5

Slide 5 text

最初はキレイだったコードも・・・ ■ ブログの記事ページで例えます public function show(Post $post) { return view('posts.show', compact('post')); }

Slide 6

Slide 6 text

度重なる仕様追加によって・・・ カテゴリーの一覧を 出したい 検索フォームあったら 便利だよね ログイン導線も 関連記事も

Slide 7

Slide 7 text

長くなりますよね・・・ public function show(Post $post) { $categories = Category::all(); foreach ($categories as $key => $category) { $category->count = Category::where('id', $category->id)->count(); $categories->put($key, $category); } $searchFormAttributes = [ 'type' => PostType::all()->pluck('value', 'id'), 'max' => 120, 'categories' => $categories->push(['name' => 'なし', 'id' => ''])->pluck('name', 'id'), ]; if (Auth::check()) { $user = Auth::user(); } else { $user = new User; } $relatedPosts = $post->relatedPosts; if ($relatedPosts->count() < 5) { $addPosts = Post::orderBy('id', 'desc')->take(5 - $relatedPosts->count())->get(); $relatedPosts = $relatedPosts->merge($addPosts); } return view( 'posts.show’, compact('posts', 'categories', 'searchFormAttributes', 'user', 'relatedPost’) ); }

Slide 8

Slide 8 text

public function show(Post $post) { $categories = Category::all(); foreach ($categories as $key => $category) { $category->count = Category::where('id', $category->id)->count(); $categories->put($key, $category); } $searchFormAttributes = [ 'type' => PostType::all()->pluck('value', 'id'), 'max' => 120, 'categories' => $categories->push(['name' => 'なし', 'id' => ''])->pluck('name', 'id'), ]; if (Auth::check()) { $user = Auth::user(); } else { $user = new User; } $relatedPosts = $post->relatedPosts; if ($relatedPosts->count() < 5) { $addPosts = Post::orderBy('id', 'desc')->take(5 - $relatedPosts->count())->get(); $relatedPosts = $relatedPosts->merge($addPosts); } return view( 'posts.show’, compact('posts', 'categories', 'searchFormAttributes', 'user', 'relatedPost’) ); } 長くなりますよね・・・ カテゴリー一覧 検索フォーム ログイン関係 関連記事

Slide 9

Slide 9 text

設計は難しい ■ 「チョットデキル」達の言うことはわかる – モデルに処理を書け! – サービスクラスを作れ! ■ シンプルな設計を習得するのは難しい – チームの技術力によって最適解は違いそう ■ 簡単にコントローラーの処理をキレイにしたい

Slide 10

Slide 10 text

ビューコンポーザー のご提案

Slide 11

Slide 11 text

ビューコンポーザーとは ■ ビューコンポーザはビューがレンダーされる時に呼び出 される、コールバックかクラスメソッドのことです。 ビューがレンダーされるたびに結合したい情報があるな ら、ビューコンポーザがロジックを一箇所にまとめるの に役立ちます。 – https://readouble.com/laravel/5.5/ja/views.html ■ なるほどわからん。

Slide 12

Slide 12 text

■ 今まで コントローラ ビュー ビューコンポーザーの概要 検索フォーム 記事 カテゴリー ログイン導線 関連記事

Slide 13

Slide 13 text

■ ビューコンポーザーを使うと ビュー ビューコンポーザーの概要 検索フォーム 記事 カテゴリー ログイン導線 関連記事 コンポーザー コンポーザー コンポーザー コンポーザー コントローラ

Slide 14

Slide 14 text

ビューのレンダリング 内部処理の流れ コントローラから ビューを呼び出す サブビューを 呼び出す ViewComposerの 処理を実行する サブビューの レンダリング

Slide 15

Slide 15 text

ビューコンポーザーを使った結果 ■ コントローラー public function show(Post $post) { return view('posts.show', compact('post')); }

Slide 16

Slide 16 text

ビューコンポーザーを使った結果 ■ コンポーザー(検索フォーム) public function compose(View $view) { $attributes = [ 'type' => PostType::all()->pluck('value', 'id'), 'max' => 120, 'categories' => Category::all()-> //... ]; $view->with('attributes', $attributes); }

Slide 17

Slide 17 text

まとめ ■ ビューコンポーザーを使うと 簡単にビューの処理を分離できるよ! ■ は関係ないよ!