Я вважав, що для майбутніх відвідувачів було б корисно трохи пояснити, що тут відбувається.
Illuminate\Http\Request
клас
Illuminate\Http\Request
Клас Laravel має метод з іменем all
(насправді all
метод визначається в ознаці, яку використовує Request
клас, що називається Illuminate\Http\Concerns\InteractsWithInput
). Підпис all
методу на момент написання статті виглядає так:
public function all($keys = null)
Цей метод не визначений як static
і тому, коли ви намагаєтесь викликати метод у статичному контексті, тобто Illuminate\Http\Request::all()
ви отримаєте помилку, що відображається у запитанні OP. all
Метод є методом примірника і має справу з інформацією, яка присутня в екземплярі Request
класу, тому називати його таким чином , не має сенсу.
Фасади
Фасад у Laravel надає розробникам зручний спосіб доступу до об’єктів у контейнері IoC та методів виклику цих об’єктів. Розробник може викликати метод "статично" на фасаді типу Request::all()
, але фактичний виклик методу на реальному Illuminate\Http\Request
об'єкті не є статичним.
Фасад працює як проксі - він посилається на об'єкт в контейнері IoC і передає виклик статичного методу на цей об'єкт (не статично). Наприклад, візьмемо Illuminate\Support\Facades\Request
фасад, ось як він виглядає:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Під капотом базовий Illuminate\Support\Facades\Facade
клас використовує деяку магію PHP, а саме __callStatic
метод для:
- Прослухайте виклик статичного методу, в даному випадку
all
без параметрів
- Візьміть базовий об'єкт із контейнера IoC, використовуючи ключ, повернутий
getFacadeAccessor
, в даному випадку Illuminate\Http\Request
об'єктом
- Динамічно викликати метод, який він отримав статично щодо отриманого об'єкта, у цьому випадку
all
викликається нестатично на екземплярі Illuminate\Http\Request
.
Ось чому, як зазначив @patricus у своїй відповіді вище, змінивши use
оператор / import на посилання на фасад, помилки вже немає, оскільки, що стосується PHP, all
було правильно викликано на екземплярі Illuminate\Http\Request
.
Згладжування
Псевдонім - ще одна особливість, яку Laravel надає для зручності. Це працює, ефективно створюючи класи псевдонімів, які вказують на фасади в кореневому просторі імен. Якщо ви заглянете у свій config/app.php
файл, під aliases
ключем ви знайдете довгий список зіставлення рядків із класами фасадів. Наприклад:
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Request' => Illuminate\Support\Facades\Request::class,
Laravel створює для вас ці класи псевдонімів, виходячи з вашої конфігурації, і це дозволяє використовувати класи, доступні в кореневому просторі імен (як це називається рядковими клавішами aliases
конфігурації), як якщо б ви використовували сам фасад:
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
}
}
Примітка про введення залежності
Хоча фасади та псевдоніми все ще пропонуються у Laravel, можливо і зазвичай заохочується спуститися шляхом введення залежності. Наприклад, використання інжектора конструктора для досягнення того ж результату:
use Illuminate\Http\Request;
class YourController extends Controller
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function yourMethod()
{
$input = $this->request->all();
}
}
Цей підхід має ряд переваг, але, на мою особисту думку, найбільшим плюсом введення залежності є те, що це полегшує перевірку вашого коду. Оголошуючи залежності ваших класів як аргументи конструктора або методу, стає дуже легко висміяти ці залежності та ізольовано перевірити свій клас.