Не могу отладить эту простую проблему маршрутизации, несмотря на несколько похожих сообщений.
TestController
не вызывается. Класс контроллера TestController не вызывается. Вы забыли добавить метод __invoke или метод контроллера отсутствует в вашем файле маршрутов?
Я перепробовал столько перестановок, сколько смог найти в стеке, и ничего не изменилось. Я подтвердил, что простая маршрутизация, т.е.:
Route::get('/', function () {
return view('welcome');
});
работает, но я не могу заставить работать контроллеры. Я очистил кеш и раскомментировал $namespace, ничего не изменилось. На самом деле сообщение об ошибке, кажется, не меняется, что наводит меня на мысль, что это не маршрутизация, а что-то связанное с контроллерами. Но я новичок и не вижу этого.
из веб.php:
Route::get('/test', TestController::class);
ТестКонтроллер.php:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller {
public function __invoke() {
return view('welcome');
}
}
Можно после composer du
?
Обычно это происходит, когда у вас нет инструкции использования для полного доменного имени контроллера.
Убедитесь, что в файле маршрутов, где вы объявляете маршрут, добавлен оператор использования для пространства имен контроллера. Тем более, что в Laravel 8.x пространство имен по умолчанию для контроллеров не установлено на App\Http\Controllers
, в отличие от более ранних версий.
//routes file
use App\Http\Controllers\TestController;
Route::get('/test', TestController::class);
В качестве побочного примечания, если вы используете вызываемый класс контроллера для возврата только представления, вместо этого вы можете использовать метод Route::view().
//Assuming that you have a resources/views/test.blade.php
Route::view('/test', 'test');
Спасибо, добавление «использовать App\Http\Controllers\TestController;» на странице маршрутов исправлена эта проблема.
Может быть, это поможет кому-то, похожему на меня, который упускает из виду простую проблему: Я написал:
Route::post('controller/{resource}/action', \App\Http\Controllers\MyController::class, 'action')->name('controller.action');
Вместо этого мне нужно было:
Route::post('controller/{resource}/action', [\App\Http\Controllers\MyController::class, 'action'])->name('controller.action');
Так что в основном мне не хватало []
вокруг класса контроллера и параметров действия, они идут вместе в массиве - нужно помнить об этом. :)
Извините, если это немного не по теме, но я искал свою проблему и оказался здесь, поэтому это может помочь и кому-то еще.
Я не знаю, нужно ли тебе это слышать, но измени свое мнение.
Route::get('/test', TestController::class);
в
Route::get('/test', [TestController::class, @MethodName]);
Кроме того, вызовите свою модель в Controller.file
use App\Models\Test;
Сравнивая ваш код с документацией, я вижу, что вы импортируете, но есть «использовать Illuminate\Http\Request» (не используется), но нет «использовать App\Http\Controllers\Controller». Я, кажется, unnessesary, но попробуйте. Другой вариант — сгенерировать этот контроллер с помощью команды ремесленника «php artisan make:controller TestController --invokable» и сравнить с вашим кодом.