Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravelコアファイルのコードリーディング/Reading the core code of Laravel

y_sone
December 21, 2022

Laravelコアファイルのコードリーディング/Reading the core code of Laravel

Laravelコアファイルのコードリーディングのまとめです。
DB接続についてModel::all()からnew PDO()までコードを追ってみました。
2022年12月21日「PHP勉強会」にて初登壇。

y_sone

December 21, 2022
Tweet

More Decks by y_sone

Other Decks in Programming

Transcript

  1. 呼び出し元のArticleController.phpのindex() // app/Http/Controllers/ArticleController.php class ArticleController extends Controller { public function

    index(Request $request) { $articles = Article::all(); return view('article.index', compact('articles')); } }
  2. query()でやること • Connectionインスタンスの取得 ◦ Connectionインスタンスはindex.php実行時にKernelのhandle()で生成済み ◦ シングルトンで生成される • Builderインスタンスの生成 ◦

    ConnectionインスタンスからQueryBuilderインスタンスを生成 ◦ QueryBuilderインスタンスからEloquentBuilderインスタンスを生成
  3. get()でやること(EloquentBuilder編) // vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php public function get($columns = ['*']) { $builder

    = $this->applyScopes(); if (count($models = $builder->getModels($columns)) > 0) { $models = $builder->eagerLoadRelations($models); } return $builder->getModel()->newCollection($models); }
  4. get()でやること(QueryBuilder編) // vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php public function get($columns = ['*']) { return

    collect($this->onceWithColumns(Arr::wrap($columns), function () { return $this->processor->processSelect($this, $this->runSelect()); })); }
  5. new PDO()を発見! // vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php protected function createPdoConnection($dsn, $username, $password, $options)

    { if (class_exists(PDOConnection::class) && ! $this->isPersistentConnection($options)) { return new PDOConnection($dsn, $username, $password, $options); } return new PDO($dsn, $username, $password, $options); }