扩展Laravels路由器类(4.1)

时间:2014-05-08 11:41:51

标签: php laravel extending

我想扩展Laravels路由器类(Illuminate \ Routing \ Router)以在我的应用程序中添加一个我需要的方法。

但遗憾的是我不能让这个工作。我已经成功扩展了其他课程,所以我真的不知道我的错误思想来自哪里。

无论如何,直接进入代码:

<?php

namespace MyApp\Extensions;

use Illuminate\Routing\Router as IlluminateRouter;

class Router extends IlluminateRouter
{
    public function test()
    {
        $route = $this->getCurrentRoute();
        return $route->getParameter('test');
    }    
}

所以你看我想通过一个简单的调用来获取routes.php中{test}的参数设置:

路由器::测试();

不确定如何继续。试图在register()和boot()中将它绑定到我的ServiceProvider中的IOC-Container,但我没有运气。

无论我尝试什么,我都会遇到构造函数错误或其他错误。

我发现的所有解决方案都太旧了,从那时起API就发生了变化。

请帮助我!

编辑: 我已经尝试在register()和boot()中绑定我自己的路由器(如上所述),但它不起作用。

这是我的代码:

<?php

namespace MyApp;

use Illuminate\Support\ServiceProvider;
use MyApp\Extensions\Router;
class MyAppServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app['router'] = $this->app->share(function($app)
        {
            return new Router(new Illuminate\Events\Dispatcher); 
        }
        // Other bindings ...
    }
}

当我尝试使用我的路由器时,我遇到了需要Dispatcher的问题。

所以我必须这样做:

$router = new Router(new Illuminate\Events\Dispatcher); // Else I get an exception :(

如果我打电话,它也什么都不做:

$router->test(); 

:(

如果我打电话     DD($路由器 - &GT;试验());

我得到了空白

3 个答案:

答案 0 :(得分:2)

查看:app/config/app.php和别名数组。您将看到Route是通过外观类的照明路由器的别名。

如果您查看照明来源的Support/Facades/Route.php中的外观类,您会看到它使用$app['router']

与laravel中的许多服务提供商不同,路由器是硬编码的,如果没有大量工作重新启动laravel或编辑供应商来源(两者都不是一个好主意),就不能换掉它。您可以转到Illuminate / Foundation / Application.php并搜索RoutingServiceProvider来查看其硬编码。

然而,我没有理由认为这会阻止你覆盖服务提供商中的路由器类。因此,如果您为自定义路由器创建一个服务提供程序,该服务提供程序绑定到$app['router'],那么应该使用您自己的路由器替换默认路由器。

我不希望这种方法出现任何问题,因为提供程序应该在任何路由完成之前加载。因此,覆盖路由器应该在laravel开始使用路由器类之前发生,但我之前没有这样做,所以如果它不能立即工作,请准备好进行一些调试。

答案 1 :(得分:0)

所以我在官方的Laravel IRC中询问,看起来你根本无法在4.1中扩展路由器。至少这是我在一次长时间对话中得到的回应。

它在Laravel 4.0中有效,但现在它还没有。哦,也许它会再次在4.2中工作。 其他包也受此影响:https://github.com/jasonlewis/enhanced-router/issues/16

无论如何,我个人会坚持我的扩展请求。它并没有那么大的区别,只是路由器会更有活力,更适合。

答案 2 :(得分:0)

我正在使用Laravel 4.2,并且路由器真的被硬编码到应用程序中,但我用这种方式扩展了它:

编辑bootstrap / start.php,为YourNamespace \ Application更改Illuminate \ Foundation \ Application。

创建一个名为YourNamespace \ Application的类,并扩展\ Illuminate \ Foundation \ Application。

class Application extends \Illuminate\Foundation\Application {
    /**
     * Register the routing service provider.
     *
     * @return void
     */
    protected function registerRoutingProvider()
    {
        $this->register(new RoutingServiceProvider($this));
    }
}

创建一个名为YourNamespace \ RoutingServiceProvider的类并扩展\ Illuminate \ Routing \ RoutingServiceProvider。

class RoutingServiceProvider extends \Illuminate\Routing\RoutingServiceProvider {

    protected function registerRouter()
    {
        $this->app['router'] = $this->app->share(function($app)
        {
            $router = new Router($app['events'], $app);

            // If the current application environment is "testing", we will disable the
            // routing filters, since they can be tested independently of the routes
            // and just get in the way of our typical controller testing concerns.
            if ($app['env'] == 'testing')
            {
                $router->disableFilters();
            }

            return $router;
        });
    }
}

最后,创建YourNamespace \ Router扩展\ Illuminate \ Routing \ Router,你就完成了。

注意:虽然您没有更改类的名称,例如Router和RoutingServiceProvider,但它会起作用,因为命名空间解析会将其指向YourNamespace \ Router等等。