Movatterモバイル変換
[0]
ホーム
URL:
画像なし
夜間モード
Submit Search
Laravel の paginate は一体何をやっているのか
3 likes
15,920 views
Shohei Okada
2018-06-27 開催の「第127回 PHP勉強会@東京」におけるLT資料です https://phpstudy.doorkeeper.jp/events/76011
Software
Read more
1 of 34
Download now
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
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 は一体何をやっているのか
1.
Laravel の paginate
は一体何をやっているのか第127回 PHP勉強会@東京
2.
岡田 正平(おかだ しょうへい)@okashoi•
株式会社ウィルゲート 2015年新卒入社• 開発室 ソリューションユニット 所属• PHP, Laravel, Vue.js2自己紹介Slides:
3.
① Laravel の
paginate は何をやっているのか• タイトル通り② フレームワークのソースコードの追うときの思考プロセス3このスライドでつたえたい
4.
https://laravel.com/docs/5.6/pagination
5.
// Controller にて$users
= App¥User::paginate(15);{{-- blade template にて --}}<div class="container">@foreach ($users as $user){{ $user->name }}@endforeach</div>{{ $users->links() }}
6.
// Controller にて$users
= App¥User::paginate(15);{{-- blade template にて --}}<div class="container">@foreach ($users as $user){{ $user->name }}@endforeach</div>{{ $users->links() }}
8.
routing を触らずに ページネーション用の
URL (?page=x) が生まれる• 勝手に routing が生成される?だけでいい感じにページネーションのリンクが生まれる8なんか気持ち悪い……$users->links()
9.
……
10.
// Controller にて$users
= App¥User::paginate(15);{{-- blade template にて --}}<div class="container">@foreach ($users as $user){{ $user->name }}@endforeach</div>{{ $users->links() }}
11.
// Controller にて$users
= App¥User::paginate(15);{{-- blade template にて --}}<div class="container">@foreach ($users as $user){{ $user->name }}@endforeach</div>{{ $users->links() }}
12.
• の戻り値• ページネーションに必要な情報を持っている•
もこのクラスに生えている12¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users = App¥User::paginate(15);¥Illuminate¥Database¥Query¥Builder::paginate()links()
13.
• の戻り値• ページネーションに必要な情報を持っている•
もこのクラスに生えている13¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users = App¥User::paginate(15);¥Illuminate¥Database¥Query¥Builder::paginate()links()
14.
14¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users
= App¥User::paginate(15);
15.
これらの情報から、ページネーション部分の HTML を生成することはできる(わかる)
16.
16¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users
= App¥User::paginate(15);
17.
17¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users
= App¥User::paginate(15);DBから取得できる(わかる)
18.
18¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users
= App¥User::paginate(15);DBから取得できる(わかる)引数でもらう(わかる)
19.
19¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users
= App¥User::paginate(15);DBから取得できる(わかる)引数でもらう(わかる)算出できる(わかる)
20.
20¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users
= App¥User::paginate(15);DBから取得できる(わかる)引数でもらう(わかる)算出できる(わかる)??(わからない)
21.
ここからは勘と執念の戦い(なのでちょっと駆け足)
22.
• の戻り値• ページネーションに必要な情報を持っている•
もこのクラスに生えている22¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users = App¥User::paginate(15);¥Illuminate¥Database¥Query¥Builder::paginate()links()
23.
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.
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.
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.
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.
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;}ここでセットされてる!
28.
順当にクラス定義をさかのぼって行くと、ここで行き止まる= の呼び出し箇所が見つからない→ Laravel
には ServiceProvider という仕組みがある• アプリケーションの各所初期処理が行われる場所28行き止まり?Paginator::currentPageResolver()
29.
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.
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.
31¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users
= App¥User::paginate(15);DBから取得できる(わかる)引数でもらう(わかる)算出できる(わかる)??(わからない)
32.
32¥Illuminate¥Pagination¥LengthAwarePaginator// Controller にて$users
= App¥User::paginate(15);DBから取得できる(わかる)引数でもらう(わかる)算出できる(わかる)わかった!
34.
• Laravel の
paginate は一見アクロバティックだが意外と副作用が無い形になっていた• Laravel のコードを追って行ってabstract class や interface で行き止まったらそれっぽい ServiceProvider を探すと良い• こういうの調査するのに PhpStorm が便利!(Go To Declaration)• 要 larvae-ide-helperhttps://github.com/barryvdh/laravel-ide-helper34まとめ
Download
[8]
ページ先頭
©2009-2025
Movatter.jp