一,路由:将用户的请求转发给相应的程序处理,建立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(){
// 路由组
})
路由重定向
通过路由重定向可快速实现重定向页面,而不需完整的对应路由或控制器
Route::redirect('/here', '/there', 301);
视图路由
如果你的路由只需要返回一个视图,可以使用Route::view
方法
view(‘路由’,‘模板名(默认在views/目录下查找)’,[参数(可选,键值对)])
Route::view('/index','bladeName',['name'=>'test'])
命名路由
我们可以给路由取别名,方便生成Url或路由重定向
Route::get('test',function(){})->name('login');
为命名路由生成链接、
通过route()方法
route('路由别名',[name=>test])
路由模型绑定
隐式绑定
Laravel会自动解析定义在路由或控制器行为中与类型提示的变量名匹配的路由段名称的Eloquent模型
这是官方文档的描述
意思就是通过隐式绑定,Laravel会通过路由参数自动匹配路由闭包的传入的模型或者控制器传入的模型,前提是参数名必须更模型名相同
举个例子
有如下路由
Route::get('/test/{post}','TestControler@root');
如下控制器
public function root(Post $post){
dump($post);
}
也可写成闭包函数
Route::get('/test/{post}',function(Post $post){
dump($post)
})
当我们地址栏输入test/id
时,控制器会自动打印对应id
的Post实例
如
自定义键名
除了使用id
匹配模型外,还可以在Eloquent模型上重写getRouteKeyName
方法
public function getRouteKeyName()
{
return 'title';
}
显示绑定
注册显示绑定,使用路由器的model
方法为给定参数指定类,(隐式与显示的区别就体现在这里,显示可以自定义参数名)在RouteServiceProvider
类的boot
方法定义
自定义解析逻辑
如果需要自定义解析逻辑,使用Route::bind
方法。
Route::bind('title', function ($value) {
return App\Post::where('title', $value)->find(2);
});
上述代码表示匹配 ’name‘=value并且id=2的记录
路由缓存
如果你的应用只使用了基于控制器的路由,那么你一个充分利用Laravel的路由缓存。使用路由缓存将极大地减少注册所有应用路由所需的时间
使用 php artisan route:cache
生成路由缓存
运行这个命令后每一次请求都会加载缓存路由文件,如果你新设置了路由,你应该再次使用route:cache
命令
使用 php artisan route:clear
清除缓存
注意基于闭包的路由不能设置缓存
路由限流
Laravel中有一个中间件可限制应用程序对路由的访问,我们只需将中间件绑定到指定的路由即可实现限量功能,如
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::get('/user', function () {
//
});
});
上述代码表示 每一分钟最多访问60次
二,控制器 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
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');