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
42
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
380
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
1.1k
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
2.4k
パスワードのハッシュ、ソルトってなに? - What is hash and salt for password?
okashoi
3
440
設計の考え方 - インターフェースと腐敗防止層編 #phpconfuk / Interface and Anti Corruption Layer
okashoi
11
6.6k
"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.5k
Other Decks in Programming
See All in Programming
Are APIs Still Relevant in the AI Era?
soyuka
0
250
スマート反転とウェブアクセシビリティ
camiha
0
210
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
5
3.3k
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
120
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
380
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
440
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
290
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
180
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
150
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.8k
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
130
Featured
See All Featured
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
How to build a perfect <img>
jonoalderson
1
6k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Why Our Code Smells
bkeepers
PRO
340
58k
Balancing Empowerment & Direction
lara
6
1.3k
Designing for Timeless Needs
cassininazir
1
480
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
460
New Earth Scene 8
popppiees
4
2.6k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
530
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
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 というわけで…… 完