我想扩展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;试验());
我得到了空白
答案 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等等。