Я работаю со свежей установкой Lumen (создание веб-API), большинство вещей работает, но когда я пытаюсь использовать маршрутизатор для указания класса, я получаю эту ошибку:
Fatal error: Class 'App\Http\Controllers\Controller' not found in /Applications/MAMP/htdocs/moments/lumen/app/Http/Controllers/MomentController.php on line 5
Это мой маршрутизатор в приложении / Http / routes.php
$app->get('/', 'MomentController@index');
И это мой класс в приложении / Http / Controllers / MomentController.php
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class MomentController extends Controller { public function index() { echo 123; } }
Я активировал эти компоненты в bootstrap / app.php :
$app->withFacades();
$app->withEloquent();
Dotenv::load(__DIR__.'/../');
Это мой файл composer.json :
{ "name": "laravel/lumen", "description": "The Laravel Lumen Framework.", "keywords": ["framework", "laravel", "lumen"], "license": "MIT", "type": "project", "require": { "laravel/lumen-framework": "5.1.*", "vlucas/phpdotenv": "~1.0" }, "require-dev": { "phpunit/phpunit": "~4.0", "fzaninotto/faker": "~1.0" }, "autoload": { "psr-4": { "App\\": "app/" }, "classmap": [ "database/" ] }, "autoload-dev": { "classmap": [ "tests/" ] }, "config": { "preferred-install": "dist" } }
Я думаю, что это имеет какое-то отношение к пространству имен, но я не могу понять это. Любые подсказки?
спасибо,
Увы, никто из них не работает. Я не могу взять кредит на решение, но если вы пришли сюда в поисках рабочего ответа, пожалуйста, воздержитесь от этого. Оригинальное сообщение от Lukas Geiter здесь: routing framework routing not working
Я изменил пример foo / bar, потому что действительно, кому это нравится?
Вы должны использовать полное имя класса:
$app->get('/', 'App\Http\Controllers\HomeController@index');
ИЛИ заверните все маршруты в группе (это на самом деле то, как это делается под капотом в Laravel 5)
$app->group(['namespace' => 'App\Http\Controllers'], function($group){ $group->get('/', 'HomeController@index'); $group->get('users', 'UserController@index'); });
Решение состоит в том, чтобы ссылаться на правый базовый контроллер, чтобы он мог распространяться на этот класс.
use Laravel\Lumen\Routing\Controller as BaseController;
Эта строка – единственная вещь, которую я должен был добавить, чтобы она работала.
Таким образом, полный класс становится следующим:
<?php namespace App\Http\Controllers; use Laravel\Lumen\Routing\Controller as BaseController; class ChannelController extends BaseController { public function getChannels(){} public function getChannel(){} }
Я полагаю, что вы создали проект с использованием lumen new
вместо composer create-project laravel/lumen --prefer-dist
. Вы можете попытаться создать новый проект просвета с использованием композитора и попытаться воспроизвести эту проблему.
Удалите use App\Http\Controllers\Controller;
поскольку в этом нет необходимости.
Затем проверьте, включен ли у вашего композитора.json psr-4 для каталога app
.
Кроме того, попробуйте composer du
в командной строке, чтобы сбросить и восстановить файл автозагрузки.
Для кого-то еще, кто оказался здесь с той же проблемой. Я столкнулся с такой же проблемой, выполняя мои маршруты в рамках моей новой установки Lumen 5.2.
После нескольких часов поиска в Интернете выясняется, что контроллер маршрута Lumen отличается от используемого Laravel. Lumen использует nikic fastroute.
Контроллер маршрута Lumen НЕ поддерживает префикс группы маршрутов, даже если он указан в документации для Lumen. Я не знаю, была ли это проблема оригинального плаката, поскольку полная информация о маршруте недоступна, но, надеюсь, она спасет кого-то еще несколько часов.
Я не смог найти ссылку, если это функция, которую нужно включить / добавить вручную (если Lumen теперь поддерживает ее, как предлагает документация). Может быть, кто-то может пролить свет на это?
https://lumen.laravel.com/docs/5.2/routing#route-group-prefixes
попробуй это
$app->get('/', 'App\Http\Controllers\MomentController@index');
или (лучше) группировать их
$app->group(['namespace' => 'App\Http\Controllers'], function($group){ $group->get('/', 'MomentController@index'); $group->get('foo', 'MomentController@otherAction'); });
и удалите use App\Http\Controllers\Controller;
как сказал @lowerends