php框架Laravel文档推介—HTTP 路由

基本路由

您将在 app/Http/routes.php 中定义应用中的大多数路由,这个文件加载了 App\Providers\RouteServiceProvider类。 大多数基本的 Laravel 路由都只接受一个 URI 和 一个 闭包(Closure) 参数:

基本 GET 路由

Route::get('/', function(){
    return 'Hello World';});

其他基础路由

Route::post('foo/bar', function(){
    return 'Hello World';});Route::put('foo/bar', function(){
    //});Route::delete('foo/bar', function(){
    //});

为多种请求注册路由

Route::match(['get', 'post'], '/', function(){
    return 'Hello World';});

注册路由响应所有 HTTP 请求

Route::any('foo', function(){
    return 'Hello World';});

通常情况下,您将会需要为您的路由产生 URL,您可以使用 url 辅助函数来操作:

$url = url('foo');

CSRF 保护

Laravel 提供简易的方法,让您可以保护您的应用程序不受到 CSRF (跨网站请求伪造) 攻击。跨网站请求伪造是一种恶意的攻击,借以代表经过身份验证的用户执行未经授权的命令。

Laravel 会自动在每一位用户的 session 中放置随机的 token ,这个 token 将被用来确保经过验证的用户是实际发出请求至应用程序的用户:

插入 CSRF Token 到表单

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

当然也可以在 Blade 模板引擎使用:

<input type="hidden" name="_token" value="{{ csrf_token() }}">

您不需要手动验证在 POST、PUT、DELETE 请求的 CSRF token。 VerifyCsrfToken HTTP 中间件将保存在 session 中的请求输入的 token 配对来验证 token 。

X-CSRF-TOKEN

除了寻找 CSRF token 作为「POST」参数,中间件也检查 X-XSRF-TOKEN 请求头,比如,你可以把 token 存放在 meta 标签中, 然后使用 jQuery 将它加入到所有的请求头中:

<meta name="csrf-token" content="{{ csrf_token() }}" />$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }});

现在所有的 AJAX 请求会自动加入 CSRF token:

$.ajax({
  url: "/foo/bar",})

X-XSRF-TOKEN

Laravel 也在 cookie 中存放了名为 XSRF-TOKEN 的 CSRF token。你可以使用这个 cookie 值来设置X-XSRF-TOKEN 请求头。一些 Javascript 框架,比如 Angular ,会自动设置这个值。

注意: X-CSRF-TOKEN 和 X-XSRF-TOKEN 的不同点在于前者使用的是纯文本而后者是一个加密的值,因为在 Laravel 中 cookies 始终是被加密过的。如果你使用 csrf_token() 函数来作为 token 的值, 你需要设置 X-CSRF-TOKEN 请求头。

方法欺骗

HTML 表单没有支持 PUT 、PATCH 或 DELETE 请求。所以当定义 PUT 、PATCH 以及 DELETE 路由并在 HTML 表单中被调用的时候,您将需要添加隐藏 _method 字段在表单中。

发送的 _method 字段对应的值会被当做 HTTP 请求方法。举例来说:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"></form>

路由参数

当然,您可以获取请求路由的 URI 区段。

基础路由参数

Route::get('user/{id}', function($id){
    return 'User '.$id;});

注意: 路由参数不能包含 - 字符。使用下划线替代 (_)。

可选择的路由参数

Route::get('user/{name?}', function($name = null){
    return $name;});

带默认值的路由参数

Route::get('user/{name?}', function($name = 'John'){
    return $name;});

使用正则表达式限制参数

