laravel的路由是定义在/routes/web.php文件中
一 .自定义路由文件
1.在routes目录下新建一个路由文件引入 Illuminate\Support\Facades\Route;
2.注册路由文件,在 app\Providers\RouteServiceProvider.php编写方法并调用
路由注册
protected function mapLyRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/ly.php'));//路由文件地址
}
在map方法中进行调用
/**
* Define the routes for the application.
*
* @return void
*/
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
$this->mapLyRoutes();
}
二.使用路由
【注意 CSRF 保护】:
由于路由给提供了 CSRF 保护,所以要实现以上功能需要注释掉中间件中 CSRF 部分:
CSRF 保护:指向 web 路由文件中定义的 POST 、 PUT 或 DELETE 路由的任何 HTML 表单都应
该包含一个 CSRF 令牌字段,否则,这个请求将会被拒绝。
或者给该路由写入白名单【 app\Http\Middleware\VerifyCsrfToken.php 文件中写入路由名称】
1.添加路由标识
\Http\Middleware\VerifyCsrfToken.php;
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::post('ceshi', function () {
return '我是post方法';
});
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
'ceshi',
];
}
2.注释中间件中 CSRF 部分
\app\Http\Kernel.php
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
// \App\Http\Middleware\VerifyCsrfToken::class,//注释掉这个CSRF 部分
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
路由器允许你注册能响应任何 HTTP 请求的路由:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
# 路由方法 路由标识 闭包
Route::get('foo', function () {
return 'Hello World';
});
# 也可以路由到控制器:路由到 app\Http\Controllers\HelloController 控制器的hello方法
Route::get('foo', 'HelloController@hello');
有的时候你可能需要注册一个可响应多个 HTTP 请求的路由,这时你可以使用 match 方法,也可以使
用 any 方法注册一个实现响应所有 HTTP 请求的路由
# 能匹配到数组中的任意一种方式
Route::match(['get', 'post'], '/', function () {
//
});
# 能匹配到任意一种方式
Route::any('/', function () {
//
});
三.路由参数
3.1 必填参数
有时需要在路由中捕获一些 URL 片段。例如,从 URL 中捕获用户的 ID,可以通过定义路由参数来执行
此操作
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
可以通过 http://lbl.com/user/1 访问以上方法, 1 代表的就是 id 的值, 当访问的时候没有传递该参
数则会出错,该参数必须传递。
也可以根据需要在路由中定义多个参数【 注意:传递的第一个参数对应参数列表的第一个参数 和名称
无关 】:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
3.2 可选参数
有时,你可能需要指定一个路由参数,但你希望这个参数是可选的。你可以在参数后面加上?标记来实
现,但前提是要确保路由的相应变量有默认值
Route::get('user/{name?}', function ($name = null) {
return $name;
});
以上内容通过 http://lbl.com/user 和 http://lbl.com/user/hello 访问, name 参数是可以选择性的传
递。
3.3. 路由正则
3.3.1 正则表达式约束
你可以使用路由实例上的 where 方法约束路由参数的格式。 where 方法接受参数名称和定义参数应如
何约束的正则表达式
// 使用正则表达式限定 name 参数必须是字母的
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('user/{name}/{age}', function ($name) {
//
})->where(['name'=>'[A-Za-z]+','age'=>'[1-10]+']);
以上内容可以通过 http://lbl.com/user/hello 访问到却不能通过 http://lbl.com/user/123 访问。
3.3.2 全局约束
如果你希望某个具体的路由参数都遵循同一个正则表达式的约束,就使用 pattern 方法在
\app\Providers\RouteServiceProvider.php 的 boot 方法中定义这些模式:
public function boot()
{
Route::pattern('name','[a-z]+');
parent::boot();
}
一旦定义好之后,便会自动应用这些规则到所有使用该参数名称的路由上
3.4
路由命名:可以方便地为指定路由生成 URL 或者重定向 。通过在路由定义上链式调用 name 方法可以
指定路由名称
Route::get('getu', function () {
return \route('user');// 生成命名路由的URL
// return redirect()->route('user'); // 也可以快速重定向到 user
});
Route::get('user', function () {
return '路由标识';
})->name('user');
3.5.路由组
路由组允许你在大量路由之间共享路由属性,例如中间件或命名空间,而不需要为每个路由单独定义这
些属性。共享属性应该以数组的形式传入 Route::group 方法的第一个参数中。以下为常用共享属性
的具体说明:
2.5.1中间件
创建中间件
命令:php artisan make:middleware 中间件名称
中间件创建后会默认放入 app\Http\Middleware 目录。另外还需要把创建的中间件在
app\Http\Kernel.php 文件中注册才能使用
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'test' => \App\Http\Middleware\Test::class,//注册中间件
];
注册之后就可以在路由中使用到中间件的内容了
namespace App\Http\Middleware;
use Closure;
class Test
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$request->name ='张三';
return $next($request);
}
}
Route::middleware(['test'])->group(function (){
Route::get('ceshi',function (\Illuminate\Http\Request $request){
return $request->name;
});
});
在使用该中间的所有路由都会先执行中间件中的内容。
3.5.2. 命名空间
另一个常见用例是使用 namespace 方法将相同的 PHP 命名空间分配给路由组的中所有的控制器
Route::namespace('Admin')->group(function (){
Route::get('useri',function(){
return 'Admin1';
});
Route::get('userh',function(){
return 'Admin2';
});
});
可以分别通过 http://lbl.com/useri 和 http://lbl.com/userh 访问到 index 和 hello 方法
3.5.3. 路由前缀
可以用 prefix 方法为路由组中给定的 URL 增加前缀。例如,你可以为组中所有路由的 URI 加上
admin 前缀
Route::prefix('admin')->group(function () {
Route::get('users', function () {
//
});
});
在访问的时候该路由组下的所有路由都需要加上 admin 作为前缀 http://lbl.com/admin/users。
name 方法可以用来给路由组中的每个路由名称添加一个给定的字符串。注意这里是给 路由名称 给前
缀而不是 路由标识。例如,希望以 admin 给所有的路由名称添加前缀
Route::name('admin.')->group(function (){
Route::get('users',function (){
return 'users';
})->name('users');
Route::get('goods',function (){
return 'goods';
})->name('goods');;
});
Route::get('ceshi',function (){
return redirect()->route('admin.users'); // 也可以快速重定向到 users
});
3.5.4. 路由组
以上内容都可以以数组的形式传入 Route::group 方法的第一个参数中,也可以使用嵌套的方式组合
使用
Route::group(['namespace'=>'admin','prefix'=>'pre'],function(){
Route::middleware('first')->group(function(){
Route::get('users','AdminController@index');
});
});
3.6. 回退路由
使用 Route::fallback 方法, 您可以定义一个在没有其他路由可匹配传入的请求时才执行的路由
Route::fallback(function (){
return '未找到此地址';
});