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 の paginate は一体何をやっているのか
Search
Shohei Okada
June 27, 2018
Programming
80
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Laravel の paginate は一体何をやっているのか
2018-06-27 開催の「第127回 PHP勉強会@東京」におけるLT資料です
https://phpstudy.doorkeeper.jp/events/76011
Shohei Okada
June 27, 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
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.9k
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
400
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
170
Domain-Driven Transformation
hschwentner
2
2.3k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
700
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
dotNET_vulnclicker_intro.pdf
deka_morita
0
140
sbt 2.0: takeoff
eed3si9n
0
160
Railsバージョンを4倍にした話
optim
0
450
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Ruling the World: When Life Gets Gamed
codingconduct
0
400
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
The Curious Case for Waylosing
cassininazir
1
570
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
What's in a price? How to price your products and services
michaelherold
247
13k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
760
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
320
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
560
Transcript
Laravel の paginate は 一体何をやっているのか 第127回 PHP勉強会@東京
岡田 正平(おかだ しょうへい)@okashoi • 株式会社ウィルゲート 2015年新卒入社 • 開発室 ソリューションユニット 所属
• PHP, Laravel, Vue.js 2 自己紹介 Slides:
① Laravel の paginate は何をやっているのか • タイトル通り ② フレームワークのソースコードの追うときの思考プロセス 3
このスライドでつたえたい
https://laravel.com/docs/5.6/pagination
// Controller にて $users = App¥User::paginate(15); {{-- blade template にて
--}} <div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> {{ $users->links() }}
// Controller にて $users = App¥User::paginate(15); {{-- blade template にて
--}} <div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> {{ $users->links() }}
None
routing を触らずに ページネーション用の URL (?page=x) が生まれる • 勝手に routing が生成される?
だけでいい感じにページネーションのリンクが生まれる 8 なんか気持ち悪い…… $users->links()
……
// Controller にて $users = App¥User::paginate(15); {{-- blade template にて
--}} <div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> {{ $users->links() }}
// Controller にて $users = App¥User::paginate(15); {{-- blade template にて
--}} <div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> {{ $users->links() }}
• の戻り値 • ページネーションに必要な情報を持っている • もこのクラスに生えている 12 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller
にて $users = App¥User::paginate(15); ¥Illuminate¥Database¥Query¥Builder::paginate() links()
• の戻り値 • ページネーションに必要な情報を持っている • もこのクラスに生えている 13 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller
にて $users = App¥User::paginate(15); ¥Illuminate¥Database¥Query¥Builder::paginate() links()
14 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller にて $users = App¥User::paginate(15);
これらの情報から、ページネーション部分の HTML を生成することはできる(わかる)
16 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller にて $users = App¥User::paginate(15);
17 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller にて $users = App¥User::paginate(15); DBから取得できる (わかる)
18 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller にて $users = App¥User::paginate(15); DBから取得できる (わかる)
引数でもらう (わかる)
19 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller にて $users = App¥User::paginate(15); DBから取得できる (わかる)
引数でもらう (わかる) 算出できる (わかる)
20 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller にて $users = App¥User::paginate(15); DBから取得できる (わかる)
引数でもらう (わかる) 算出できる (わかる) ??(わからない)
ここからは勘と執念の戦い (なのでちょっと駆け足)
• の戻り値 • ページネーションに必要な情報を持っている • もこのクラスに生えている 22 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller
にて $users = App¥User::paginate(15); ¥Illuminate¥Database¥Query¥Builder::paginate() links()
23 ¥Illuminate¥Database¥Query¥Builder::paginate() public function paginate($perPage = 15, $columns = ['*'],
$pageName = 'page', $page = null) { $page = $page ?: Paginator::resolveCurrentPage($pageName); $total = $this->getCountForPagination($columns); $results = $total ? $this->forPage($page, $perPage)->get($columns) : collect(); return $this->paginator($results, $total, $perPage, $page, [ 'path' => Paginator::resolveCurrentPath(), 'pageName' => $pageName, ]); }
24 ¥Illuminate¥Database¥Query¥Builder::paginate() public function paginate($perPage = 15, $columns = ['*'],
$pageName = 'page', $page = null) { $page = $page ?: Paginator::resolveCurrentPage($pageName); $total = $this->getCountForPagination($columns); $results = $total ? $this->forPage($page, $perPage)->get($columns) : collect(); return $this->paginator($results, $total, $perPage, $page, [ 'path' => Paginator::resolveCurrentPath(), 'pageName' => $pageName, ]); } currentPage を解決してそう
25 ¥Illuminate¥Pagination¥AbstractPaginator public static function resolveCurrentPage($pageName = 'page', $default =
1) { if (isset(static::$currentPageResolver)) { return call_user_func(static::$currentPageResolver, $pageName); } return $default; } /** * Set the current page resolver callback. * * @param ¥Closure $resolver * @return void */ public static function currentPageResolver(Closure $resolver) { static::$currentPageResolver = $resolver; }
26 ¥Illuminate¥Pagination¥AbstractPaginator public static function resolveCurrentPage($pageName = 'page', $default =
1) { if (isset(static::$currentPageResolver)) { return call_user_func(static::$currentPageResolver, $pageName); } return $default; } /** * Set the current page resolver callback. * * @param ¥Closure $resolver * @return void */ public static function currentPageResolver(Closure $resolver) { static::$currentPageResolver = $resolver; } $currentPageResolver を呼び出している $currentPageResolver は……?
27 ¥Illuminate¥Pagination¥AbstractPaginator public static function resolveCurrentPage($pageName = 'page', $default =
1) { if (isset(static::$currentPageResolver)) { return call_user_func(static::$currentPageResolver, $pageName); } return $default; } /** * Set the current page resolver callback. * * @param ¥Closure $resolver * @return void */ public static function currentPageResolver(Closure $resolver) { static::$currentPageResolver = $resolver; } ここでセットされてる!
順当にクラス定義をさかのぼって行くと、ここで行き止まる = の呼び出し箇所が見つからない → Laravel には ServiceProvider という仕組みがある • アプリケーションの各所初期処理が行われる場所
28 行き止まり? Paginator::currentPageResolver()
29 ¥Illuminate¥Pagination¥PaginationServiceProvider public function register() { Paginator::viewFactoryResolver(function () { return
$this->app['view']; }); Paginator::currentPathResolver(function () { return $this->app['request']->url(); }); Paginator::currentPageResolver(function ($pageName = 'page') { $page = $this->app['request']->input($pageName); if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) { return (int) $page; } return 1; }); }
30 ¥Illuminate¥Pagination¥PaginationServiceProvider public function register() { Paginator::viewFactoryResolver(function () { return
$this->app['view']; }); Paginator::currentPathResolver(function () { return $this->app['request']->url(); }); Paginator::currentPageResolver(function ($pageName = 'page') { $page = $this->app['request']->input($pageName); if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) { return (int) $page; } return 1; }); } リクエストパラメータ ${pageName} を取得
31 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller にて $users = App¥User::paginate(15); DBから取得できる (わかる)
引数でもらう (わかる) 算出できる (わかる) ??(わからない)
32 ¥Illuminate¥Pagination¥LengthAwarePaginator // Controller にて $users = App¥User::paginate(15); DBから取得できる (わかる)
引数でもらう (わかる) 算出できる (わかる) わかった!
None
• Laravel の paginate は一見アクロバティックだが 意外と副作用が無い形になっていた • Laravel のコードを追って行って abstract
class や interface で行き止まったら それっぽい ServiceProvider を探すと良い • こういうの調査するのに PhpStorm が便利!(Go To Declaration) • 要 larvae-ide-helper https://github.com/barryvdh/laravel-ide-helper 34 まとめ