1.laravel安装(laravel8 composer命令)
composer create-project --prefer-dist laravel/laravel laravel
2.MVC位置(精简常用)
(1)控制器所在位置:App/Http/Controllers中
(2)模型类所在位置:App/Models中
(3)视图层所在位置:resources/view中
3.路由(laravel必须配路由访问,否则无法访问)
路由一般都写在route/web.php中
(1)普通路由:Route::get(‘路由名’,[\app\Http\Controllers\IndexController::class,‘方法名’]);
参数:1参为路由名,2参为数组[目标类,方法名]
注:普通路由包含get,post,put,patch,delete,options,参数都一样
(2)重定向路由:Route::redirect(‘路由名’,‘要重定向到的路由名’);
参数:redirect('1参为路由名','2参为重定向到的目标路由名','3参为状态码(301,302)')
注:redirect返回的状态码是302(临时重定向),可以在第三个参数中填写302(永久重定向)
(3)视图路由:Route::view(‘视图路径表达式’);
参数:view('1参为视图路径表达式','2参为传入的变量(数组格式,键名为变量名,键值为值)')
作用:直接返回该视图上的内容。
(4)路由参数:Route::get(‘index/{id}’);若是可选参数则是Route::get(‘index/{id?}’);
(5)路由参数约束:
单一约束:Route::get('index/{id}')->where('id','正则表达式'); where('参数名','正则')
全局约束:在App/Http/Providers/RouteServiceProvice.php中的boot方法中定义
public function boot () {
Route::pattern('id','正则'); //意味着所有路由中凡参数名是id的参数都会遵守这个约束
}
(6)路由
命名:Route::get('index',[indexController::class,'index'])->name('i');
参数:name('路由名称');
作用:能快速为指定的路由进行重定向或生成url地址
注:路由命名不能重复
(7)生成指定路由的URL:route(‘路由名’)
$url = route('i'); //生成链接
return redirect()->route('i'); //重定向
参数:route('1参为路由名','2参为参数');
(8)路由组:
Route::group(function () {
Route::get('index',[indexController::class,'index']);
Route::get('test',[indexController::class,'test']);
});
参数:group(/*匿名函数*/function () {//路由});
作用:可以批量设置路由属性,如设置中间件
(9)路由中间件:middleware(‘中间件别名’)
参数:middleware('中间件别名')
注:在路由组中设置中间件,则应在group()链式操作之前调用middleware(),例如Route::middleware(‘中间件别名’)->group(),若是单条路由加中间件则写在最后Route::get(‘index’,[indexController::class,‘index’])->middleware(‘中间件别名’);
4.中间件(在请求之后到控制器之前的中间执行,laravel自带一些中间件,如身份验证,CSRF保护等,都在App/Http/Middleware中)
(1)定义中间件(命令):
php artisan make:middleware CheckId
//该命令会在App/Http/Middleware下生成一个新的名为CheckId的类文件
(2)作用(例):若id大于10则跳入indexController中的test方法(路由为test),否则继续向下执行
中间件代码
:
<?php
namespace App\Http\Middleware;
use Closure;
class CheckId
{
public function handle($request, Closure $next){
if ($request->id > 10) {
return redirect('test');
}
return $next($request);
}
}
注:若验证id则路由参数名必须是id(Route::get('index/{id}',[indexController::class,'index']);)
(3)注册全局中间件:
每个请求都想通过中间件的话,则在App/Http/Kernel.php中的$middleware中列出这个中间件
(4)注册路由中间件:
首先在App/Http/Kernel.php中的$routeMiddleware中添加一条数组数据[‘键名为中间件别名’ =>
\App\Http\Middleware\CheckId::class],然后路由调用middleware()方法,参数传入中间件别名即可
5.CSRF保护(laravel默认全站防止跨域请求攻击)
(1)本站数据提交:当要进行表单提交时,需要在表单中写入@csrf,否则会被拦截(因为laravel会生成一个token,VerifyCsrfToken中间件会进行验证)
(2)白名单:如果想某个路由不被保护(可以跨站请求),可在App/Http/Middleware/VerifyCsrfToken.php中的 e x c e p t 属 性 中 填 入 值 ( 不 被 保 护 的 路 由 的 U R L ) , 也 可 以 将 K e r n e l . p h p 中 的 except属性中填入值(不被保护的路由的URL),也可以将Kernel.php中的 except属性中填入值(不被保护的路由的URL),也可以将Kernel.php中的middlewareGroup中的VerifyCsrfToken::class注释掉以全站关闭CSRF保护
(3)X-CSRF-TOKEN:若是POST提交方式则还需要设置头信息