Slide 1

Slide 1 text

Laravelのコアファイルを読んでみて DB接続がどのように行われているか コードを追ってみた Presented by y_sone @20220326_とにかくほめる!マウントなしの LT会🌸

Slide 2

Slide 2 text

自己紹介 ● 2018年8月にWebエンジニアへ転職 ● 主な使用言語はPHP ● たまにイベントに出没します(スタッフ経験あり)

Slide 3

Slide 3 text

今日話すこと ● なぜコアファイルを読もうと思ったのか ● どこの機能を読んでみたのか ● コードを追ってみる(途中まで) ● コアファイルを読むメリット

Slide 4

Slide 4 text

なぜコアファイルを読もうと思ったのか ● ただの好奇心 ● コードリーディングの訓練

Slide 5

Slide 5 text

どこの機能を読んでみたのか ● DBの接続について

Slide 6

Slide 6 text

コードを追ってみる(途中まで) 1. new PDOでDB接続 2. MySQLに対応した情報をセット 3. RDMSの振り分け 4. その他の設定

Slide 7

Slide 7 text

new PDOでDB接続 // 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); }

Slide 8

Slide 8 text

new PDOでDB接続 // vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php public function createConnection($dsn, array $config, array $options) { [$username, $password] = [ $config['username'] ?? null, $config['password'] ?? null, ]; try { return $this->createPdoConnection( $dsn, $username, $password, $options ); } catch (Exception $e) { // 省略 }

Slide 9

Slide 9 text

MySQLに対応した情報をセット // vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php public function connect(array $config) { $dsn = $this->getDsn($config); $options = $this->getOptions($config); // We need to grab the PDO options that should be used while making the brand // new connection instance. The PDO options control various aspects of the // connection's behavior, and some might be specified by the developers. $connection = $this->createConnection($dsn, $config, $options); // 省略 return $connection; }

Slide 10

Slide 10 text

RDMSの振り分け // vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php public function createConnector(array $config) { if (! isset($config['driver'])) { throw new InvalidArgumentException('A driver must be specified.'); } if ($this->container->bound($key = "db.connector.{$config['driver']}")) { return $this->container->make($key); } switch ($config['driver']) { case 'mysql': return new MySqlConnector; // 省略 } throw new InvalidArgumentException("Unsupported driver [{$config['driver']}]."); }

Slide 11

Slide 11 text

その他の設定 // vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php createPdoResolverWithHosts() createPdoResolverWithoutHosts() connect() more.. ConnectionFactory.phpで色々行っているようでしたが、 追い切れませんでした...

Slide 12

Slide 12 text

コアファイルを読むメリット ● フレームワークのありがたみが分かる ● 生のコードがフレームワーク内でどのように使われているか知ることできる ● フレームワークの設計思想を味わえる ● バグなどの原因究明がし易くなる

Slide 13

Slide 13 text

おわりに まだ途中なのでコードを追い切れたら再度発表したいです 他にセッションの実装なども見てみたい...