Запрос Laravel :: all () не должен вызываться статически

61

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

Нестатический метод Illuminate\Http\Request::all() не следует вызывать статически, предполагая $this из несовместимого контекста

Любая помощь в определении лучшего способа исправить это? (Я следую за Ларакастом)

  • 0
    Ларавел 4 или 5?
  • 0
    @patricus, прости, я должен был сказать 5.
Показать ещё 5 комментариев
Теги:
laravel-5

4 ответа

153
Лучший ответ

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

Изменить

use Illuminate\Http\Request;

Для

use Request;

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

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

Изменить

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

В то время как вышеописанное по-прежнему технически корректно и будет работать, оператор use Illuminate\Http\Request; включен в новый шаблон контроллера, чтобы помочь толкнуть разработчиков в направлении использования инъекции зависимостей и полагаться на фасад.

При вводе объекта 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');
    }
}
  • 3
    Ответ правильный, однако из предпочтений я бы использовал Illuminate \ Support \ Facades \ Request; потому что лично я думаю, что привычка Laravel присваивать псевдонимы всему корневому пространству имен противоречит тому, чтобы в первую очередь иметь пространства имен. Это также усложняет генерацию документации API, потому что apigen / phpdoc не сможет найти класс «Запрос».
  • 3
    На самом деле, вам не нужно менять Boilerplate ремесленного производителя: контроллер. Если вы хотите использовать запрос, не вставляя его в метод, просто используйте $ input = \ Request :: all () (обратите внимание на \). Если вы хотите использовать инъекцию, тогда используйте public myFunction (Request $ request () {$ input = $ request-> all ()} Или внедрите его в конструктор и назначьте его переменной класса
Показать ещё 4 комментария
6

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

class MyController() 
{

   protected $request;

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

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

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

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

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

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

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

простой

Ещё вопросы

Сообщество Overcoder
Наверх
Меню