Laravel Request :: all()不应该静态调用

Moo*_*ose 79 php laravel laravel-5

在Laravel中,我试图在我的控制器中调用$input = Request::all();一个store()方法,但是我收到以下错误:

Illuminate\Http\Request::all()假设$this不兼容的上下文,不应静态调用非静态方法

有任何帮助找出解决这个问题的最佳方法吗?(我跟随拉克拉斯特)

pat*_*cus 200

错误消息是由于呼叫未通过Request外观.

更改

use Illuminate\Http\Request;
Run Code Online (Sandbox Code Playgroud)

use Request;
Run Code Online (Sandbox Code Playgroud)

它应该开始工作.

在config/app.php文件中,您可以找到类别名的列表.在那里,您将看到基类Request已经为该Illuminate\Support\Facades\Request类别名.因此,要Request在命名空间文件中使用facade,需要指定使用基类:use Request;.

编辑

由于这个问题似乎得到了一些流量,我想在Laravel 5正式发布后稍微更新答案.

虽然上述内容在技术上仍然正确并且可以使用,但该use Illuminate\Http\Request;语句包含在新的Controller模板中,以帮助开发人员使用依赖注入而不是依赖Facade.

将Request对象注入构造函数(或Laravel 5中提供的方法)时,Illuminate\Http\Request应该注入的是对象,而不是RequestFacade.

因此,不是更改Controller模板以使用Request facade,而是建议使用给定的Controller模板并转向使用依赖注入(通过构造函数或方法).

示例通过方法

<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller {

    /**
     * Store a newly created resource in storage.
     *
     * @param  Illuminate\Http\Request  $request
     * @return Response
     */
    public function store(Request $request) {
        $name = $request->input('name');
    }
}
Run Code Online (Sandbox Code Playgroud)

示例来自构造函数

<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller {

    protected $request;

    public function __construct(Request $request) {
        $this->request = $request;
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store() {
        $name = $this->request->input('name');
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,您不需要更改工匠制造商的Boilerplate:控制器.如果你想使用请求而不将其注入方法,只需使用$ input =\Request :: all()(注意\).如果你想使用注入而不是使用public myFunction(Request $ request(){$ input = $ request-> all()}或者在构造函数中注入它并将它分配给一个类变量 (4认同)
  • 答案是正确的,但是出于偏好我会使用Illuminate\Support\Facades\Request; 因为我个人认为Laravel习惯将所有内容别名化为根命名空间,这与首先使用命名空间是不相称的.它还使API文档更难生成,因为apigen/phpdoc将无法找到"Request"类. (3认同)
  • 为什么我不能使用`Request :: all();`而我使用`使用Illuminate\Http\Request;`? (2认同)

Jon*_*owe 6

使用Laravel的魔法注入将请求对象注入控制器,然后非静态地访问该函数.Laravel会自动将具体依赖项注入自动加载的类中

class MyController() 
{

   protected $request;

   public function __construct(\Illuminate\Http\Request $request)
   {
       $this->request = $request;
   }

   public function myFunc()
   {
       $input = $this->request->all();
   }

}
Run Code Online (Sandbox Code Playgroud)


luc*_*gic 5

改用request()助手。您不必担心use语句,因此不会再次发生这种问题。

$input = request()->all();
Run Code Online (Sandbox Code Playgroud)

简单


Luc*_* C. 5

Facade 是另一个 Request 类,使用完整路径访问它:

$input = \Request::all();
Run Code Online (Sandbox Code Playgroud)

从 Laravel 5 开始,您还可以通过以下request()功能访问它:

$input = request()->all();
Run Code Online (Sandbox Code Playgroud)