【问题标题】:Laravel routes file cannot find ControllersLaravel 路由文件找不到控制器
【发布时间】:2016-11-19 07:54:16
【问题描述】:

我有一个非常简单的 routes.php 文件:

<?php

Route::get('/', 'TracksController@index');

还有一个简单的 TracksController.php 文件,位于 App\Http\Controllers:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Track as Track;

class TracksController extends Controller
{
    function index(){

        $tracks = Track::latest->get();
        return view('tracks')->with(compact('tracks'));

    }

}

但每当我尝试访问该路线时,我都会收到此错误:

ReflectionException in Route.php line 280:
Class App\Http\Controllers\TracksController does not exist

我不知道我还能做什么。我有:

  • 运行 composer dumpautoload
  • 运行 php artisan clear-compiled
  • 已检查 storage/* 文件夹的权限
  • 在路由文件中强制使用 TracksController 的命名空间和/或完整路径

但似乎没有任何效果。

我什至检查了 composer 生成的 vendor/composer/autoload_classmap.php 文件,但我在其中找不到 TracksController 文件。

有什么线索吗?

【问题讨论】:

  • 检查你的函数function index(){}应该是public函数index(){}`
  • 公开该函数,并删除其中的所有内容并将其放入 dd('test'); 并删除 use App\Track as Track;,如果您在页面上看到单词 test 那么答案很明显
  • 您的问题可能是拼写错误,但命令应为composer dump-autoload,并带有连字符。如果不是拼写错误,请尝试一下,看看是否能解决问题。
  • 作曲家允许composer dump-autoloadcomposer dumpautoload
  • @AndrewNolan Huh。刚刚测试过,它可以工作。我不知道。谢谢你的信息。

标签: php laravel laravel-5


【解决方案1】:

所以我之前的回答是不正确的,因为帕特里克斯提到了 public 修饰符。问题确实在于您的$tracks = Track::latest-&gt;get();

更改为$tracks = Track::latest()-&gt;get();,您应该已经设置好了。

【讨论】:

  • 如果没有定义可见性,PHP 默认可见性为公开。虽然指定它看起来更好,但不使用它并不会改变代码的工作方式。
  • 我一直习惯于声明 public、protected、private,我没有先自己尝试。谢谢你的知识,帕特里克斯
  • 没问题。我也总是指定可见性。
  • 对于您更新的答案,虽然latest() 缺少括号以使其成为方法调用是正确的,但您仍然需要get()latest()只是将orderBy添加到查询中,它并没有真正执行查询,所以你仍然需要get()来执行查询。
【解决方案2】:

如果您使用的是 linux,文件名和路径区分大小写。假设您没有更改默认composer.json 文件中的自动加载,PHP 期望该文件位于app\Http\Controllers\TracksController.php。在您的问题中,您指定它位于App\...

假设这不是问题中的拼写错误,您要么需要将 App 目录重命名为 app,要么需要更新 composer.json 文件,让它知道从 @987654327 自动加载@ 目录,而不是app 目录:

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "App/"
    }
},

【讨论】:

    【解决方案3】:

    如果使用资源控制器,必须在routes/web.php文件中声明使用控制器,如下:

    <?php
    use App\Http\Controllers\UsersController;
    ...
    Route::resource('users', UsersController::class);
    

    这在此处使用 Laravel 8 有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 2015-07-27
      • 2023-03-27
      • 2013-09-21
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多