假設 routes 定義了以下路由:
Route::get('/', 'IndexController@welcome')->name('welcome');
|
我們可以使用下面的方法取得 URL:
先大概了解這個實作方法:
function route($name, $parameters = [], $absolute = true) { return app('url')->route($name, $parameters, $absolute); }
|
這個 url
曾在一開始分析 Routing 的時候提到過,它所對應的類別是 UrlGenerator,註冊方法如下:
$this->app->singleton('url', function ($app) { $routes = $app['router']->getRoutes();
$app->instance('routes', $routes);
$url = new UrlGenerator( $routes, $app->rebinding( 'request', $this->requestRebinder() ) );
$url->setSessionResolver(function () { return $this->app['session']; });
$url->setKeyResolver(function () { return $this->app->make('config')->get('app.key'); });
$app->rebinding('routes', function ($app, $routes) { $app['url']->setRoutes($routes); });
return $url; });
|
route()
函式,實際上是呼叫 UrlGenerator 的 route()
方法
public function route($name, $parameters = [], $absolute = true) { if (! is_null($route = $this->routes->getByName($name))) { return $this->toRoute($route, $parameters, $absolute); }
throw new InvalidArgumentException("Route [{$name}] not defined."); }
|
接著來看看 Redirector。Laravel 也有提供 helper 函式:
function redirect($to = null, $status = 302, $headers = [], $secure = null) { if (is_null($to)) { return app('redirect'); }
return app('redirect')->to($to, $status, $headers, $secure); }
|
這個函式提供兩種用法:
redirect(); redirect('/path');
|
註冊方法如下:
$this->app->singleton('redirect', function ($app) { $redirector = new Redirector($app['url']);
if (isset($app['session.store'])) { $redirector->setSession($app['session.store']); }
return $redirector; });
|
Redirector 建構需要有 UrlGenerator。也因此兩個 helper 函式搭配後,下面的寫法都是通的:
redirect(route('welcome')); redirect()->to(route('welcome')); redirect()->route('welcome'); redirect()->action('IndexController@welcome');
|
這樣的設計是很有趣且可以學習的,Redirector 本身提供了基本的 to()
與 away()
方法,可以導頁到指定的地方外,配合 UrlGenerator 與 Session 還可以做到 route()
、action()
、back()
等,與 Application 本身或狀態相關的導頁。
這是一個使用物件組合功能的好例子。