基本路由
大部分路由定义位于文件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
一节。