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

Laravelのコアファイルを読んでみて/Impression of reading the core code of the Laravel framework

y_sone
March 26, 2022

Laravelのコアファイルを読んでみて/Impression of reading the core code of the Laravel framework

Laravelのコアファイルを読んだ感想です。
DB接続についてコードを途中まで追ってみました。
2022年3月26日「とにかくほめる!マウントなしのLT会」にて初登壇。

y_sone

March 26, 2022
Tweet

More Decks by y_sone

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 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);
    }

    View Slide

  8. 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) {
    // 省略
    }

    View Slide

  9. 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;
    }

    View Slide

  10. 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']}].");
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide