Laravel не распознает контроллер __invoke()

Не могу отладить эту простую проблему маршрутизации, несмотря на несколько похожих сообщений.

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

Сравнивая ваш код с документацией, я вижу, что вы импортируете, но есть «использовать Illuminate\Http\Request» (не используется), но нет «использовать App\Http\Controllers\Controller». Я, кажется, unnessesary, но попробуйте. Другой вариант — сгенерировать этот контроллер с помощью команды ремесленника «php artisan make:controller TestController --invokable» и сравнить с вашим кодом.

VirCom 25.12.2020 17:48

Можно после composer du?

Tpojka 25.12.2020 17:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
2
7 164
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Обычно это происходит, когда у вас нет инструкции использования для полного доменного имени контроллера.

Убедитесь, что в файле маршрутов, где вы объявляете маршрут, добавлен оператор использования для пространства имен контроллера. Тем более, что в 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;» на странице маршрутов исправлена ​​эта проблема.

Mike C 25.12.2020 21:22

Может быть, это поможет кому-то, похожему на меня, который упускает из виду простую проблему: Я написал:

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;

Другие вопросы по теме