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

laravel 需要实现版本管理,应该怎么去做比较好?

  •  
  •   karocXing · 2016-10-19 11:44:22 +08:00 · 3485 次点击
    这是一个创建于 2959 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在的想法是希望控制器里面的目录格式是这样的:

    Controllers/v1_1/IndexController.php
    Controllers/v1_1/ListsController.php
    ...
    Controllers/v2_1/IndexController.php
    ...
    

    因为版本号是在 Accept 里面传过来的,通过中间件进行校验和获取,那么在路由里面应该怎么去做才能做到根据中间件设置好的参数去不同版本里面呢?

    ( 1 )

    preg_match("/; version\=([0-9\.]+)$/", $request->server("HTTP_ACCEPT"), $params);
    if(isset($params[1]) && isset($this::$versions[$params[1]])){
        $appVersion = $this::$versions[$params[1]];
        $request->attributes->add(compact("appVersion"));
        $return = $next($request);
    }else{
        $return = response(null,406);
    }
    return $return;
    

    ( 2 )

    $app->get('/index',[
        'as'=>'index',
        'uses'=>'IndexController@index'
    ]);
    

    想把( 2 )实现为

    $app->get('/index',[
        'as'=>'index',
        'uses'=>appVersion.'\IndexController@index'
    ]);
    

    但是在( 2 )这样的时候中间件还没执行,只有( 3 )的时候能做到,但是( 3 )的形式又怎么去路由给我希望的控制器?

    ( 3 )

    $app->get('/index',[
        'as'=>'index',
        function () use ($app) {
            return $app->request->attributes->get("appVersion");
        }
    ]);
    

    是直接在里面 new 吗?还是有什么我没找到的更好一些的方法? 或者是大家在这样的情况下(版本号在 Accept 中传输)是怎么处理的?

    10 条回复    2016-10-24 15:36:59 +08:00
    1762628386
        1
    1762628386  
       2016-10-19 11:52:10 +08:00
    用 group 然后设置默认参数
    airycanon
        2
    airycanon  
       2016-10-19 11:54:19 +08:00
    Laravel 的路由支持 namespace ,请看这里: https://laravel.com/docs/5.3/routing
    lijinma
        3
    lijinma  
       2016-10-19 11:56:08 +08:00
    建议你直接使用 dingo ,不但解决你这个问题。

    也会解决你将来可能出现的问题。
    forvtwoex
        4
    forvtwoex  
       2016-10-19 12:44:26 +08:00
    @lijinma dingo 是什么东西
    lijinma
        5
    lijinma  
       2016-10-19 13:53:42 +08:00
    @forvtwoex 搜一下。。。
    doublleft
        6
    doublleft  
       2016-10-19 14:19:16 +08:00
    直接全量管理吧

    /apps/1.1.0/source
    /apps/1.1.1/source
    karocXing
        7
    karocXing  
    OP
       2016-10-19 14:54:25 +08:00
    @1762628386
    @airycanon
    很感谢两位提供的思路,把中间件的逻辑放到这就可以了,非常感谢。

    @lijinma
    dingo 看了下,需要点时间去熟悉,这个可以搞,感谢感谢。
    karocXing
        8
    karocXing  
    OP
       2016-10-19 14:56:35 +08:00
    @doublleft
    这个,不太明白全量是什么意思。
    doublleft
        9
    doublleft  
       2016-10-21 14:04:53 +08:00
    @karocXing 我看了下你现在的方法实际上是每个 Controller 一个版本?

    全量更新就是整个 laravel 一个版本,每次发布新建不同版本的 laravel
    karocXing
        10
    karocXing  
    OP
       2016-10-24 15:36:59 +08:00
    @doublleft 也不是说每个 Controller 一个版本,是这样:
    ```
    Controllers/v1_1/IndexController.php
    Controllers/v1_1/ListsController.php
    ...
    Controllers/v2_1/IndexController.php
    Controllers/v2_1/ListsController.php
    ...
    ```
    是从 Controller 这里去控制版本。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5654 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:45 · PVG 11:45 · LAX 19:45 · JFK 22:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.