laraval框架之路由器
一,路由:将用户的请求转发给相应的程序处理,建立url和程序之间的映射
a.基础路由
Route:get('user/show',function(){
return 'user_show';
})
b.多请求路由:一条路由实现多个请求
Route::match(['get','post'],'user/register',function(){
return "regiser";
})
c.任意请求路由
Route::any('user/show',function(){
return "user_show"
})
1.1.路由传参
b.1直接传参
Route::get('user/{id}/{name}',function($id,$name){
return "user_show".$id+"user_name"+$name
})
b.2可选参数,可选参数最好放置末尾
Route::get('page/{page?}',function($page=1){
return "page_".$page
})
1.2路由限制
c.1单参数限制
Route::get('user/{id}',function(){
dump('user_'.$id);
})->where('id','\d+');//调用Route的where方法限制条件,正则限制
c.2多参数限制
Route::get('user/{id}/{name}',function(){
dump($user.$id);
})->where(['id'=>'\d+','name'=>'[a-zA-z]+'])
1.3路由分组
Route::group([‘prefix’=>路由前缀],function(){
路由组
})
Route::group([‘namespace’=>‘命名空间’],function(){
路由组
}
或者
Route::prefix(‘路由前缀’)->group(function(){
路由组
})
二,控制器 app/Http/Controllers/
2.1创建控制器
cmd 窗口 输入 php artisan make:controller 控制器名
如: php artisan make:controller UserConteoller
创建一个uer控制器类
创建的控制器存放在appp/Http/Controller/目录下
也可以指定二级文件目录
如:php artisan make:controller Admin/AdminController
2.2访问控制器
Route::get(‘user/show’,UserController@show);
Routr::get(‘路由’,控制器名@方法名)‘
2.3资源控制器
Laravel 资源路由将典型的「CRUD」路由分配给具有单行代码的控制器。比如,创建一个控制器来处理应用保存的「照片」的所有 HTTP 请求
创建方法 :php artisan make:controller PhotoController --resource
查看资源控制器;
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PhotoController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
给控制器注册一个资源路由
这个路由声明创建多个路由来处理资源上的各种行为。生成的控制器为每个行为保留了方法,同时还包括了 处理 HTTP 动作和 URI 的声明注释。
Route::resource(‘photos’, ‘PhotoController’);
使用命令查看路由
php artisan route:list
设置部分路由:
声明资源路由时,你可以指定控制器处理的部分行为,而不是所有默认的行为:
Route::resource('photo', 'PhotoController', ['only' => [
'index', 'show'
]]);//这给控制器增加index和show行为
Route::resource('photo', 'PhotoController', ['except' => [
'create', 'store', 'update', 'destroy'
]]);//除 create ,store ,update,destory的行为
命名资源路由:
默认情况下,所有的资源控制器行为都有一个路由名称。你可以传入 names 数组来覆盖这些名称:
Route::resource('photo', 'PhotoController', ['names' => [
'create' => 'photo.build'
]]);
命名资源路由参数
Route::resource('user', 'AdminUserController', ['parameters' => [
'user' => 'admin_user'
]]);//生成/user/{admdin_user}
补充资源控制器
如果你想在默认的资源路由中增加额外的路由,你应该在 Route::resource 之前定义这些路由。否则由 resource
方法定义的路由可能会无意中优先于你补充的路由:
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
//{tip} 记住保持控制器的专一性。如果你需要典型的资源操作之外的方法,可以考虑将你的控制器分成两个更小的控制器。
三,中间件
引入
对于一个web应用来说,在一个请求真正处理前,我们可能会对请求做出各种判断,然后才可以让它继续传递到更深层次中。而如果我们使用if…else, 一旦需要得判断条件越来越多,会使代码更加难以维护,而中间件就可以解决这个问题,我们可以把这些判断独立出来做成中间件,可以方便的过滤请求,简单来说,就是插入到控制器方法之前或者之后执行的代码,以影响执行的结果,使代码更加灵活
创建中间件
命令:php artisan make:middleware MiddleName
路径:app\Http\Middleware\MinddleName
namespace App\Http\Middleware;
use Closure;
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
echo 'this is middleware';
return $next($request);
}
}
注册中间件
- 注册到匿名函数
Route::get('midd',['middleware'=>'App\Http\Middleware\Test',function(){
echo "hello";
}]);
2.注册到控制器
app\Http\目录下的Kernel.php文件,在$routeMiddleware属性增加你先前定义的中间件
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'mail'=>\App\Http\Middleware\Mail::class//新增邮件发送中件间
];
在这里设置了中间件后,可直接注册到控制器,而不需要写很长的路径
如:
//注册路由
Route::get('register','RegisterController@showRegistrationForm')->middleware('mail');//mail为$routeMiddleware定义的键
第二种注册到控制器:
与直接注册到匿名函数上不同,这里注册到控制器需设置’users’指定控制器
Route::get('/auth',['middleware'=>'middlename','控制器'])//错误的绑定方式
Route::get('/auth',['middleware'=>'middlename','uses'=>'控制器'])//正确的绑定方式
中间件案例:
1.用户访问某些网页时,验证用户是否登录
将要判断是否登录的网页组成一个路由组,路由组使用Laravel自带的auto中间件验证用户是否登录(也可自定义)
//限制用户登录组
Route::middleware('auth')->group(function(){
//借款路由
Route::get('/jie',function(){
return view('woyaojiekuan');
});
//借款提交
Route::post('jie','ProController@jiepost');
//投标
Route::get('toubiao/{pid}',"ProController@toubiao");
Route::post('toubiao/{pid}','ProController@toubiaoPost');
//我的账单
Route::get('wdzd','ProController@zhangdan');
//我的投资
Route::get('wdtz','ProController@touzhi');
//我的收益
Route::get('wdsy','ProController@shouyi');
//审核列表
Route::get('prolist','CheckController@show');
//审核
Route::match(['get','post'],'check/{id}','CheckController@check');
//打款路由
Route::get('dakuan','GrowController@dakuan');
});
未登录默认跳转到别名为login的路由,给登录路由取别名
Route::get('login','LoginController@showLoginForm')->name('login');//登录取别名,用户未登录跳转到login路由
2.用户注册网站后发送邮件通知
定义中间件 php artisan make:middleware
在app\Http\下的Kernel的routeMiddleware属性增加我们定义的中间件,方便调用
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'mail'=>\App\Http\Middleware\Mail::class//
];
中间件执行邮件发送,这里我使用的第三方类 nettemail composer require nette/mail
<?php
namespace App\Http\Middleware;
use Closure;
use Nette\Mail\Message;
use Nette\Mail\SmtpMailer;
class Mail
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$res=$next($request);
//发送邮件
$mail = new Message;
$mail->setFrom('点点贷 <[email protected]>')
->addTo($request->email)//用户邮箱
->setSubject('欢迎注册点点贷')
->setBody("尊敬的".$request->name."欢迎注册点点贷");
$mailer = new SmtpMailer([
'host' => 'smtp.qq.com',//邮件主机
'username' => '[email protected]',//用户名
'password' => '',//授权码
'secure' => 'ssl',
// 'context' => [
// 'ssl' => [
// 'capath' => '/path/to/my/trusted/ca/folder',
// ],
// ],
]);
$mailer->send($mail);
return $res;
}
}
控制器绑定中间件
//注册路由
Route::get('register','RegisterController@showRegistrationForm')->middleware('mail');
注册成功