Laravel: 控制器不存在
Laravel: Controller does not exist
我在 /app/controllers/admin/ 文件夹中添加了新控制器,并在 /app/routes.php 文件中添加了路由。然后我运行下面的命令自动加载它们
php artisan dump-autoload
我收到以下错误
Mcrypt PHP extension required.
我按照 https://askubuntu.com/questions/460837/mcrypt-extension-is-missing-in-14-04-server-for-mysql 给出的说明进行操作并解决了 mcrypt 问题。
之后我 运行 php artisan dump-autoload
命令但仍然出现以下错误
{"error":{"type":"ReflectionException","message":"Class CoursesController does not exist","file":"\/var\/www\/html\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Container.php","line":504}}
这是我的 routes.php 文件的代码
Route::group(array('before' => 'adminauth', 'except' => array('/admin/login', '/admin/logout')), function() {
Route::resource('/admin/courses', 'CoursesController');
Route::resource('/admin/teachers', 'TeachersController');
Route::resource('/admin/subjects', 'SubjectsController');
});
这里是CoursesController.php文件的代码
<?php
class CoursesController extends BaseController
{
public function index()
{
$courses = Course::where('is_deleted', 0)->get();
return View::make('admin.courses.index', compact('courses'));
}
public function create()
{
return View::make('admin.courses.create');
}
public function store()
{
$validator = Validator::make($data = Input::all(), Course::$rules);
if ($validator->fails()) {
$messages = $validator->messages();
$response = '';
foreach ($messages->all(':message') as $message) {
$response = $message;
}
return Response::json(array('message'=>$response, 'status'=>'failure'));
} else {
Course::create($data);
return Response::json(array('message'=>'Course created successfully','status'=>'success'));
}
}
public function edit($id)
{
$course = Course::find($id);
return View::make('admin.courses.edit', compact('course'));
}
public function update($id)
{
$course = Course::findOrFail($id);
$validator = Validator::make($data = Input::all(), Course::editRules($id));
if ($validator->fails()) {
$messages = $validator->messages();
$response = '';
foreach ($messages->all(':message') as $message) {
$response = $message;
}
return Response::json(array('message'=>$response, 'status'=>'failure'));
} else {
$course->update($data);
return Response::json(array('message'=>'Course updated successfully','status'=>'success'));
}
}
public function destroy($id)
{
Course::findOrFail($id)->update(array('is_deleted' => '1'));
return Response::json(array('message'=>'Course deleted successfully','status'=>'success'));
}
}
您是否将自动加载类映射添加到 composer.json 文件?
打开 composer.json 文件并添加
"autoload": {
"classmap": [
"app/controllers/admin",
]
}
如果您在控制器中添加文件夹,则需要将其添加到 composer.json 文件中。然后运行
composer dumpautoload
或备选方案
转到 app/start/global.php 并添加
ClassLoader::addDirectories(array(
app_path().'/controllers/admin',
));
我们可以通过命令行创建控制器。
php artisan make:controller nameController --plain
.
在 Laravel 5 之前,make 命名空间不可用。相反,这有效
php artisan controller:make nameController
在项目目录中执行命令,然后创建函数。
我想你的问题已经解决了。但事实就是如此。
结构
Http
.Auth
.CustomControllerFolder
-> CustomController.php
让这个工作
在你的路线文件中确保你使用正确的名字 space
例如:
Route::group(['namespace'=>'CustomControllerFolder','prefix'=>'prefix'],
function() {
//define your route here
}
另外不要忘记在控制器中使用 namespace App\Http\Controllers\CustomControllerFolder
。
这应该可以解决问题。
谢谢
有时我们在控制器代码之上缺少 namespace App\Http\Controllers;
。
我刚遇到这个问题,因为我将一个文件从 EmployeeRequestContoller
重命名为 EmployeeRequestsContoller
,但是当我重命名它时,我错过了 .php
扩展名!
当我重新运行 php artisan make:controller EmployeeRequestsContoller
以确保我没有发疯并且文件出现时,我可以清楚地看到错误:
/EmployeeRequestsContoller
/EmployeeRequestsContoller.php
如果您已重命名,请确保您有扩展名!
别忘了做:
php artisan route:clear
在我的例子中,这是我在更改路由代码后遇到此错误的解决方案。
在我的例子中,我在控制器代码的顶部添加了这一行:
namespace App\Http\Controllers\CustomFolder\ControllerClassName;
我的问题解决了
在我的例子中,我有几个管理员和家庭控制器的备份文件重命名为不同的日期,我们 运行 在它上面进行了作曲家更新,它给了我们一个错误
在我删除了其他旧的控制器文件并重新运行之后,作曲家更新解决了我的问题。
- Clue - composer update command gave us a warning.
正在生成优化的自动加载文件
Warning: Ambiguous class resolution, "App\Http\Controllers\HomeController" was found in both "app/core/app/Http/Controllers/HomeController(25-OCT).php" and "app/core/app/Http/Controllers/HomeController.php", the first will be used.
Warning: Ambiguous class resolution, "App\Http\Controllers\AdminController" was found in both "app/core/app/Http/Controllers/AdminController(25-OCT).php" and "app/core/app/Http/Controllers/AdminController.php", the first will be used.
在我的例子中,我必须将路由文件更改为:
Route::get('/','SessionController@accessSessionData');
对此:
Route::get('/','App\Http\Controllers\SessionController@accessSessionData');
然后用这个清除缓存:
php artisan route:clear
让一切顺利。
2021 年答案 (Laravel 8.5)
在你的控制器中;
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
class AuthController extends Controller
{
public function login(Request $request){
return "login";
}
}
在您的路线中;
use App\Http\Controllers\AuthController;
Route::post('/login', [AuthController::class, 'login']);
文档=https://laravel.com/docs/8.x/routing#the-default-route-files
有点晚了,但根据我的经验,将其添加到 RouteServiceProvider.php 可以解决问题
protected $namespace = 'App\Http\Controllers';
在 web.php
中使用完整的命名空间
Route::resource('myusers','App\Http\Controllers\MyUserController');
我用Laravel 9这是我们应该使用控制器的方式
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);
我在 /app/controllers/admin/ 文件夹中添加了新控制器,并在 /app/routes.php 文件中添加了路由。然后我运行下面的命令自动加载它们
php artisan dump-autoload
我收到以下错误
Mcrypt PHP extension required.
我按照 https://askubuntu.com/questions/460837/mcrypt-extension-is-missing-in-14-04-server-for-mysql 给出的说明进行操作并解决了 mcrypt 问题。
之后我 运行 php artisan dump-autoload
命令但仍然出现以下错误
{"error":{"type":"ReflectionException","message":"Class CoursesController does not exist","file":"\/var\/www\/html\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Container.php","line":504}}
这是我的 routes.php 文件的代码
Route::group(array('before' => 'adminauth', 'except' => array('/admin/login', '/admin/logout')), function() {
Route::resource('/admin/courses', 'CoursesController');
Route::resource('/admin/teachers', 'TeachersController');
Route::resource('/admin/subjects', 'SubjectsController');
});
这里是CoursesController.php文件的代码
<?php
class CoursesController extends BaseController
{
public function index()
{
$courses = Course::where('is_deleted', 0)->get();
return View::make('admin.courses.index', compact('courses'));
}
public function create()
{
return View::make('admin.courses.create');
}
public function store()
{
$validator = Validator::make($data = Input::all(), Course::$rules);
if ($validator->fails()) {
$messages = $validator->messages();
$response = '';
foreach ($messages->all(':message') as $message) {
$response = $message;
}
return Response::json(array('message'=>$response, 'status'=>'failure'));
} else {
Course::create($data);
return Response::json(array('message'=>'Course created successfully','status'=>'success'));
}
}
public function edit($id)
{
$course = Course::find($id);
return View::make('admin.courses.edit', compact('course'));
}
public function update($id)
{
$course = Course::findOrFail($id);
$validator = Validator::make($data = Input::all(), Course::editRules($id));
if ($validator->fails()) {
$messages = $validator->messages();
$response = '';
foreach ($messages->all(':message') as $message) {
$response = $message;
}
return Response::json(array('message'=>$response, 'status'=>'failure'));
} else {
$course->update($data);
return Response::json(array('message'=>'Course updated successfully','status'=>'success'));
}
}
public function destroy($id)
{
Course::findOrFail($id)->update(array('is_deleted' => '1'));
return Response::json(array('message'=>'Course deleted successfully','status'=>'success'));
}
}
您是否将自动加载类映射添加到 composer.json 文件? 打开 composer.json 文件并添加
"autoload": {
"classmap": [
"app/controllers/admin",
]
}
如果您在控制器中添加文件夹,则需要将其添加到 composer.json 文件中。然后运行
composer dumpautoload
或备选方案
转到 app/start/global.php 并添加
ClassLoader::addDirectories(array(
app_path().'/controllers/admin',
));
我们可以通过命令行创建控制器。
php artisan make:controller nameController --plain
.
在 Laravel 5 之前,make 命名空间不可用。相反,这有效
php artisan controller:make nameController
在项目目录中执行命令,然后创建函数。
我想你的问题已经解决了。但事实就是如此。
结构
Http
.Auth
.CustomControllerFolder
-> CustomController.php
让这个工作 在你的路线文件中确保你使用正确的名字 space 例如:
Route::group(['namespace'=>'CustomControllerFolder','prefix'=>'prefix'],
function() {
//define your route here
}
另外不要忘记在控制器中使用 namespace App\Http\Controllers\CustomControllerFolder
。
这应该可以解决问题。
谢谢
有时我们在控制器代码之上缺少 namespace App\Http\Controllers;
。
我刚遇到这个问题,因为我将一个文件从 EmployeeRequestContoller
重命名为 EmployeeRequestsContoller
,但是当我重命名它时,我错过了 .php
扩展名!
当我重新运行 php artisan make:controller EmployeeRequestsContoller
以确保我没有发疯并且文件出现时,我可以清楚地看到错误:
/EmployeeRequestsContoller
/EmployeeRequestsContoller.php
如果您已重命名,请确保您有扩展名!
别忘了做:
php artisan route:clear
在我的例子中,这是我在更改路由代码后遇到此错误的解决方案。
在我的例子中,我在控制器代码的顶部添加了这一行:
namespace App\Http\Controllers\CustomFolder\ControllerClassName;
我的问题解决了
在我的例子中,我有几个管理员和家庭控制器的备份文件重命名为不同的日期,我们 运行 在它上面进行了作曲家更新,它给了我们一个错误
在我删除了其他旧的控制器文件并重新运行之后,作曲家更新解决了我的问题。
- Clue - composer update command gave us a warning.
正在生成优化的自动加载文件
Warning: Ambiguous class resolution, "App\Http\Controllers\HomeController" was found in both "app/core/app/Http/Controllers/HomeController(25-OCT).php" and "app/core/app/Http/Controllers/HomeController.php", the first will be used.
Warning: Ambiguous class resolution, "App\Http\Controllers\AdminController" was found in both "app/core/app/Http/Controllers/AdminController(25-OCT).php" and "app/core/app/Http/Controllers/AdminController.php", the first will be used.
在我的例子中,我必须将路由文件更改为:
Route::get('/','SessionController@accessSessionData');
对此:
Route::get('/','App\Http\Controllers\SessionController@accessSessionData');
然后用这个清除缓存:
php artisan route:clear
让一切顺利。
2021 年答案 (Laravel 8.5)
在你的控制器中;
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
class AuthController extends Controller
{
public function login(Request $request){
return "login";
}
}
在您的路线中;
use App\Http\Controllers\AuthController;
Route::post('/login', [AuthController::class, 'login']);
文档=https://laravel.com/docs/8.x/routing#the-default-route-files
有点晚了,但根据我的经验,将其添加到 RouteServiceProvider.php 可以解决问题
protected $namespace = 'App\Http\Controllers';
在 web.php
Route::resource('myusers','App\Http\Controllers\MyUserController');
我用Laravel 9这是我们应该使用控制器的方式
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);