欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

laravel Non-static method Illuminate\Http\Request::input() should not be called statically Laravel Request::all() should not be called statically 有大用

In Laravel, I'm trying to call $input = Request::all(); on a store() method in my controller, but I'm getting the following error:

Non-static method Illuminate\Http\Request::all() should not be called statically, assuming $this from incompatible context

Any help figuring out the best way to correct this? (I'm following a Laracast)

正确答案
 

124down voteaccepted

The error message is due to the call not going through the Request facade.

Change

use Illuminate\Http\Request;

To

use Request;

它应该开始工作了


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

编辑

由于这个问题似乎有些流量,因此Laravel 5正式发布后,我想更新一下答案。

尽管上述内容在技术上仍然正确并将起作用,但use Illuminate\Http\Request;该新声明包含在新的控制台模板中,以帮助推动开发人员使用依赖注入的方式,而不依赖于Facade。

当将Request对象注入到构造函数(或方法,如Laravel 5中可用)中时,它是Illuminate\Http\Request应该注入对象,而不是Request外观。

所以,而不是更改控制器模板来使用请求外观,最好建议使用给定的控制器模板,并转向使用依赖注入(通过构造函数或方法)。

示例通过方法

<?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');
    }
}

示例通过构造函数

<?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');
    }
}
 
2
答案是正确的,不过不喜欢我会使用Illuminate \ Support \ Facades \ Request; 因为我个人认为Laravel将所有内容都混淆到根命名空间的习惯是反对命名空间的首先。它也使API文档更难生成,因为apigen / phpdoc将无法找到“Request”类。 -  delatbabel Feb 18 '15 at 2:08
2
实际上,您不需要更换手工制作的控制器。如果要使用Request而不注意该方法,只需使用$ input = \ Request :: all()(注意\)。如果你想使用注入而不是使用public myFunction(Request $ request(){$ input = $ request-> all()}或注入到构造函数中并将其分配给一个类变量 -  shock_gone_wild Feb 26 '15 at 18: 50
2
为什么我在使用Request::all();时不能使用use Illuminate\Http\Request; ? -  SA__ 9月9日,15日11:25
 
@SA__请求:: all()是一种外观方式。所以你必须 use Illuminate\Support\Facades\Request; ,而不是use Illuminate\Http\Request; -  Thabung 1月25日'16 12:21
 
@redA有没有办法将Request :: all()转换为直接使用(而不是通过facade类)? - 
 
 
 

使用Laravel的魔法注入将请求对象注入控制器,然后非静态访问该功能。Laravel会自动将具体的依赖关系注入自动加载的类

class MyController() 
{

   protected $request;

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

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

}
分享改善这个答案
 
use Illuminate\Http\Request;
public function store(Request $request){
   dd($request->all());
}

在上下文中是一样的

use Request;
public function store(){
   dd(Request::all());
}
分享改善这个答案
来自  http://stackoverflow.com/questions/28573860/laravel-requestall-should-not-be-called-statically
普通分类: