狠狠撸

狠狠撸Share a Scribd company logo
痴颈别飞を活用して复雑化と戦う
KenjiroKubota@Laravel LT Night#1
2017/07/26
Profile
Kenjiro Kubota
istyle.inc
?PHP,?HHVM/Hack,?Go,?Javascript?
View?Blade?で変数を操作?加工?(複雑な)判定をしていませんか
Viewに渡すあらゆる変数を一つのメソッドで頑張って準備して渡して
ませんか
痴颈别飞や颁辞苍迟谤辞濒濒别谤が复雑になってませんか
顿颈谤别肠迟颈惫别を拡张してみる
Directiveとは、
@if()
@endif
@foreach()
@endforeach
bladeでよく使うこれ。実は独自Directiveが作れるんです
class?BladeDirectiveServiceProvider?extends?ServiceProvider
{
????public?function?register()
????{
????????$blade?=?$this‐>app‐>make('view')
????????????‐>getEngineResolver()
????????????‐>resolve('blade')
????????????‐>getCompiler();
????????????
????????$blade‐>directive('implode',?function($expression)?{
????????????list($glue,?$pieces)?=
????????????? explode(',?',?str_replace(['(',?')'],?'',?$expression));
????????????return?"<?php?echo?implode({$glue},?{$pieces});??>";
????????});
????}
}
独自のServiceProviderを作成して?config/app.php?に登録
bladeで以下のように使えます
@implode('|',?['Hoge','Fuga','Piyo'])
html
Hoge|Fuga|Piyo
これは簡単な例ですが、他にも便利なディレクティブが作れそうですね
https://github.com/kubotak‐is/laravel‐blade‐expansion
拙作のライブラリです。ディレクティブ拡張の参考にどうぞ。
こんなディレクティブ欲しいなどの要望があればIssueください
痴颈别飞::厂丑补谤别を使う
View::Shareとは
Viewで利用できるグローバル変数を差し込める機能
class?ViewShareServiceProvider?extends?ServiceProvider
{
????public?function?register()
????{
????????$view?=?$this‐>app‐>make('view');
????????$view‐>share('test',?['message'?=>?'View?Share']);
????}
}
独自のServiceProviderを作成して?config/app.php?に登録
どのテンプレートでも ?{{?$test['message']?}}?で取得できる
ViewFactoeyのインスタンスさえあれば良いのでServiceProviderでの利用に限らず
Middlewareから差し込むことも可能
use?IlluminateContractsViewFactory?as?ViewFactory;
class?ViewShareMiddleware
{
????private?$view;
????public?function?__construct(ViewFactory?$viewFactory)
????{
????????$this‐>view?=?$viewFactory;
????}
????public?function?handle(Request?$request,?Closure?$next)
????{
????????$this‐>view‐>share('test',?['message'?=>?'View?Share']);
????????return?$next($request);
????}
}
特定の惭颈诲诲濒别飞补谤别を通る搁辞耻迟别の场合にのみ利用できる変数を提供できる
痴颈别飞::颁辞尘辫辞蝉别谤を使う
View::Composerとは
Shareとは異なり特定のテンプレートにだけで作用させることが可能
所謂プレゼンターやビューモデルのような振る舞い
class?ViewComposerServiceProvider?extends?ServiceProvider
{
????public?function?register()
????{
????????$view?=?$this‐>app‐>make('view');
????????$view‐>composer('welcome',?AppHttpViewComposerUserComposer::class);
????}
}
独自のServiceProviderを作成して?config/app.php?に登録
?AppHttpViewComposerUserComposer?
use?IlluminateViewView;
use?IlluminateAuthAuthManager;
class?UserComposer
{
????private?$auth;
????
????public?function?__construct(AuthManager?$authManager)
????{
????????$this‐>auth?=?$authManager‐>guard('web');
????}
????
????public?function?compose(View?$view)
????{
????????$view‐>with([
????????????'authUser'?=>?$this‐>auth‐>user()
????????]);
????}
}
?welcome.blade.php?で ?{{?$userAuth‐>id?}}?
こんな感じで利用できる。
※ 特定のテンプレートがレンダリングされる際にViewComposerが実行される
※ 颁辞尘辫辞蝉别谤の他にも痴颈别飞インスタンス生成时に起动する痴颈别飞::颁谤别补迟辞谤もあるよ
まとめ
細かい値の操作などはテンプレートで直接行わずに独自のディレクティブを作ろう
そもそもViewに渡す前に適切な整形を行うべきです。
Viewで利用する変数をすべてControllerで生成しないでViewShare,Composerを活用して
分離する
関心を分離 ‐> 単一責務の原則
Laravel Viewにはこのような便利な機能を標準で持っているのでどんどん活用していこ
う!
thanks :?

More Related Content

痴颈别飞を活用して复雑化と戦う