首页 > 代码库 > laravel控制器分组

laravel控制器分组

在laravel默认配置中,所有控制器都在 app/controllers 目录下,很多时候需要分组功能,比如 API分组,ADMIN分组,前台分组。

手册中并没有明确就这个需求给出解决方案,故再次记录一下自己的解决方式。

提到分组,我首先想到的就是利用php5.3以上版本才有的namespace命名空间功能。laravel默认使用的是classmap来自动加载类库,我们查看composer.json,可以看到一段:

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

我们看到其中有一行 "app/controllers" ,框架会在这个目录里搜索控制器。
如果我们要将控制器分组,当然可以增加几个目录,比如"app/controllers/admin","app/controllers/api",这样框架也会挨个目录查找指定的类,这种模式有个缺点,那就是在这些子目录中,得保持类名的唯一性,也就是说你在admin中定义了HomeController 就不能在 api中定义同名控制器。

换种方式,用namespace来支持自动加载,我们知道laravel深度结合了composer,也使用了composer的autoloader类,所以我们只要配置composer.json即可轻松实现基于namespace的自动加载。

在上面代码中加几行代码:

"autoload": {
    "psr-4":{
        "mc\\":"app/controllers"
    },
"classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php"
    ]
},

这样,我们将整个controllers目录映射到 mc 命名空间下,而laravel路由应当这样写:

Route::get(‘/admin‘,‘admin\HomeController@index‘);

控制器文件位于:app/controllers/admin下:

<?php
namespace mc\admin;
class HomeController extends \BaseController {
    function index()
    {
        return "admin/index";
    }
}

总结:这样我们很方便的就可以将控制器按命名空间进行分组。


laravel控制器分组