Laravel - 路由
[ 1 - basic-view 路由 ]
//Url: http://localhost/sample/public/example1
//页面上就会显示
//Example-1
Route::get('/example1',function(){
return 'Example - 1';
});
[ 2 - basic-view带参数的路由 ]
//Url: http://localhost/sample/public/example2/username/xianyu
//页面上就会显示
//Example - 2
//Your name is xianyu
Route::get('/example2/username/{name}',function($name){
$str = 'Example - 2 </br>';
$str .= 'Your name is '.$name;
return $str;
});
[ 3 - basic-view参数正则路由 ]
//Url: http://localhost/sample/public/example3/phone/135xxxxxx44
//页面上就会显示
//Example - 3
//Your phone is 135xxxxxx44
Route::get('/example3/phone/{number}', function ($number) {
$str = 'Example - 3 </br>';
$str .= 'Your phone is '.$number;
return $str;
})->where(['number'=>'[0-9]{11}']);
[ 4 - basic-view自选参数路由 ]
//Url: http://localhost/sample/public/example4/rider/kabuto/sign/false/age
//页面上就会显示
//Example - 4
//kabuto ====> Cast On 10;
//这里有个问题就是,虽然有两个自选参数,但实际上应该是只有最后一个参数可以不填东西的。
//最后一个 '自选参数' 前的那些 '自选参数' 都是必填项目了。
Route::get('/example4/rider/{username}/sign/{sign?}/age/{age?}',function($username, $sign = false, $age = 10){
if ($sign){
$str = 'Example - 4 </br>';
$str .= $username.' ====> Cast Off '.$age;
} else {
$str = 'Example - 4 </br>';
$str .= $username.' ====> Cast On '.$age;
}
return $str;
});
[ 5 - 全局控制 ]
首先我们要前往 /app/Providers/RouteServiceProvider.php 在 boot()添加代码
<?php
...
public function boot()
{
//路由参数的全局控制
Route::pattern('Gatack', 'Gatack');
parent::boot();
}
...
然后写路由,这个全局控制说明了,凡是 $Gatack 这个路由变量,只能输入Gatack, 否则就算错误路由。
//Url: http://localhost/sample/public/example5/rider/onlyname/Gatack
//页面上就会显示
//Example - 5
//Only Gatack;
Route::get('/example5/onlyname/{Gatack}', function($Gatack){
$str = 'Example - 5 </br>';
$str .= 'Only '.$Gatack;
return $str;
});
[ 6 - 命名路由 ]
//Url: http://localhost/sample/public/example6
//页面上就会显示
//Hensin
Route::get('/example6',function(){
$str = 'Hensin';
return $str;
})->name('Hensin');
可以使用 php artisan route:list来查看现在有的路由
指定了名称的路由可以在代码中使用 route('name') 生成url字符串
有参数的时候,调用形式为route('name',['key1'=>'value1']);
[ 7 - CSRF保护 ]
//这里使用了 match ,让路由可以同时兼容多种方法
//在POST - PUT - DELETE 中必须使用 CSRF 做保护
//前端模板使用的时候可以写成 {!! csrf_field() !!}
//Url-get访问: http://localhost/sample/public/example7
//生成了一个表单
//Url-post访问: http://localhost/sample/public/example7
//根据表单提交来显示结果。
use Illuminate\Http\Request;
Route::match(['get', 'post'],'/example7',function(Request $request){
$str = "";
if ($request->isMethod('post')) {
$str = "Input username is ".$request->username."</br>";
$str .= "Input password is ".$request->password."</br>";
}
else if($request->isMethod('get')){
$csrf = csrf_field();
$str = '<form method="POST" action="">';
$str .= $csrf;
$str .= '<input type="text" value="" name="username">User Name
<input type="password" value="" name="password">Password
<input type="submit" value="提交">
</form>';
}
return $str;
});
[ 8 - 路由组 ]
//A.命名空间
//B.中间件
//C.路由前缀
Route::group(['namespace' => 'admin'],function(){
// 在 "App\Http\Controllers\Admin" 命名空间下的控制器
});
Route::group(['middleware' => 'auth'],function(){
// 使用 `Auth` 中间件
});
Route::group(['prefix' => 'admin'], function () {
Route::get('/example8', function () {
// 匹配包含 "/admin/users" 的 URL
return $str="Example - 8";
});
});
[ 9 - basic-view带参数的路由 ]
//路由绑定了 RiderController 的 index 方法
//我们来生成一个 RiderController
//可用用上这个命令 php artisau make::controller [-option] name
//-r 的作用是生成一个资源控制器,包含Laravel 给你默认生成的方法
//运行 php artisau make::controller App\Http\Controllers\RiderController
Route::get('/rider','RiderController@index')->name('RiderList');
[ 10 - 资源路由 ]
运行 php artisau make::controller -r App\Http\Controllers\MonsterController
我们就会生成一个带有资源方法控制器, 大概如下所示
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class MonsterController extends Controller
{
public function index()
{
}
public function create()
{
}
public function store(Request $request)
{
}
public function show($id)
{
}
public function edit($id)
{
}
public function update(Request $request, $id)
{
}
public function destroy($id)
{
}
}
我们路由就可以写成下面这样形式。
Route::resource('monster','MonsterController');
实际上等同于
Route::get('monster','MonsterController@index');
Route::get('monster','MonsterController@create');
Route::post('monster','MonsterController@store');
Route::get('monster','MonsterController@show');
Route::get('monster','MonsterController@edit');
Route::put('monster','MonsterController@update');
Route::delete('monster','MonsterController@destroy');
PS.A - 部分资源路由
//下面这种情况,只有 index 和 show 两个路由被生成出来
Route::resource('monster','MonsterController',['only' => [
'index', 'show'
]]);
PS.B - 资源路由参数改名
//参数名字从 monster 改变成 admin_monster
Route::resource('monster','MonsterController',['parameters' => [
'monster' => 'admin_monster']]
);
PS.C 更改路由命名
//这个时候 create 路由的路由名字变成 photo.build 了。
//route('photo.build'); 当你这样使用的时候, 其实生成的是 monster 的 create 路由连接.
Route::resource('monster','MonsterController',['names' => [
'create' => 'photo.build'
]]);
个人觉得,不要使用什么资源路由,偷懒又阻碍阅读。
认认真真的写好每一条最好。
[ 11 - 路由模型绑定 ]
当传入rider 的主键ID值的时候,可以直接就通过模型获得数据了。
Route::get('rider/detail/{rider}',function(App\Http\models\rider $rider){
$str = "";
$str .= "Name: ".$rider->name."<br/>";
$str .= "Height: ".$rider->height."<br/>";
$str .= "Weight: ".$rider->weight."<br/>";
$str .= "Boxing: ".$rider->boxing."<br/>";
$str .= "Kick: ".$rider->kick."<br/>";
$str .= "Speed: ".$rider->speed."<br/>";
$str .= "Jump: ".$rider->jump."<br/>";
return $str;
});