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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Shohei Okada
July 25, 2018
Programming
38
0
Share
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
290
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
890
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
2.2k
パスワードのハッシュ、ソルトってなに? - What is hash and salt for password?
okashoi
3
390
設計の考え方 - インターフェースと腐敗防止層編 #phpconfuk / Interface and Anti Corruption Layer
okashoi
11
6k
"config" ってなんだ? / What is "config"?
okashoi
0
1.8k
ファイル先頭の use の意味、説明できますか? 〜PHP の namespace と autoloading の関係を正しく理解しよう〜 / namespace and autoloading in php
okashoi
4
2.1k
MySQL のインデックスの種類をおさらいしよう! / overviewing indexes in MySQL
okashoi
0
1.3k
PHP における静的解析(あるいはそもそも静的解析とは) / #phpcondo_yasai static analysis for PHP
okashoi
1
1.4k
Other Decks in Programming
See All in Programming
サーバーレスで作る、動画データ管理基盤
oyasumipants
0
220
書き換えて学ぶTemporal #fukts
pirosikick
2
380
20260514_its_the_context_window_stupid.pdf
heita
0
1k
RailsTokyo 2026#4: AI様があれば、 Hotwireの弱点は消えるか?
naofumi
3
410
エラー処理の温故知新 / history of error handling technic
ryotanakaya
7
1.9k
ローカルLLMでどこまでコードが書けるか / How much code can be written on a local LLM
kishida
2
370
1人1案件のプロダクトエンジニア時代に、"プロセス監督"としてチャレンジしたこと
non0113
0
110
TypeSpec で繋ぐ複数プロダクトの型安全
maroon8021
1
100
ふにゃっとしない名前の付け方 〜哲学で茹で上げる、コシのあるソフトウェア設計〜
shimomura
0
120
AI Agent と正しく分析するための環境作り
yoshyum
2
530
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
syumai
0
260
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
410
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
Un-Boring Meetings
codingconduct
0
290
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
360
Navigating Team Friction
lara
192
16k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
360
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
130
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
200
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.4k
The agentic SEO stack - context over prompts
schlessera
0
780
30 Presentation Tips
portentint
PRO
1
290
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 というわけで…… 完