Laravel入門 初回ガイダンス(第1回)

2021-01-01
2 min read

Laravel 6.x リクエストのライフサイクル https://readouble.com/laravel/6.x/ja/lifecycle.html

laravelのControllerのライフサイクルとサービスコンテナへの束縛登録のベタープラクティス https://nextat.co.jp/staff/archives/247

第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて! https://qiita.com/kd9951/items/951ab700f28d1d49c9c9

コントローラーのrequest に思うこと

store(Request $request)

DIを知らないと、下記のように書いてしまうでしょう。特にPHPで書いてきた人がやりがち http://cly7796.net/wp/php/to-get-the-value-that-was-sent-in-the-form-in-laravel/

laravel request 生成 場所

https://qiita.com/wim/items/ba64e4c89a7310fa47dc

/var/www/html/todo/public/index.php

$response = $kernel->handle( $request = Illuminate\Http\Request::capture() );

/var/www/html/todo/vendor/laravel/framework/src/Illuminate/Http/Request.php

class Request extends SymfonyRequest implements Arrayable, ArrayAccess {

/**
 * Create a new Illuminate HTTP request from server variables.
 *
 * @return static
 */
public static function capture()
{
    static::enableHttpMethodParameterOverride();

    return static::createFromBase(SymfonyRequest::createFromGlobals());
}

/var/www/html/todo/vendor/symfony/http-foundation/Request.php

/**
 * Creates a new request with values from PHP's super globals.
 *
 * @return static
 */
public static function createFromGlobals()
{
    $request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER);

    if ($_POST) {
        $request->request = new InputBag($_POST);
    } elseif (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
        && \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH'])
    ) {
        parse_str($request->getContent(), $data);
        $request->request = new InputBag($data);
    }

    return $request;
}

/var/www/html/todo/vendor/laravel/framework/src/Illuminate/Http/Request.php

/**
 * Create an Illuminate request from a Symfony instance.
 *
 * @param  \Symfony\Component\HttpFoundation\Request  $request
 * @return static
 */
public static function createFromBase(SymfonyRequest $request)
{
    $newRequest = (new static())->duplicate(
        $request->query->all(),
        $request->request->all(),
        $request->attributes->all(),
        $request->cookies->all(),
        $request->files->all(),
        $request->server->all()
    );

    $newRequest->headers->replace($request->headers->all());

    $newRequest->content = $request->content;

    $newRequest->request = $newRequest->getInputSource();

    return $newRequest;
}

laravelの処理の順序をひもといてから リクエストはいつコンテナに登録されるか?

メソッドインジェクション

パラメーターにリクエストを含ませる

/var/www/html/todo/vendor/laravel/framework/src/Illuminate/Routing/Route.php

/**
 * Bind the route to a given request for execution.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return $this
 */
public function bind(Request $request)
{
    $this->compileRoute();

    $this->parameters = (new RouteParameterBinder($this))
                    ->parameters($request);

    $this->originalParameters = $this->parameters;

    return $this;
}

メソッドインジェクション

/**
 * Dispatch a request to a given controller and method.
 *
 * @param  \Illuminate\Routing\Route  $route
 * @param  mixed  $controller
 * @param  string  $method
 * @return mixed
 */
public function dispatch(Route $route, $controller, $method)
{
    $parameters = $this->resolveClassMethodDependencies(
        $route->parametersWithoutNulls(), $controller, $method
    );

    if (method_exists($controller, 'callAction')) {
        return $controller->callAction($method, $parameters);
    }

    return $controller->{$method}(...array_values($parameters));
}

method_exists ( mixed$object , string$method_name )
指定した object にクラスメソッドが存在するかどうかを調べます。

responce 生成場所

Next