如何在方法中传递请求实例在laravel中工作

时间:2019-02-01 20:16:01

标签: php laravel

我知道为了在php中创建实例,您必须使用new关键字。

$object = new ClassName;

现在请看下面的代码,这在laravel中很常见

public function store(Request $request) {
   // some code inside store method
}

我的问题是何时创建$request实例并填充数据?以及如何将其作为方法中的参数传递?

1 个答案:

答案 0 :(得分:1)

$ request是在Laravel请求/响应周期的开始时创建的。查看您的 index.php 文件,您将在第52行看到类似的内容:

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

如果您使用 capture() 函数,则最终结果为:

  

/vendor/laravel/framework/src/Illuminate/Http/Request.php

这样做:

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

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

Laravel Request构建在SymfonyRequest之上,因此,如果您遵循 SymfonyRequest :: createFromGlobals(),它将带您:

  

/vendor/symfony/http-foundation/Request.php

createFromGlobals()中有以下行:

$request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);

最后,如果转到 createRequestFromFactory(),您将看到:

private static function createRequestFromFactory(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
{
    if (self::$requestFactory) {
        $request = call_user_func(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);
}

这是第一次发出或传递回请求(如果已实例化)的地方。因此,当您使用时:

 some_function(Request $request)

“请求”仅表示参数必须为“请求”类型,而$ request是在 index.php 中创建的全局$ request变量。 希望对您有所帮助。