Laravel Request:: all () не следует вызывать статически


в Laravel, я пытаюсь позвонить $input = Request::all(); на store() метод в моем контроллере, но я получаю следующую ошибку:

нестатический метод IlluminateHttpRequest::all() не должен вызываться статически, предполагая $this из несовместимого контекста

любой помочь выяснить, лучший способ исправить это? (Я следую за Laracast)

6 67

6 ответов:

сообщение об ошибке вызвано тем, что вызов не проходит через Request фасад.

изменить

use Illuminate\Http\Request;

до

use Request;

и он должен начать работать.

в config/приложения.php файл, вы можете найти список псевдонимов классов. Там вы увидите, что базовый класс Request имеет псевдоним Illuminate\Support\Facades\Request класса. Из-за этого, чтобы использовать Request фасад в файле с пространством имен, Необходимо указать, чтобы использовать базовый класс: use Request;.

Edit

поскольку этот вопрос, похоже, получает некоторый трафик, я хотел немного обновить ответ, так как Laravel 5 был официально выпущен.

в то время как выше все еще технически правильно и будет работать,use Illuminate\Http\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');
    }
}

введите объект запроса в контроллер, используя магическую инъекцию Laravel, а затем получите доступ к функции нестатически. Laravel автоматически впрыскивает конкретных зависимостей на классы подгружаться

class MyController() 
{

   protected $request;

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

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

}

использовать request() помощник вместо этого. Вам не нужно беспокоиться о use заявления и, таким образом, такие проблемы не повторятся.

$input = request()->all();

простой

use Illuminate\Http\Request;
public function store(Request $request){
   dd($request->all());
}

то же самое в контексте говоря

use Request;
public function store(){
   dd(Request::all());
}

фасад-это еще один класс запроса, доступ к нему с полным путем:

$input = \Request::all();

я столкнулся с этой проблемой даже с use Illuminate\Http\Request; строки в верхней части моего контроллера. Продолжал дергать меня за волосы, пока я не понял, что делаю $request::ip() вместо $request->ip(). Может случиться с вами, если вы не спали всю ночь и смотрите на код в 6 утра с полуоткрытыми глазами.

надеюсь, что это поможет кому-то в будущем.