基本路由
應(yīng)用中的大多數(shù)路都會(huì)定義在 app/routes.php 文件中。最簡(jiǎn)單的laravel路由由uri和閉包回調(diào)函數(shù)組成。
基本 get 路由
代碼如下:
route::get('/', function()
{
return 'hello world';
});
基本 post 路由
代碼如下:
route::post('foo/bar', function()
{
return 'hello world';
});
注冊(cè)一個(gè)可以響應(yīng)任何http動(dòng)作的路由
代碼如下:
route::any('foo', function()
{
return 'hello world';
});
僅支持https的路由
代碼如下:
route::get('foo', array('https', function()
{
return 'must be over https';
}));
實(shí)際開(kāi)發(fā)中經(jīng)常需要根據(jù)路由生成 url,url::to方法就可以滿足此需求:
$url = url::to('foo');
路由參數(shù)
代碼如下:
route::get('user/{id}', function($id)
{
return 'user '.$id;
});
可選路由參數(shù)
代碼如下:
route::get('user/{name?}', function($name = null)
{
return $name;
});
帶有默認(rèn)值的可選路由參數(shù)
代碼如下:
route::get('user/{name?}', function($name = 'john')
{
return $name;
});
用正則表達(dá)式限定的路由參數(shù)
代碼如下:
route::get('user/{name}', function($name)
{
//
})
->where('name', '[a-za-z]+');
route::get('user/{id}', function($id)
{
//
})
->where('id', '[0-9]+');
傳遞參數(shù)限定的數(shù)組
當(dāng)然,必要的時(shí)候你還可以傳遞一個(gè)包含參數(shù)限定的數(shù)組作為參數(shù):
代碼如下:
route::get('user/{id}/{name}', function($id, $name)
{
//
})
->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))
定義全局模式
如果希望在全局范圍用指定正則表達(dá)式限定路由參數(shù),可以使用 pattern 方法:
代碼如下:
route::pattern('id', '[0-9]+');
route::get('user/{id}', function($id)
{
// only called if {id} is numeric.
});
訪問(wèn)路由參數(shù)
如果想在路由范圍外訪問(wèn)路由參數(shù),可以使用 route::input 方法:
代碼如下:
route::filter('foo', function()
{
if (route::input('id') == 1)
{
//
}
});
路由過(guò)濾器
路由過(guò)濾器提供了非常方便的方法來(lái)限制對(duì)應(yīng)用程序中某些功能訪問(wèn),例如對(duì)于需要驗(yàn)證才能訪問(wèn)的功能就非常有用。laravel框架自身已經(jīng)提供了一些過(guò)濾器,包括 auth過(guò)濾器、auth.basic過(guò)濾器、guest過(guò)濾器以及csrf過(guò)濾器。這些過(guò)濾器都定義在app/filter.php文件中。
定義一個(gè)路由過(guò)濾器
代碼如下:
route::filter('old', function()
{
if (input::get('age') < 200)
{
return redirect::to('home');
}
});
如果從路由過(guò)濾器中返回了一個(gè)response,那么該response將被認(rèn)為對(duì)應(yīng)的是此次request,路由將不會(huì)被執(zhí)行,并且,此路由中所有定義在此過(guò)濾器之后的代碼也都不會(huì)被執(zhí)行。
為路由綁定過(guò)濾器
代碼如下:
route::get('user', array('before' => 'old', function()
{
return 'you are over 200 years old!';
}));
將過(guò)濾器綁定為控制器action
代碼如下:
route::get('user', array('before' => 'old', 'uses' => 'usercontroller@showprofile'));
為路由綁定多個(gè)過(guò)濾器
代碼如下:
route::get('user', array('before' => 'auth|old', function()
{
return 'you are authenticated and over 200 years old!';
}));
指定過(guò)濾器參數(shù)
代碼如下:
route::filter('age', function($route, $request, $value)
{
//
});
route::get('user', array('before' => 'age:200', function()
{
return 'hello world';
}));
所有其后的過(guò)濾器將接收到 $response作為第三個(gè)參數(shù):
代碼如下:
route::filter('log', function($route, $request, $response, $value)
{
//
});
基于模式的過(guò)濾器
你也可以指針對(duì)uri為一組路由指定過(guò)濾器。
代碼如下:
route::filter('admin', function()
{
//
});
route::when('admin/*', 'admin');
上述案例中,admin過(guò)濾器將會(huì)應(yīng)用到所有以admin/開(kāi)頭的路由中。星號(hào)是通配符,將會(huì)匹配任意多個(gè)字符的組合。
還可以針對(duì)http動(dòng)作限定模式過(guò)濾器:
代碼如下:
route::when('admin/*', 'admin', array('post'));
過(guò)濾器類
過(guò)濾器的高級(jí)用法中,還可以使用類來(lái)替代閉包函數(shù)。由于過(guò)濾器類是通過(guò)ioc container實(shí)現(xiàn)解析的,所有,你可以在這些過(guò)濾器中利用依賴注入(dependency injection)的方法實(shí)現(xiàn)更好的測(cè)試能力。
定義一個(gè)過(guò)濾器類
代碼如下:
class foofilter {
public function filter()
{
// filter logic...
}
}
注冊(cè)過(guò)濾器類
代碼如下:
route::filter('foo', 'foofilter');
命名路由
重定向和生成url時(shí),使用命名路由會(huì)更方便。你可以為路由指定一個(gè)名字,如下所示:
代碼如下:
route::get('user/profile', array('as' => 'profile', function()
{
//
}));
還可以為 controller action指定路由名稱:
代碼如下:
route::get('user/profile', array('as' => 'profile', 'uses' => 'usercontroller@showprofile'));
現(xiàn)在,你可以使用路由名稱來(lái)創(chuàng)建url和重定向:
代碼如下:
$url = url::route('profile');
$redirect = redirect::route('profile');
可以使用currentroutename方法來(lái)獲取當(dāng)前運(yùn)行的路由名稱:
代碼如下:
$name = route::currentroutename();
路由組
有時(shí)你可能需要為一組路由應(yīng)用過(guò)濾器。使用路由組就可以避免單獨(dú)為每個(gè)路由指定過(guò)濾器了:
代碼如下:
route::group(array('before' => 'auth'), function()
{
route::get('/', function()
{
// has auth filter
});
route::get('user/profile', function()
{
// has auth filter
});
});
子域名路由
laravel中的路由功能還支持通配符子域名,你可以在域名中指定通配符參數(shù):
注冊(cè)子域名路由
代碼如下:
route::group(array('domain' => '{account}.myapp.com'), function()
{
route::get('user/{id}', function($account, $id)
{
//
});
});
路由前綴
可以通過(guò)prefix屬性為組路由設(shè)置前綴:
為路由組設(shè)置前綴
代碼如下:
route::group(array('prefix' => 'admin'), function()
{
route::get('user', function()
{
//
});
});
路由與模型綁定
模型綁定,為在路由中注入模型實(shí)例提供了便捷的途徑。例如,你可以向路由中注入匹配用戶id的整個(gè)模型實(shí)例,而不是僅僅注入用戶id。首先,使用 route::model 方法指定要被注入的模型:
將參一個(gè)模型
route::model('user', 'user');
然后,定義一個(gè)包含{user}參數(shù)的路由:
代碼如下:
route::get('profile/{user}', function(user $user)
{
//
});
由于我們已將{user}參數(shù)綁定到了user模型,因此可以向路由中注入一個(gè)user實(shí)例。例如,對(duì)profile/1的訪問(wèn)將會(huì)把id為1的user實(shí)例注入到路由中。
注意: 如果在數(shù)據(jù)庫(kù)中無(wú)法匹配到對(duì)應(yīng)的模型實(shí)例,404錯(cuò)誤將被拋出。
如果你希望自定義not found行為,可以通過(guò)傳遞一個(gè)閉包函數(shù)作為 model 方法的第三個(gè)參數(shù):
代碼如下:
route::model('user', 'user', function()
{
throw new notfoundexception;
});
如果你想自己實(shí)現(xiàn)路由參數(shù)的解析,只需使用route::bind方法即可:
代碼如下:
route::bind('user', function($value, $route)
{
return user::where('name', $value)->first();
});
拋出 404 錯(cuò)誤
有兩種從路由中手動(dòng)觸發(fā)404錯(cuò)誤的方法。首先,你可以使用app::abort方法:
代碼如下:
app::abort(404);
其次,你可以拋出symfony\component\httpkernel\exception\notfoundhttpexception異常。