【问题标题】:Laravel Controller Subfolder routingLaravel 控制器子文件夹路由
【发布时间】:2013-09-21 22:22:52
【问题描述】:

我是 Laravel 的新手。为了尽量让我的应用井井有条,我想将我的控制器放入控制器文件夹的子文件夹中。

controllers\
---- folder1
---- folder2

我试图路由到一个控制器,但 laravel 没有找到它。

Route::get('/product/dashboard', 'folder1.MakeDashboardController@showDashboard');

我做错了什么?

【问题讨论】:

    标签: laravel laravel-4 laravel-routing


    【解决方案1】:

    在文件夹中添加控制器:

    controllers\
    ---- folder1
    ---- folder2
    

    创建您的路线而不指定文件夹:

    Route::get('/product/dashboard', 'MakeDashboardController@showDashboard');
    

    运行

    composer dump-autoload
    

    再试一次

    【讨论】:

    • 我认为你也需要artisan dump-autoload 还是composer dump-autoload 足够?
    • 对于 /controllers,只是作曲家。但是,如果你在 ClassLoader::addDirectories 中有你在 composer 上没有的东西,你也需要 artisan。
    • 我突然想起我遇到过这样的事情。请参阅我对 OP 答案的评论
    • composer dump-autoload 也为我工作。如果您使用 Windows 操作系统,您可以使用 .bat 文件运行composer dump-autoload,而不是每次都输入 CMD。这就是我正在使用的:PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
    • 如果我们在forlder1和folder2中有两个同名的控制器怎么办?例如:admin/PostsController.php 和 frontend/PostsController.php
    【解决方案2】:

    刚刚找到了一种方法:

    只需将路径添加到 /app/start/global.php

    ClassLoader::addDirectories(array(
    
        app_path().'/commands',
        app_path().'/controllers',
        app_path().'/controllers/product',
        app_path().'/models',
        app_path().'/database/seeds',
    
    ));
    

    【讨论】:

    • 错了。由于 /controllers 已经在 Laravel 的 composer.json 基础中,因此它下面的任何内容都会自动自动加载。您无需在 global.php 中添加 /controllers/product。
    • @AntonioCarlosRibeiro 我有this problem 试图将模型放入文件夹中,但转储作曲家和工匠自动加载似乎不起作用。你必须把它们放在 composer.json 或 global.php
    • 很容易检查:运行composer du后,打开vendor/composer/autoload_classmap.php,你的类必须列在那里。
    【解决方案3】:

    1.创建您的子文件夹,如下所示:

    app
    ----controllers
    --------admin
    --------home
    

    2.在 app/routes.php 中配置你的代码

    <?php
    // index
    Route::get('/', 'Home\HomeController@index');
    
    // admin/test
    Route::group(
        array('prefix' => 'admin'), 
        function() {
            Route::get('test', 'Admin\IndexController@index');
        }
    );
    ?>
    

    3.在app/controllers/admin/IndexController.php 中写入,例如:

    <?php
    namespace Admin;
    
    class IndexController extends \BaseController {
    
        public function index()
        {
            return "admin.home";
        }
    }
    ?>
    

    4.访问你的站点,例如:localhost/admin/test 你会在页面上看到“admin.home”

    ps:请忽略我蹩脚的英语

    【讨论】:

    • 使用命名空间避免命名冲突。 +1
    【解决方案4】:

    我正在使用 Laravel 4.2。我是怎么做的:
    我有一个像这样的目录结构:
    应用程序
    --控制器
    ----管理员
    ------AdminController.php

    创建控制器后,我在 composer.json 中添加了新管理目录的路径:

    "autoload": {
    "classmap": [
    "app/commands",
    "app/controllers",
    "app/controllers/admin",
    "app/models",
    "app/database/migrations",
    "app/database/seeds",
    "app/tests/TestCase.php"
    ]
    }, 
    

    接下来我跑了

    composer dump-autoload
    

    然后

    php artisan dump-autoload
    

    然后在 routes.php 我有这样的控制器:

    Route::controller('admin', 'AdminController');
    

    一切正常。

    【讨论】:

    • 为我工作,我只需要运行'composer dump-autoload -o'
    • 只是在任何情况下我也在使用 php artisan dump-autoload。
    【解决方案5】:

    对于使用 Laravel 5 的用户,您需要在子目录中为控制器设置命名空间(Laravel 5 仍在开发中,每天都在发生变化)

    要获得如下文件夹结构:

    Http
    ----Controllers
        ----Admin
                PostsController.php
        PostsController.php
    

    namespace Admin\PostsController.php 文件如下:

    <?php namespace App\Http\Controller\Admin;
    
    use App\Http\Controllers\Controller;
    
    class PostsController extends Controller {
    
        //business logic here
    }
    

    那么你的路线是:

    $router->get('/', 'Admin\PostsController@index');
    

    最后,不要去做作曲家或工匠转储

    composer dump-autoload
    

    php artisan dump
    

    【讨论】:

    • 为我工作,截至 2015 年 1 月 23 日。由于 L5 尚未推出,这可能会在以后发生变化。
    • 感谢这个小花絮。在 LV4 中,您可以跳过“使用 App\Http\Controllers\Controller;”声明,因为您扩展了直接从 Controller 继承的 BaseController。在 LV5 中不是这种情况,因为它直接扩展了 Controller,并且 PSR-4 自动加载需要知道在哪里可以找到 Controller。
    • @user ?php 命名空间 App\Http\Controller\Admin;应该是 Controller[s],s 结尾
    • 这对我有用,但需要注意的是我必须在 composer 语句中添加“-o”,例如:composer dump-autoload -o
    • 这对我不起作用,错误消息现在显示App\Http\Controllers\Auth\Controller 未找到,为什么会在此处附加单词Controller,并且丢失了控制器的实际名称?我认为它的斜线就是这样做的。 -o 没有帮助。
    【解决方案6】:

    对于 ** Laravel 5 或 Laravel 5.1 LTS **,如果您在 Admin 文件夹中有多个控制器,Route::group 将对您非常有帮助。例如:

    更新:适用于 Laravel 5.4

    我的文件夹结构:

    Http
    ----Controllers
        ----Api
              ----V1
                     PostsApiController.php
                     CommentsApiController.php
        PostsController.php
    

    PostAPIController:

    <?php namespace App\Http\Controllers\Api\V1;
    
    use App\Http\Requests;
    use App\Http\Controllers\Controller;   
    use Illuminate\Http\Request;
    
    class PostApiController extends Controller {  
    ...
    

    在我的 Route.php 中,我将 namespace 组设置为 Api\V1,整体看起来像:

    Route::group(
            [           
                'namespace' => 'Api\V1',
                'prefix' => 'v1',
            ], function(){
    
                Route::get('posts', ['uses'=>'PostsApiController@index']);
                Route::get('posts/{id}', ['uses'=>'PostssAPIController@show']);
    
        });
    

    有关创建子文件夹的移动详细信息,请访问link

    【讨论】:

    • 对于 Laravel 5.4,这是迄今为止我找到的唯一解决方案。
    • 完美解决方案
    • 确实完美!
    • 游戏规则改变者 ;-)
    【解决方案7】:
    php artisan make:controller admin/CategoryController
    

    这里 admin 是 app/Http/Controllers 下的子目录, CategoryController 是您要在目录中创建的控制器

    【讨论】:

      【解决方案8】:

      我认为将 Admin 和 Front 的控制器放在不同的文件夹中,命名空间会很好地工作。

      请查看下面的 Laravel 目录结构,这对我来说很好。

      app
      --Http
      ----Controllers
      ------Admin
      --------DashboardController.php
      ------Front
      --------HomeController.php
      

      “routes/web.php”文件中的路由如下

      /* All the Front-end controllers routes will work under Front namespace */
      
      Route::group(['namespace' => 'Front'], function () {
          Route::get('/home', 'HomeController@index');
      });
      

      对于管理部分,它看起来像

      /* All the admin routes will go under Admin namespace */
      /* All the admin routes will required authentication, 
         so an middleware auth also applied in admin namespace */
      
      Route::group(['namespace' => 'Admin'], function () {
          Route::group(['middleware' => ['auth']], function() {            
              Route::get('/', ['as' => 'home', 'uses' => 'DashboardController@index']);                                   
          });
      });
      

      希望这会有所帮助!

      【讨论】:

        【解决方案9】:

        如果您使用的是 Laravel 5.3 或更高版本,则无需像其他答案所说的那样陷入如此多的复杂性。 只需使用默认的工匠命令来生成新的控制器。 例如,如果我想在User 文件夹中创建一个User 控制器。 我会输入

        php artisan make:controller User/User
        

        在路线中,

        Route::get('/dashboard', 'User\User@dashboard');
        

        这样做会很好,现在 localhost/dashboard 是页面所在的位置。

        希望这会有所帮助。

        【讨论】:

          【解决方案10】:

          对于 Laravel 5.3 以上:

          php artisan make:controller test/TestController
          

          如果test文件夹不存在,这将创建它,然后在里面创建TestController

          TestController 将如下所示:

          <?php
          namespace App\Http\Controllers\test;
          
          use Illuminate\Http\Request;
          use App\Http\Controllers\Controller;
          
          class TestController extends Controller
          {
              public function getTest()
              {
                  return "Yes";
              }
          }
          

          然后您可以通过这种方式注册您的路线:

          Route::get('/test','test\TestController@getTest');
          

          【讨论】:

          • 有什么方法可以在 laravel 4.2 中实现上述目标
          • php artisan make:controller test\TestController 创建 testTestController.php 而 php artisan make:controller 'test\TestController' 有效。 (注意引号)- Laravel 5.4
          • php artisan make:controller test/TestController
          【解决方案11】:

          在 Laravel 5.6 中,假设您的子文件夹的名称是 Api

          在你的控制器中,你需要这两行:

          namespace App\Http\Controllers\Api;
          use App\Http\Controllers\Controller;
          

          在你的路由文件api.php中,你需要:

          Route::resource('/myapi', 'Api\MyController');
          

          【讨论】:

            【解决方案12】:

            1) 这就是您可以使您的应用井井有条的方式:

            每个路由文件(web.phpapi.php ...)在文件中的map() 方法中声明

            \app\Providers\RouteServiceProvider.php
            

            当你映射一个路由文件时,你可以为它设置一个-&gt;namespace($this-&gt;namespace),你会在例子中看到它。

            这意味着你可以创建更多的文件来让你的项目更有条理!

            并为每一个设置不同的命名空间。

            但我更喜欢为命名空间 "" 设置 empty string

            2)您可以将控制器设置为以原生 php 方式路由,请参见示例:

            Route::resource('/users', UserController::class);
            Route::get('/agents', [AgentController::class, 'list'])->name('agents.list');
            

            现在您可以在 IDE 中双击控制器名称,以便快速方便地到达那里。

            【讨论】:

            • 最佳答案!与 Laravel 完全一致,并建立在框架已经提供的开箱即用的基础之上。
            【解决方案13】:

            我最近在使用 laravel 5.8 时遇到了这个问题,但我明白我应该像下面这样以正确的方式定义控制器:

            php artisan make:controller SubFolder\MyController  // true
            

            不是这样的:

            php artisan make:controller SubFolder/MyController  // false
            

            然后你可以像这样访问routes/web.php中的控制器:

            Route::get('/my', 'SubFolder\MyController@index');
            

            【讨论】:

              【解决方案14】:

              在我的例子中,我必须为组中的每个路由添加一个前缀,否则响应将是找不到 UserController 类。

              Route::prefix('/user')->group(function() {
                  Route::post('/login', [UserController::class, 'login'])->prefix('/user');
                  Route::post('/register', [UserController::class, 'register'])->prefix('/user');
              });
              

              【讨论】:

                【解决方案15】:

                创建控制器转到 cmd 和类型 php artisan make:controller auth\LoginController

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-09-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-10-13
                  • 1970-01-01
                  相关资源
                  最近更新 更多