laravel系列4-- 路由

基本路由

大部分路由定义位于文件app/Http/routes.php中,
该文件是由App\Providers\RouteServiceProvide类载入的
下面给出几种路由的示例

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';
});
++++++++++++++++++++++++++++++
Route::any('foo', function()
{
    return 'Hello World';
});

通常使用url 助手类生成对应的url(这个回头补充,理解的不够)

$url = url('foo');

跨站防御

在ssesion中设置了token,提交表单的时候需要携带该token,从而防止跨站请求。该操作是由中间件实现的,不需要手工设置
模板中的代码应该是这样的

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

使用ajax提交的时候,需要一点技巧,那就是将token输出到一个标签中,然后提取标签值即可。代码如下:

<meta name="csrf-token" content="{{ csrf_token() }}" />

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

方法欺骗

由于http不支持delete、put等方法,因此需要在表单中使用_method隐士传输方法,示例代码如下:

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

路由参数

路由参数示例如下:

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]+']);
++++++++++++++++++++++++++++++

如果要使用全局的匹配模式,可以再RouteServiceProvider中的boot方法中使用pattern方法

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

获取传入参数的方法为

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

或者通过request实例进行读取

use Illuminate\Http\Request;

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

命名路由

命名路由,方便的进行重定向,使用as关键字。

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

使用方式如下:

$url = route('profile');

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

currentRouteName 方法可以得到当前路由名

$name = Route::currentRouteName();

路由组

用于处理需要相同属性的路由,需要设定的公共属性在Route::group方法的第一个参数中指定。
中间件
中间件可以用在路由组中,对同一组路由进行统一操作,定义和使用的方式如下所示

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

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

});

命名空间
可以使用命名空间,定义一组路由的控制器前缀,用法如下

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
    });
});

子域路由
子域路由用于子域名的路由控制,用法如下

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

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

});

路由前缀
具体用法如下

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

在路由前缀中使用参数

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

也可以使用参数约束条件,示例如下

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

    // Define Routes Here
});

路由模型绑定

用于注射类实例到路由中,使用路由的model方法,在RouteServiceProvider::boot中定义绑定模型,示例如下

public function boot(Router $router)
{
    parent::boot($router);

    $router->model('user', 'App\User');
}

接下来,定义一个包含{user}的路由

Route::get('profile/{user}', function(App\User $user)
{
    //
});

上述过程,其实是在route类中得到了一个具有特定参数的user类的对象,也就是所谓的绑定。
如果要定义页面未找到的动作,只需要传入一个闭包函数,示例如下

Route::model('user', 'User', function()
{
    throw new NotFoundHttpException;
});

如果希望在逻辑中对实例进行一些处理,可以使用bind函数,示例如下

Route::bind('user', function($value)
{
    return User::where('name', $value)->first();
});

抛出404错误
首先是 使用abort辅助辅助类 ,代码如下

abort(404);

这将会生成Symfony\Component\HttpKernel\Exception\HttpException
其次,需要手动实例化Symfony\Component\HttpKernel\Exception\HttpException更多的与错误有关的请参阅error一节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值