0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クソ雑魚のワイ、Symfonyのコードリーディングしてみた②

Posted at

前回の記事に続きまして、Symfonyのコードリーディングを続けていきます。
以下は前回の記事です。

Requestクラスについて

本記事で主に進めていく箇所は、以下のパスです。
./src/Symfony/Component/HttpFoundation/Request.php

クロージャについて

このクラスのコードを読んでいくと、おそらくcreateRequestFromFacoryという関数が重要であることが分かります。

複数の関数において返されるインスタンスはこの静的関数を用いて作成されているようです。
この関数は以下のコードです。

private static function createRequestFromFactory(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): static
{
    if (self::$requestFactory) {
        $request = (self::$requestFactory)($query, $request, $attributes, $cookies, $files, $server, $content);

        if (!$request instanceof self) {
                throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.');
        }

        return $request;
    }

    return new static($query, $request, $attributes, $cookies, $files, $server, $content);
}

簡単にご説明すると、まず初めに以下の要素が引数として渡されてきます。

  1. クエリ
  2. HTTPメソッド
  3. attributes 何これ?
  4. クッキー
  5. ファイル
  6. サーバ
  7. リクエスト内容

これらを元にインスタンスを作成し、返すわけですがこの関数の中で一点、不思議な点があります。

self::$requestFactory

こちらです。
静的に宣言されたrequestFactoryプロパティを呼び出しているのは分かるのですが、その宣言部分はこちらです。

 protected static ?\Closure $requestFactory = null;

いやいや、何もしてへんやん。
クソ雑魚のワイもこのように思うわけです。

こちらの意味は、「$requestFactoryの型はクロージャ型、もしくはnullでもいいよ。でも初期値はnullね」という意味です。
よって、クラス内でクロージャを設定することができる箇所が考えられます。
探してみると、以下のようなコードがありました。

 public static function setFactory(?callable $callable): void
{
    self::$requestFactory = null === $callable ? null : $callable(...);
}

こちらでクロージャを設定する時もあるというわけですね。
callable型というのはコールバック関数に型づけるというわけです。
処理の内容としては、「コールバック関数が引数に渡されていないならrequestFactoryプロパティはnullで、あるなら引数のコールバック関数をrequestFactoryプロパティに定義しようね」という意味です。

このクラス内にはsetFactoryを呼び出している箇所はありませんでした。
外部から呼び出し、クロージャを設定、Requestインスタンスを作る際にそのクロージャを使用する、といったイメージでしょうか。難しいって。

このクロージャやコールバック関数について正しく理解することは、ワイのようなクソ雑魚にとっては1つの壁であるような気がします。

他にも関数がたくさんあるのですが、うーん、何から読めばいいのやら。
この記事自体は短くなりましたが、次にある程度読むべき場所を精査してから記事を執筆します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?