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

2016-10-19 11:44:22 +08:00
 karocXing

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

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 中传输)是怎么处理的?

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

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

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

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

全量更新就是整个 laravel 一个版本,每次发布新建不同版本的 laravel
karocXing
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 这里去控制版本。

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

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

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

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

© 2021 V2EX