为什么PHP Framework Laravel自5.2版以来不推荐使用Route FEATURE“controller”?

时间:2016-07-18 08:02:45

标签: php laravel laravel-5.2

我以前使用Framework Laravel 5.x路由如下:

Route::controller("demo", "\App\Http\Controllers\DemoController");

但是当我在Laravel 5.2中阅读路由代码时,我发现自5.2版以来,它已被弃用,位于文件\ Illuminate \ Routing \ Router

/**
 * Route a controller to a URI with wildcard routing.
 *
 * @param  string  $uri
 * @param  string  $controller
 * @param  array  $names
 * @return void
 *
 * @deprecated since version 5.2.
 */
public function controller($uri, $controller, $names = [])
{
    $prepended = $controller;

    // First, we will check to see if a controller prefix has been registered in
    // the route group. If it has, we will need to prefix it before trying to
    // reflect into the class instance and pull out the method for routing.
    if (! empty($this->groupStack)) {
        $prepended = $this->prependGroupUses($controller);
    }

    $routable = (new ControllerInspector)
                        ->getRoutable($prepended, $uri);

    // When a controller is routed using this method, we use Reflection to parse
    // out all of the routable methods for the controller, then register each
    // route explicitly for the developers, so reverse routing is possible.
    foreach ($routable as $method => $routes) {
        foreach ($routes as $route) {
            $this->registerInspected($route, $controller, $method, $names);
        }
    }

    $this->addFallthroughRoute($controller, $uri);
}

我认为这是一个很好的功能,但为什么他们会弃用呢?

还有其他更好的解决方案吗?

=更新1 =

正如问题(https://github.com/laravel/framework/pull/10777)所说,他认为该功能会使路线混乱,或者容易导致访问意外的路线定义。

1 个答案:

答案 0 :(得分:0)

根据Github问题(https://github.com/laravel/framework/pull/10777

rkgrep说:

此方法存在很多问题,并且还会使路由定义混乱,因为它们未在路径文件中直接引用。这有时可能会导致意外的路由定义(例如,如果将getFilesystem等方法添加到父级或特性 - 开发人员的错误,但可能会被忽视)。

当中间件应用于特定方法时(例如有人向控制器添加新方法并忘记添加中间件),这也可能导致安全性错误,这种情况在手动定义路由时很少出现。

最后 - 参数问题,由于分组或其他意外的路线组合而难以修复(参见#10774)。

要减少休息时间,应在下一个5.1.x版本中将其标记为已弃用。

可能的替代方法:将此方法标记为master中已弃用,并在下一个主要版本中删除。