Laravel 8: преобразование массива в строку при вызове маршрута: список

#php #laravel #routes #laravel-8

#php #laravel #маршруты #laravel-8

Вопрос:

У меня есть контроллер ресурсов, который есть ArticleController , и я хочу вызвать этот контроллер web.php , поэтому я закодировал:

 use AppHttpControllersAdminPanelController;
use AppHttpControllersAdminArticleController;

Route::namespace('Admin')->prefix('admin')->group(function(){
  Route::get('/admin/panel', [PanelController::class, 'index']);
  Route::resource('articles', [ArticleController::class]);
});
  

Затем я попробовал команду php artisan route:list для проверки маршрутов, но я получаю это сообщение об ошибке:

Исключение ErrorException

Преобразование массива в строку

Итак, почему возникает эта ошибка, как я могу ее исправить?

Ответ №1:

Route::resource ожидает строку для второго аргумента, а не массив.

 Route::resource('articles', ArticleController::class);
  

Удалите вызов namespace для группы, вам не нужен префикс пространства имен, потому что вы используете полное имя класса, FQCN , для ссылки на контроллеры.

 Route::prefix('admin')->group(function () {
    Route::get('/admin/panel', [PanelController::class, 'index']);
    Route::resource('articles', ArticleController::class);
});
  

Комментарии:

1. Я удалил массив вокруг контроллера, но теперь он говорит: Target class [AdminAppHttpControllersAdminArticleController] does not exist.

2. Потому что вы добавляете пространство имен перед любым контроллером, определяемым в файле маршрута. Вы можете проверить пространство имен в RouteServiceProvider или группу маршрутов, которые вы определили

3. @ruwroveajaic , недавно у меня была такая же проблема, это можно исправить, поместив весь путь к классу в строку, например Route::resource('articles', 'AppHttpControllersArticleController'); , предполагая, что ваш контроллер находится в аналогичном пути, поэтому вы соответствующим образом меняете путь.

Ответ №2:

Это происходит потому, что вы сохранили ArticleController в квадратных скобках. Снимите квадратную скобку и оставьте ее такой:

 use AppHttpControllersAdminPanelController;
use AppHttpControllersAdminArticleController;

Route::namespace('Admin')->prefix('admin')->group(function(){
  Route::get('/admin/panel', [PanelController::class, 'index']);
  Route::resource('articles', ArticleController::class);
});
  

Или

 use AppHttpControllersAdminPanelController;

Route::namespace('Admin')->prefix('admin')->group(function(){
  Route::get('/admin/panel', [PanelController::class, 'index']);
  Route::resource('articles', 'AppHttpControllersAdminArticleController');
});
  

Метод resource ожидает ссылку на класс контроллера в качестве второго параметра, но вы дали ему массив.

Примечание. если вы используете первый фрагмент, убедитесь, что класс импортирован правильно.Иначе вы столкнетесь с другой ошибкой.