在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\[email protected]‘);
控制器文件位于:app/controllers/admin下:
<?php namespace mc\admin; class HomeController extends \BaseController { function index() { return "admin/index"; } }
总结:这样我们很方便的就可以将控制器按命名空间进行分组。
时间: 2024-10-06 01:33:14