<?php namespace Illuminate\Routing;
use Illuminate\Support\ServiceProvider;
class RoutingServiceProvider extends ServiceProvider {
/**
* Register the service provider.
* 注册服务提供者。
*
* @return void
*/
public function register()
{
// 注册路由实例 Illuminate\Routing\Router
$this->registerRouter();
// 注册 Url 生成器实例 Illuminate\Routing\UrlGenerator
$this->registerUrlGenerator();
// 注册 Redirector(跳转)实例 Illuminate\Routing\Redirector
$this->registerRedirector();
// 注册 Response(响应)实例 Illuminate\Routing\ResponseFactory
$this->registerResponseFactory();
}
/**
* Register the router instance.
* 注册路由实例。
*
* @return void
*/
protected function registerRouter()
{
$this->app['router'] = $this->app->share(function($app)
{
return new Router($app['events'], $app);
});
}
/**
* Register the URL generator service.
* 注册 Url 生成器实例。
*
* @return void
*/
protected function registerUrlGenerator()
{
$this->app['url'] = $this->app->share(function($app)
{
$routes = $app['router']->getRoutes();
// The URL generator needs the route collection that exists on the router.
// Keep in mind this is an object, so we're passing by references here
// and all the registered routes will be available to the generator.
$app->instance('routes', $routes);
$url = new UrlGenerator(
$routes, $app->rebinding(
'request', $this->requestRebinder()
)
);
$url->setSessionResolver(function()
{
return $this->app['session'];
});
// If the route collection is "rebound", for example, when the routes stay
// cached for the application, we will need to rebind the routes on the
// URL generator instance so it has the latest version of the routes.
$app->rebinding('routes', function($app, $routes)
{
$app['url']->setRoutes($routes);
});
return $url;
});
}
/**
* Get the URL generator request rebinder.
*
* @return \Closure
*/
protected function requestRebinder()
{
return function($app, $request)
{
$app['url']->setRequest($request);
};
}
/**
* Register the Redirector service.
* 注册 Redirector(跳转)服务。
*
* @return void
*/
protected function registerRedirector()
{
$this->app['redirect'] = $this->app->share(function($app)
{
$redirector = new Redirector($app['url']);
// If the session is set on the application instance, we'll inject it into
// the redirector instance. This allows the redirect responses to allow
// for the quite convenient "with" methods that flash to the session.
if (isset($app['session.store']))
{
$redirector->setSession($app['session.store']);
}
return $redirector;
});
}
/**
* Register the response factory implementation.
* 注册 Response(响应)实例。
*
* @return void
*/
protected function registerResponseFactory()
{
$this->app->singleton('Illuminate\Contracts\Routing\ResponseFactory', function($app)
{
return new ResponseFactory($app['Illuminate\Contracts\View\Factory'], $app['redirect']);
});
}
}