laravel 空值器分层 控制
背景:在做项目是,不免碰到控制器分层问题(控制器分前后台),这个问题在laravel文档中并没有给出明确的需求解决方案,故小总结一下。
提到分组,我首先想到的就是利用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"
,框架会在这个目录里搜索控制器。
我们看到其中有一行 "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"
]
},
之后在composer.json目录执行一下composer命令:
composer dump-autoload
这样,我们将整个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";
}
}
总结:这样我们很方便的就可以将控制器按命名空间进行分组。
------------------------index_ling