Route::get('user/{name}', function($name){
    //})->where('name', '[A-Za-z]+');Route::get('user/{id}', function($id){
    //})->where('id', '[0-9]+');

使用条件限制数组

Route::get('user/{id}/{name}', function($id, $name){
    //})->where(['id' => '[0-9]+', 'name' => '[a-z]+'])

定义全局模式

如果你想让特定路由参数总是遵询特定的正则表达式,可以使用 pattern 方法。在 RouteServiceProvider 的boot 方法里定义模式:

$router->pattern('id', '[0-9]+');

定义模式之后,会作用在所有使用这个特定参数的路由上:

Route::get('user/{id}', function($id){
    // 只有 {id} 是数字才被调用。});

取得路由参数

如果需要在路由外部取得其参数,使用 input 方法:

if ($route->input('id') == 1){
    //}

你也可以使用 Illuminate\Http\Request 实体取得路由参数。当前请求的实例可以通过 Request facade 取得,或透过类型提示 Illuminate\Http\Request 注入依赖:

use Illuminate\Http\Request;Route::get('user/{id}', function(Request $request, $id){
    if ($request->route('id'))
    {
        //    }});

命名路由

命名路由让你更方便于产生 URL 与重定向特定路由。您可以用 as 的数组键值指定名称给路由:

Route::get('user/profile', ['as' => 'profile', function(){
    //}]);

也可以为控制器动作指定路由名称:

Route::get('user/profile', [
    'as' => 'profile', 'uses' => 'UserController@showProfile']);

现在你可以使用路由名称产生 URL 或进行重定向:

$url = route('profile');$redirect = redirect()->route('profile');

currentRouteName 方法会返回目前请求的路由名称:

$name = Route::currentRouteName();

路由群组

Sometimes many of your routes will share common requirements such as URL segments, middleware, namespaces, etc. Instead of specifying each of these options on every route individually, you may use a route group to apply attributes to many routes.

Shared attributes are specified in an array format as the first parameter to the Route::group method.

Middleware

Middleware are applied to all routes within the group by defining the list of middleware with the middlewareparameter on the group attribute array. Middleware will be executed in the order you define this array:

Route::group(['middleware' => ['foo', 'bar']], function(){
    Route::get('/', function()
    {
        // Has Foo And Bar Middleware    });

    Route::get('user/profile', function()
    {
        // Has Foo And Bar Middleware    });});

Namespaces

您一样可以在 group 属性数组中使用 namespace 参数,指定在这群组中控制器的命名空间:

Route::group(['namespace' => 'Admin'], function(){
    // Controllers Within The "App\Http\Controllers\Admin" Namespace
    Route::group(['namespace' => 'User'], function()
    {
        // Controllers Within The "App\Http\Controllers\Admin\User" Namespace    });});

注意: 在默认情况下,RouteServiceProvider 包含内置您命名空间群组的 routes.php 文件,让您不须使用完整的 App\Http\Controllers 命名空间前缀就可以注册控制器路由。

子域名路由

Laravel 路由一样可以处理通配符的子域名,并且从域名中传递您的通配符参数:

注册子域名路由

Route::group(['domain' => '{account}.myapp.com'], function(){

    Route::get('user/{id}', function($account, $id)
    {
        //    });});

路由前缀

群组路由可以通过群组的描述数组中使用 prefix 选项,将群组内的路由加上前缀:

Route::group(['prefix' => 'admin'], function(){
    Route::get('users', function()
    {
        // Matches The "/admin/users" URL    });});

You can also utilize the prefix parameter to pass common parameters to your routes:

Registering a URL parameter in a route prefix

Route::group(['prefix' => 'accounts/{account_id}'], function(){
    Route::get('detail', function($account_id)
    {
        //    });});

You can even define parameter constraints for the named parameters in your prefix:

Route::group([
    'prefix' => 'accounts/{account_id}',
    'where' => ['account_id' => '[0-9]+'],], function() {

    // Define Routes Here});

文档转载自:http://www.golaravel.com/laravel/docs/5.0/routing/

版权及转载说明

本站原创、转载文章欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区

本站转载文章版权归原作者所有,如发现本站文章涉嫌侵权请点击「联系我们」反馈,本站将立即给予删除

转载请注明:文章转载自:全分享社区 「http://www.aweb.cc

本文标题:php框架Laravel文档推介—HTTP 路由

本文地址:http://www.aweb.cc/article/detail/id/372.html

php框架Laravel—HTTP 中间 <<上一篇 下一篇>>17款最佳的代码审查工具

200g_v3.jpg