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 にクラスメソッドが存在するかどうかを調べます。