Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Laravel における Blade 拡張のツラミ
Search
Shohei Okada
July 25, 2018
Programming
43
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
410
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
1.2k
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
2.4k
パスワードのハッシュ、ソルトってなに? - What is hash and salt for password?
okashoi
3
460
設計の考え方 - インターフェースと腐敗防止層編 #phpconfuk / Interface and Anti Corruption Layer
okashoi
11
6.7k
"config" ってなんだ? / What is "config"?
okashoi
0
2k
ファイル先頭の use の意味、説明できますか? 〜PHP の namespace と autoloading の関係を正しく理解しよう〜 / namespace and autoloading in php
okashoi
4
2.3k
MySQL のインデックスの種類をおさらいしよう! / overviewing indexes in MySQL
okashoi
0
1.5k
PHP における静的解析(あるいはそもそも静的解析とは) / #phpcondo_yasai static analysis for PHP
okashoi
1
1.6k
Other Decks in Programming
See All in Programming
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
290
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
110
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.2k
残高管理から台帳サービスへの進化
artoy
1
210
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
4k
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
850
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
120
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
750
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
Typedesign – Prime Four
hannesfritz
42
3.2k
What's in a price? How to price your products and services
michaelherold
247
13k
The SEO Collaboration Effect
kristinabergwall1
1
590
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
380
Exploring anti-patterns in Rails
aemeredith
4
540
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Un-Boring Meetings
codingconduct
0
460
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Building AI with AI
inesmontani
PRO
1
1.3k
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 というわけで…… 完