Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravel における Blade 拡張のツラミ
Search
Shohei Okada
July 25, 2018
Programming
0
17
Laravel における Blade 拡張のツラミ
2018-07-25 開催の「第128回 PHP勉強会@東京」におけるLT資料です
https://phpstudy.doorkeeper.jp/events/77255
Shohei Okada
July 25, 2018
Tweet
Share
More Decks by Shohei Okada
See All by Shohei Okada
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
1.1k
パスワードのハッシュ、ソルトってなに? - What is hash and salt for password?
okashoi
3
150
設計の考え方 - インターフェースと腐敗防止層編 #phpconfuk / Interface and Anti Corruption Layer
okashoi
10
3.3k
"config" ってなんだ? / What is "config"?
okashoi
0
1k
ファイル先頭の use の意味、説明できますか? 〜PHP の namespace と autoloading の関係を正しく理解しよう〜 / namespace and autoloading in php
okashoi
3
1.4k
MySQL のインデックスの種類をおさらいしよう! / overviewing indexes in MySQL
okashoi
0
770
PHP における静的解析(あるいはそもそも静的解析とは) / #phpcondo_yasai static analysis for PHP
okashoi
1
530
【PHPカンファレンス沖縄 2023】素朴で考慮漏れのある PHP コードをテストコードとともに補強していく(ライブコーディング補足資料) / #phpcon_okinawa 2023 livecoding supplementary material
okashoi
3
1.9k
その説明、コードコメントに書く?コミットメッセージに書く? プルリクエストに書く? - #phpconfuk 2023
okashoi
15
5.1k
Other Decks in Programming
See All in Programming
CloudNativePGを布教したい
nnaka2992
0
120
15分で学ぶDuckDBの可愛い使い方 DuckDBの最近の更新
notrogue
3
790
color-scheme: light dark; を完全に理解する
uhyo
7
500
GoとPHPのインターフェイスの違い
shimabox
2
210
CSS Linter による Baseline サポートの仕組み
ryo_manba
1
160
Webフレームワークとともに利用するWeb components / JSConf.jp おかわり
spring_raining
1
120
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
9
2.5k
From the Wild into the Clouds - Laravel Meetup Talk
neverything
0
170
Datadog DBMでなにができる? JDDUG Meetup#7
nealle
0
150
Go 1.24でジェネリックになった型エイリアスの紹介
syumai
2
300
ML.NETで始める機械学習
ymd65536
0
240
The Clean ArchitectureがWebフロントエンドでしっくりこないのは何故か / Why The Clean Architecture does not fit with Web Frontend
twada
PRO
34
9.9k
Featured
See All Featured
A better future with KSS
kneath
238
17k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Navigating Team Friction
lara
183
15k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
For a Future-Friendly Web
brad_frost
176
9.6k
How to train your dragon (web standard)
notwaldorf
91
5.9k
How GitHub (no longer) Works
holman
314
140k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Side Projects
sachag
452
42k
Gamification - CAS2011
davidbonilla
80
5.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Transcript
Laravel における Blade 拡張の ツラミ 第128回 PHP勉強会@東京
Laravel における Blade 拡張の ツラミ 第128回 PHP勉強会@東京 誰か . 助けて
.
岡田 正平(おかだ しょうへい)@okashoi • 株式会社ウィルゲート 2015年新卒入社 • 開発室 ソリューションユニット 所属
• PHP, Laravel, Vue.js 3 自己紹介 Slides:
4 Blade ディレクティブ( @~ )は拡張できる ※ Blade … Laravel で採用されているテンプレートエンジン
5 原理説明 <?php namespace App¥Providers; use Illuminate¥Support¥ServiceProvider; class AppServiceProvider extends
ServiceProvider { public function boot() { ¥Blade::directive('hoge', function () { return '<div>fuga</div>'; }); } ↑これを書いておくと @hoge <div>fuga</div> このように展開される
やりたいこと @js(/index.js) と書くと、JS ファイルのタイムスタンプを パラメータとして付与して <script src="/js/index.js?v=1532351569"></script> といった感じで展開させる 6 例)Cache
busting を考える
7 とりあえずやってみる public function boot() { ¥Blade::directive('js', function ($path) {
$fullPath = public_path('js' . $path); $src = "/js{$path}?v=" . ¥File::lastModified($fullPath); return "<script src=¥"{$src}¥"></script>"; });
8 とりあえずやってみる public function boot() { ¥Blade::directive('js', function ($path) {
$fullPath = public_path('js' . $path); $src = "/js{$path}?v=" . ¥File::lastModified($fullPath); return "<script src=¥"{$src}¥"></script>"; }); ファイルのタイムスタンプを取得
9 とりあえずやってみる:結果 @js(/index.js) <script src="/js/index.js?v=1532351569"></script> 一見よさそう
50点
storage/framework/views 下のキャッシュファイルの中身もまた (view キャッシュが残っている限り) JS ファイルのタイムスタンプが更新されても反映されない 11 なぜ? <script src="/js/index.js?v=1532351569"></script>
storage/framework/views 下のキャッシュファイルの中身もまた (view キャッシュが残っている限り) JS ファイルのタイムスタンプが更新されても反映されない ➢ Blade ディレクティブは echo
をする PHP タグを文字列として返さないといけない 12 なぜ? <script src="/js/index.js?v=1532351569"></script>
「文字列リテラルはシングルクオートね(^^)」を守ると 13 書き換え① public function boot() { ¥Blade::directive('js', function ($path)
{ $fullPath = public_path('js' . $path); return '<?php echo ¥'<script src="/js' . $path . '?v=¥' . ¥¥File::lastModified(¥'' . $fullPath . '¥') . ¥'"></script>¥' ?>'; });
「文字列リテラルはシングルクオートね(^^)」を守ると 14 書き換え① public function boot() { ¥Blade::directive('js', function ($path)
{ $fullPath = public_path('js' . $path); return '<?php echo ¥'<script src="/js' . $path . '?v=¥' . ¥¥File::lastModified(¥'' . $fullPath . '¥') . ¥'"></script>¥' ?>'; }); 主にこのへんが ツライ
ダブルクオートを使って変数展開を活用 15 書き換え② public function boot() { ¥Blade::directive('js', function ($path)
{ $fullPath = public_path('js' . $path); return "<?php echo '<script src=¥"/js{$path}?v=' . ¥¥File::lastModified('{$fullPath}') . '¥"></script>' ?>"; }); 多少はマシ?でもやっぱりツライ
動的に変わるのは下線の部分だけなので、そこだけを echo する 16 書き換え③ <script src="/js/index.js?v=1532351569"></script>
動的に変わるのは下線の部分だけなので、そこだけを echo する 17 書き換え③ <script src="/js/index.js?v=1532351569"></script> public function boot()
{ ¥Blade::directive('js', function ($path) { $fullPath = public_path('js' . $path); return "<script src=¥"/js{$path}?v=<?php echo ¥¥File::lastModified('{$fullPath}') ?>¥"></script>"; }); 思ったよりツラミは改善されない
• ほかにも sprintf() とか使って頑張ってみても全然可読にならない • ていうかこんなコードメンテしたくない! • 欲しい文字列(HTMLタグ)を返すメソッドが生えたクラスを用意して Facade とかにして
ってした方が圧倒的に楽 • Balde 拡張の意義って一体……? 18 そんなことより {!! ViewHelper::js('/index.js') !!}
Blade 拡張のうまい使い道を 知ってる方は教えてください 19 というわけで…… 完