Slide 1

Slide 1 text

Laravel における Blade 拡張の ツラミ 第128回 PHP勉強会@東京

Slide 2

Slide 2 text

Laravel における Blade 拡張の ツラミ 第128回 PHP勉強会@東京 誰か . 助けて .

Slide 3

Slide 3 text

岡田 正平(おかだ しょうへい)@okashoi • 株式会社ウィルゲート 2015年新卒入社 • 開発室 ソリューションユニット 所属 • PHP, Laravel, Vue.js 3 自己紹介 Slides:

Slide 4

Slide 4 text

4 Blade ディレクティブ( @~ )は拡張できる ※ Blade … Laravel で採用されているテンプレートエンジン

Slide 5

Slide 5 text

5 原理説明 fuga'; }); } ↑これを書いておくと @hoge
fuga
このように展開される

Slide 6

Slide 6 text

やりたいこと @js(/index.js) と書くと、JS ファイルのタイムスタンプを パラメータとして付与して といった感じで展開させる 6 例)Cache busting を考える

Slide 7

Slide 7 text

7 とりあえずやってみる public function boot() { ¥Blade::directive('js', function ($path) { $fullPath = public_path('js' . $path); $src = "/js{$path}?v=" . ¥File::lastModified($fullPath); return ""; });

Slide 8

Slide 8 text

8 とりあえずやってみる public function boot() { ¥Blade::directive('js', function ($path) { $fullPath = public_path('js' . $path); $src = "/js{$path}?v=" . ¥File::lastModified($fullPath); return ""; }); ファイルのタイムスタンプを取得

Slide 9

Slide 9 text

9 とりあえずやってみる:結果 @js(/index.js) 一見よさそう

Slide 10

Slide 10 text

50点

Slide 11

Slide 11 text

storage/framework/views 下のキャッシュファイルの中身もまた (view キャッシュが残っている限り) JS ファイルのタイムスタンプが更新されても反映されない 11 なぜ?

Slide 12

Slide 12 text

storage/framework/views 下のキャッシュファイルの中身もまた (view キャッシュが残っている限り) JS ファイルのタイムスタンプが更新されても反映されない ➢ Blade ディレクティブは echo をする PHP タグを文字列として返さないといけない 12 なぜ?

Slide 13

Slide 13 text

「文字列リテラルはシングルクオートね(^^)」を守ると 13 書き換え① public function boot() { ¥Blade::directive('js', function ($path) { $fullPath = public_path('js' . $path); return '¥' ?>'; });

Slide 14

Slide 14 text

「文字列リテラルはシングルクオートね(^^)」を守ると 14 書き換え① public function boot() { ¥Blade::directive('js', function ($path) { $fullPath = public_path('js' . $path); return '¥' ?>'; }); 主にこのへんが ツライ

Slide 15

Slide 15 text

ダブルクオートを使って変数展開を活用 15 書き換え② public function boot() { ¥Blade::directive('js', function ($path) { $fullPath = public_path('js' . $path); return "' ?>"; }); 多少はマシ?でもやっぱりツライ

Slide 16

Slide 16 text

動的に変わるのは下線の部分だけなので、そこだけを echo する 16 書き換え③

Slide 17

Slide 17 text

動的に変わるのは下線の部分だけなので、そこだけを echo する 17 書き換え③ public function boot() { ¥Blade::directive('js', function ($path) { $fullPath = public_path('js' . $path); return "¥">"; }); 思ったよりツラミは改善されない

Slide 18

Slide 18 text

• ほかにも sprintf() とか使って頑張ってみても全然可読にならない • ていうかこんなコードメンテしたくない! • 欲しい文字列(HTMLタグ)を返すメソッドが生えたクラスを用意して Facade とかにして ってした方が圧倒的に楽 • Balde 拡張の意義って一体……? 18 そんなことより {!! ViewHelper::js('/index.js') !!}

Slide 19

Slide 19 text

Blade 拡張のうまい使い道を 知ってる方は教えてください 19 というわけで…… 完