Movatterモバイル変換


[0]ホーム

URL:


SlideShare a Scribd company logo

Laravel の paginate は一体何をやっているのか

3 likes15,920 views
Shohei Okada
Shohei Okada

2018-06-27 開催の「第127回 PHP勉強会@東京」におけるLT資料です https://phpstudy.doorkeeper.jp/events/76011

1 of 34
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Most read
24
25
26
27
28
29
30
31
32
Most read
33
34
Most read
Laravel の paginate は一体何をやっているのか第127回 PHP勉強会@東京
岡田 正平(おかだ しょうへい)@okashoi• 株式会社ウィルゲート 2015年新卒入社• 開発室 ソリューションユニット 所属• PHP, Laravel, Vue.js2自己紹介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() }}
Laravel の paginate は一体何をやっているのか
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¥AbstractPaginatorpublic 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¥AbstractPaginatorpublic 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¥AbstractPaginatorpublic 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¥PaginationServiceProviderpublic 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¥PaginationServiceProviderpublic 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から取得できる(わかる)引数でもらう(わかる)算出できる(わかる)わかった!
Laravel の paginate は一体何をやっているのか
• Laravel の paginate は一見アクロバティックだが意外と副作用が無い形になっていた• Laravel のコードを追って行ってabstract class や interface で行き止まったらそれっぽい ServiceProvider を探すと良い• こういうの調査するのに PhpStorm が便利!(Go To Declaration)• 要 larvae-ide-helperhttps://github.com/barryvdh/laravel-ide-helper34まとめ
Ad

Recommended

PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
PDF
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
 
PDF
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
 
PDF
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
PPTX
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
PDF
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
 
PDF
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
PDF
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 
PDF
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
PDF
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
 
PPT
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
PDF
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
PDF
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
 
PDF
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
PDF
例外設計における大罪
Takuto Wada
 
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
PDF
ドメイン駆動設計入門
Takuya Kitamura
 
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
PDF
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
 
PDF
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
PDF
ドメインモデルの育て方
増田 亨
 
PPTX
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
DeNA
 
PDF
私とOSSの25年
MITSUNARI Shigeo
 
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
PDF
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
 
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
PDF
Docker入門 - 基礎編 いまから始めるDocker管理
Masahito Zembutsu
 
PDF
「登壇しているひとは偉い」という話
Shohei Okada
 
PDF
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
 

More Related Content

What's hot(20)

PDF
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
PDF
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
 
PPT
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
PDF
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
PDF
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
 
PDF
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
PDF
例外設計における大罪
Takuto Wada
 
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
PDF
ドメイン駆動設計入門
Takuya Kitamura
 
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
PDF
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
 
PDF
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
PDF
ドメインモデルの育て方
増田 亨
 
PPTX
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
DeNA
 
PDF
私とOSSの25年
MITSUNARI Shigeo
 
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
PDF
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
 
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
PDF
Docker入門 - 基礎編 いまから始めるDocker管理
Masahito Zembutsu
 
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
 
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
 
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
例外設計における大罪
Takuto Wada
 
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
ドメイン駆動設計入門
Takuya Kitamura
 
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
 
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
ドメインモデルの育て方
増田 亨
 
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
DeNA
 
私とOSSの25年
MITSUNARI Shigeo
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
Docker入門 - 基礎編 いまから始めるDocker管理
Masahito Zembutsu
 

More from Shohei Okada(20)

PDF
「登壇しているひとは偉い」という話
Shohei Okada
 
PDF
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
 
PDF
PHP 8.0 の新記法を試してみよう!
Shohei Okada
 
PDF
自分たちのコードを Composer パッケージに分割して開発する
Shohei Okada
 
PDF
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
Shohei Okada
 
PDF
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
Shohei Okada
 
PDF
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
Shohei Okada
 
PDF
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
Shohei Okada
 
PDF
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
Shohei Okada
 
PDF
スペシャリストとして組織をつくる、というキャリア
Shohei Okada
 
PDF
PHP でも活用できる Makefile
Shohei Okada
 
PDF
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
Shohei Okada
 
PDF
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Shohei Okada
 
PDF
働き方が大きく変わった 入社3年目のときのとあるエピソード
Shohei Okada
 
PDF
Laravel で API バージョニングを実装するなら
Shohei Okada
 
PDF
Laravel における Blade 拡張のツラミ
Shohei Okada
 
PDF
2017 年度を振り返って ~アウトプット編~
Shohei Okada
 
PDF
Laravel × レイヤードアーキテクチャをやってみている話
Shohei Okada
 
PDF
Laravel 5.6 デフォルトの例外ハンドリング処理をまとめてみた
Shohei Okada
 
PDF
チームで「きちんと」Laravel を使っていくための取り組み
Shohei Okada
 
「登壇しているひとは偉い」という話
Shohei Okada
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
 
PHP 8.0 の新記法を試してみよう!
Shohei Okada
 
自分たちのコードを Composer パッケージに分割して開発する
Shohei Okada
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
Shohei Okada
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
Shohei Okada
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
Shohei Okada
 
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
Shohei Okada
 
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
Shohei Okada
 
スペシャリストとして組織をつくる、というキャリア
Shohei Okada
 
PHP でも活用できる Makefile
Shohei Okada
 
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
Shohei Okada
 
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Shohei Okada
 
働き方が大きく変わった 入社3年目のときのとあるエピソード
Shohei Okada
 
Laravel で API バージョニングを実装するなら
Shohei Okada
 
Laravel における Blade 拡張のツラミ
Shohei Okada
 
2017 年度を振り返って ~アウトプット編~
Shohei Okada
 
Laravel × レイヤードアーキテクチャをやってみている話
Shohei Okada
 
Laravel 5.6 デフォルトの例外ハンドリング処理をまとめてみた
Shohei Okada
 
チームで「きちんと」Laravel を使っていくための取り組み
Shohei Okada
 
Ad

Laravel の paginate は一体何をやっているのか


[8]ページ先頭

©2009-2025 Movatter.jp