在 laravel4 中,能对 app 下的 controller\model 进行再分目录么

2014-07-22 14:19:40 +08:00
 floy
如题,主要是一些应用比较复杂,用单个contrller解决全部方法会导致文件非常庞大,在ThinkPHP以及CI等框架中,通过可以加二级目录来分组实现,那在larvel4中是否也支持分组的概念呢?
比如:
会员模块,根据业务会有多个controller,能不能用这样的目录结构
app/controllers/member
ProfileController.php
BizController.php
OrderController.php
……
---------------

models下也类似

本人刚刚开始摸索larvel,希望得到各大拿指点,不胜感激
5116 次点击
所在节点    PHP
17 条回复
abelyao
2014-07-22 14:37:42 +08:00
最近也看上 laravel 了,关注一下。
cooper
2014-07-22 14:51:02 +08:00
当然可以。
floy
2014-07-22 14:54:33 +08:00
@cooper
路由上怎么分配呢,这么做可以吗?
Route::get('profile', 'member/ProfileController@index');
cooper
2014-07-22 14:59:43 +08:00
@floy

你这不是命名空间啊。

推荐命名空间、如果不使用命名空间的话、只要命名不重复就行了。

也就是说 ProfileController 在 app/controllers 下面只能有一个。目录层级没关系。
bearcat001
2014-07-22 15:10:21 +08:00
https://getcomposer.org/doc/04-schema.md#classmap

这里有composer的文档,laravel的controller是用classmap来映射的。

classmap映射是不限定目录格式的,所以在这里可以随便分目录结构,命名空间可以随便设定,没有强制要求。

member那个位置是命名空间,除非你设定了命名空间,否则不需要
floy
2014-07-22 15:11:05 +08:00
@cooper

也就是说在controller类中,如果加入了命名空间,就不用关心这个controller具体在哪个目录下,只要保证该命名唯一性即可?
floy
2014-07-22 15:11:31 +08:00
@bearcat001
如果真是这样,那就省心多了,我去测试 下,非常感谢!
kukat
2014-07-22 16:05:29 +08:00
Yuansir
2014-07-22 16:37:27 +08:00
用命名空间就可以了

甚至你可以新建一个目录,在下面建controller,model子目录都可以,相当于module一样的
按照psr-0的规范,只要在 composer.json 里面配置
"autoload": {
"psr-0": {
"XXX": "app/myapp"
}
},
trimleo
2014-07-22 16:41:41 +08:00
建议用命名空间即可 大型一点的应用可以考虑用repository 业务上可以试试command bus
floy
2014-07-22 17:01:38 +08:00
@Yuansir
这种方式我更喜欢了,要去composer.json里配置?配置完了以后呢,那还需要再install一次吗,能自动生成烦恼app下的目录吗
在ThinkPHP中,生成一个新的module,直接bind一个appname就可以把核心目录给build,比较方便
Yuansir
2014-07-22 18:10:45 +08:00
@floy 目录要自己建的
qichunren
2014-07-22 18:28:08 +08:00
我发现用了命名空间以后,要在控制器中头部namespace下面写一堆use Xxx,烦死啦。有什么解决办法?
mx1700
2014-07-22 21:56:12 +08:00
直接创建目录就行了,然后在 composer.json 的 autoload.classmap 节点把你创建的目录加进去
类似这样:
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/controllers/Api",
floy
2014-07-23 09:46:56 +08:00
我现在是这么做的:
在composer.json中配置
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/controllers/admin",
"app/controllers/member",
"app/controllers/group",

............

然后 composer dump-autoload
在app/controllers/member下添加class文件,添加命名空间
namespace App\Controllers\Member;

路由上更改配置如下
//用户
Route::group(array('prefix' => 'member', 'namespace' => 'App\Controllers\Member'), function() {
Route::get('/', 'IndexController@index');
........
});


现在好了,能正常访问到控制器了,但出现了新问题,DB方法等无法使用,报class not found
mx1700
2014-07-23 10:27:57 +08:00
@floy 类上边加 use DB;
使用任何Laravel类都得加use,这就是控制器用命名空间的麻烦
可以不用命名空间,只要保证不同文件夹下的类名不要重复就行
kisay
2014-09-12 10:02:46 +08:00
只需要在start/global.php 的 classloader 中添加对应的路径就可以了
ClassLoader::addDirectories(array(
app_path().'/commands',
app_path().'/controllers',
app_path().'/controllers/apis',
app_path().'/models',
app_path().'/database/seeds',
));

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/123919

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX