V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
floy
V2EX  ›  PHP

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

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

    models下也类似

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

    你这不是命名空间啊。

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

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

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

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

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

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

    甚至你可以新建一个目录,在下面建controller,model子目录都可以,相当于module一样的
    按照psr-0的规范,只要在 composer.json 里面配置
    "autoload": {
    "psr-0": {
    "XXX": "app/myapp"
    }
    },
    trimleo
        10
    trimleo  
       2014-07-22 16:41:41 +08:00
    建议用命名空间即可 大型一点的应用可以考虑用repository 业务上可以试试command bus
    floy
        11
    floy  
    OP
       2014-07-22 17:01:38 +08:00
    @Yuansir
    这种方式我更喜欢了,要去composer.json里配置?配置完了以后呢,那还需要再install一次吗,能自动生成烦恼app下的目录吗
    在ThinkPHP中,生成一个新的module,直接bind一个appname就可以把核心目录给build,比较方便
    Yuansir
        12
    Yuansir  
       2014-07-22 18:10:45 +08:00
    @floy 目录要自己建的
    qichunren
        13
    qichunren  
       2014-07-22 18:28:08 +08:00
    我发现用了命名空间以后,要在控制器中头部namespace下面写一堆use Xxx,烦死啦。有什么解决办法?
    mx1700
        14
    mx1700  
       2014-07-22 21:56:12 +08:00
    直接创建目录就行了,然后在 composer.json 的 autoload.classmap 节点把你创建的目录加进去
    类似这样:
    "autoload": {
    "classmap": [
    "app/commands",
    "app/controllers",
    "app/controllers/Api",
    floy
        15
    floy  
    OP
       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
        16
    mx1700  
       2014-07-23 10:27:57 +08:00
    @floy 类上边加 use DB;
    使用任何Laravel类都得加use,这就是控制器用命名空间的麻烦
    可以不用命名空间,只要保证不同文件夹下的类名不要重复就行
    kisay
        17
    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',
    ));
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1488 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:56 · PVG 00:56 · LAX 09:56 · JFK 12:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.