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
40
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Laravel における Blade 拡張のツラミ
2018-07-25 開催の「第128回 PHP勉強会@東京」におけるLT資料です
https://phpstudy.doorkeeper.jp/events/77255
Shohei Okada
July 25, 2018
More Decks by Shohei Okada
See All by Shohei Okada
Symfony + NelmioApiDocBundle を使った スキーマ駆動開発 / Schema Driven Development with NelmioApiDocBundle
okashoi
0
330
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
1k
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
2.3k
パスワードのハッシュ、ソルトってなに? - What is hash and salt for password?
okashoi
3
410
設計の考え方 - インターフェースと腐敗防止層編 #phpconfuk / Interface and Anti Corruption Layer
okashoi
11
6.3k
"config" ってなんだ? / What is "config"?
okashoi
0
1.9k
ファイル先頭の use の意味、説明できますか? 〜PHP の namespace と autoloading の関係を正しく理解しよう〜 / namespace and autoloading in php
okashoi
4
2.2k
MySQL のインデックスの種類をおさらいしよう! / overviewing indexes in MySQL
okashoi
0
1.4k
PHP における静的解析(あるいはそもそも静的解析とは) / #phpcondo_yasai static analysis for PHP
okashoi
1
1.5k
Other Decks in Programming
See All in Programming
What's New in Android 2026
veronikapj
0
230
Android CLI
fornewid
0
190
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
180
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
550
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
7k
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
430
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
9
3.5k
えっ!!コードを読まずに開発を!?
hananouchi
0
270
AIエージェントで 変わるAndroid開発環境
takahirom
2
730
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.6k
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
880
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
420
Featured
See All Featured
Bash Introduction
62gerente
615
220k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Optimizing for Happiness
mojombo
378
71k
New Earth Scene 8
popppiees
3
2.4k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
160
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
640
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
250
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
500
Statistics for Hackers
jakevdp
799
230k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
200
Building Applications with DynamoDB
mza
96
7.1k
Faster Mobile Websites
deanohume
310
32k
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 というわけで…… 完