1. 视图操作
1.1 视图位置
1.2 视图文件名称和渲染
- 文件名称建议小写

2.文件后缀为 .blade.php (.php与.blade.php同时存在时优先.blade.php显示
因为laravel里面有一套blade引擎,可以直接使用标签语法{{ $title }},也可以使用原生语法
<?php echo $title; ?>, .php结尾文件只能用原生语法
视图可以进行分目录管理的,例如需要展示home/Index/index视图,则可以写成:
return view(‘home/Index/index’)//支持点写语法return view(‘home.Index.index’)
1.3 变量的分配与展示
控制器:
$name = '小哈';
$nows = ['username'=>'小米手机','many'=>14];
$data = compact('nows','name');
return view('admin.cart.list',$data);
1.4 循环与分支语法标签
1. @foreach遍历 @if条件语句
//$now是多个数组才能进行遍历
@foreach($now as $v)
商品名称{{ $v['username'] }}
商品价格{{ $v['many']}}
@if($v['tone'] == 0)
上架
@else
下架
@endif
<br>
@endforeach
2.@forelse (条件成立则遍历,条件不成立则执行empty 下的语句)
//当$now 为空时自动执行empty里面的内容
@forelse ($now as $v)
商品名称{{ $v['username'] }}
商品价格{{ $v['many']}}
@if($v['tone'] == 0)
上架
@else
下架
@endif
<br>
@empty
没有商品
@endforelse
1.5.模板继承/包含
首先,我们来研究一个「主」页面布局。因为大多数web应用会在不同的页面中使用相同的布局方式,因此可以很方便地定义单个Blade布局视图:
@yield占位
@section(” “)替换的内容 @endsection来替换指定内容
1.包含 (一般用于公共部分的头尾部分)
@include('head',['title'=>$title]) //引入的公共头部文件 可以设置每个页面的标题
我是中间内容
@include('bottom') // 引入的公共底部文件
2.继承 (一般用于公共部分的页面)

模板文件:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>{{$title}}</title>
</head>
<body>
@yield('count') //站位符
</body>
</html>
继承文件:
在模板文件中,可以在模板需要被替换的地方放上@yield(’’ ‘’)作为站位符,
在继承文件中用 @section(” “)替换的内容 @endsection来替换指定内容
1.6 引入静态资源
1 . 在/config目录中配置一个staticfiles.php 名字根据个人喜好即可
2.根据自己的项目路径来配置这些常量的值
新建文件中:
// 前台静态文件存放目录
define('_CSS_', '/static/home/css');
define('_JS_', '/static/home/js');
define('_IMGS_', '/static/home/images');
// 插件存放目
define('PLUGINS', '/static/plugins');
// 后台静态文件存放目录
define('ADMIN_CSS', '/static/admin/css');
define('ADMIN_JS', '/static/admin/js');
define('ADMIN_IMGS', '/static/admin/images');
// 文件上传目录
define('UPLOADS', '/uploads');
注意:如果上述文件内容(设置的常量)不能生效。可尝试 将其内容放置于 return[ ] 中包裹输出后重试
模板中:
<link rel="stylesheet" href="{{(_CSS_.'/index.css')}}"> //相对路径
// 等价于
<link rel="stylesheet" href="{{asset(_CSS_.'/index.css')}}"> //绝对路径
2. CSRF攻击
2.1 什么是CSRF攻击?
2.2 laravel是如何放置CSRF攻击的?
Laravel框架中避免CSRF攻击很简单:Laravel自动为每个用户Session生成了一个CSRF Token,该Token可用于验证登录用户和发起请求者是否是同一人,如果不是则请求失败。【该原理和验证码的原理是一致】
针对POST请求需要处理
Laravel提供了一个全局帮助函数csrf_token来获取该Token值,因此只需在视图提交表单中添加如下HTML代码即可在请求中带上Token :
2.2 从CSRF验证中排除例外路由(不推荐)?
并不是所有请求都需要避免CSRF攻击,比如去第三方API获取数据的请求。
可以通过在VerifyCsrfToken ( app/Http/Middleware/VerifyCsrfToken.php )中间件中将要排除的请求URL添加到$except属性数组中∶
排除写法:
protected $except = [
'index/action'
];
3.模型操作(AR模式)

每个数据表 与数据表进行交互的Model模型映射(实例化模型)
记录中的字段 与模型类的属性映射(给属性贼值,字段名就是属性名)
表中的每个记录 与一个完整的请求实例映射(具体的CURD操作)
记录中的字段
与模型类的属性映射(给属性贼值,字段名就是属性名)
表中的每个记录
与一个完整的请求实例映射(具体的CURD操作)
3.1、定义模型
( 1)定义位置
定义模型的位置,默认是在app目录下面:
(2)命名规则
本身laravel对模型的命名没有严格的要求,一般采用表名(首字母大写).php
比如:Member.php User.php Goods.php
( 3)创建模型
可以使用artisan命令﹔例如创建一个member模型【模型也可分目录管理】
[project] > php artisan make:model Member
(4)定义模型注意事项(重点);
第一︰((必做)定义一个$table属性,值是不要前缀的表名(真实的表名),如果不指定则使用类名的复数形式作为表名。如果模型为Member模型在不指定table属性的情况下,其默认会去找members表。修饰词: protected
第二∶(可选)定义$primaryKey属性,值是主键名称,如果需要使AR模式的find方法,则可能需要指定主键(ModeI:find(n)),在主键字段不是id的时候则需要指定主键。修饰词: protected
第三︰(可选)定义$timestamps属性,值是false,如果不设置false,则默认会操作表中的created_at和updated_at字段,我们表中一般没有这两个字段,所以设置为false,表示不要操作这两个字段。修饰词:public修改自动维护的字段类型为intprotected $dateFormat = “U”;
第四∶(可选)定义$fillable属性,表示使用模型插入数据时,允许插入到数据库的字段信息。格式是一维数组形式,修饰词:protected(当使用模型的create、save方法的时候最好就得写上这个属性),反向指定的属性叫做: $guarded
class Member extends Model
{
use HasFactory;
protected $table = "member";
public $timestamps = false;
}
3.2 控制器中调用
//laravel 框架自带的方法,两种方案都行
//用户自己写的方法 则需要使用第二种方案
use App\Models\Member;
class MemberController extends Controller
{
public function find()
{
//方法一
$rows = Member::get()->toArray();
dd($rows);
//方法二
$rows = new Member();
$rows->get();
}
}
3.3.模型在控制器中的调用
引入Member模型类﹔
use App\Models\Member;
public function ar(){
$rows = Member::get();
}
模型的使用∶模型在控制器中的使用方式有2种
①直接像使用DB门面一样的操作方式:以调用静态方法为主的形式,该形式下模型不需要实例化,例如:Member:get()等价于DB:table(‘member’) -> get() ;
②实例化模型然后再去使用模型类(普通)
public function ar(){
$member = new Member(); //映射关系1:将表映射到模型
$member->username = "小可爱"; //映射关系2:将字段映射到属性,属性名和字段名一致
$member->password = "123";
$res = $member->save(); //映射关系3:将记录映射到实例
dd($res);
}
两种形式的选择标准:
如果使用的方法都是laravel框架自带的,则任意选择;
如果使用的方法有用户自己在模型中定义的,使用第②种形式。
3.4.数据库操作
1. 添加操作
方式一:(AR模式),使用AR模式必须要实例化模型
public function add()
{
$member = new Member();
$member->username = '小花';
$member->year = '1';
$bool = $member->save();
dd($bool);
}
//在数据库表中没有这两个字段是需要在模型中添加下列代码
public $timestamps = false; //操作表中 created_at updated_at
方法二:(隐性效果)
路由文件
//注册界面
Route::get('add','admin\MemberController@add');
//注册处理界面
Route::post('addAction','admin\MemberController@addAction');
控制器:
public function add()
{
return view('add'); //调用视图
}
public function addAction(Request $request)
{
// $bool = $request->all(); //检查是否拿到发送过来的数据
$bool = Member::create($request->all());
dd($bool); //返回值为一个对象
}
//模板文件:
//指定允许写入的字段,如果没有时间相关字段也需要禁用时间自动更新功能
protected $fillable = ['username','password'];
注意:
a.DB类中的insert方法,在模型中也是可以使用的(其他方法也是如此);
b. insert方法必须要求先排除不写入数据表的字段,模型中的fillable属性对insert不生效,如果不事先排除如“_token”等字段,则会报错;
2. 查询操作
public function find()
{
//默认结果集是一个对象 toArray转换为数组
$nows = Member::find(3)->toArray(); //find(3)等价于where('id',3)
$data = compact('nows');
// dd($data);
return view('find',$data);
}
视图中时间转换有问题:
需要在模型中:
use DateTimeInterface;
/**
* 为数组 / JSON序列化准备一个日期
*
* @param \DateTimeInterface $date
* @return string
*/
protected function serializeDate(DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
3. 修改数据
注意:在laravel里面如果需要更新数据(ORM模型方式),需要先调用模型的find方法获取对应的记录,返回一个模型对象,然后为该模型对象设置要更新的数据(对象的属性),最后调用save方法.
public function update()
{
$nows = Member::find(8); //先查询
$nows->username = '6666666666'; //修改需要修改的字段
dd($nows->save());
}
问题:能不能用模型去update呢?
答:可以使用update方法进行更新,也可以使用AR模式的方式进行更新。
上述两种方法都可以实现更新,哪种简单用哪种。
4.删除数据(了解)
注意:在laravel里面如果要删除数据,如果需要使用AR模式删除数据必须先根据主键id查询对应的记录,返回一个模型对象,然后调用模型对象的delete方法即可。
$user = Member::find($id); //先查询需要删除的记录
return $member->delete() ? 'ok' : 'fail'; //再删除 返回值也是布尔值:
总之一句话:在DB::table中能使用的方法,在模型中同样可以使用。
如果不需要自己定义数据处理方法,则可以使用DB或者模型门面。如果需要自己定义一些DB门面中没有的方法,则这些方法就需要定义在模型中,此时就得去使用模型了。
比较常见的使用模型的场景:
a. 可能在数据入表之前需要对数据进行比较的处理步骤,这个时候建议在模型中自定义方法对数据进行处理;
b. 如果需要使用关联模型的话,则必须要定义与使用模型;
5. 软删除(了解)
除了真实删除数据库记录,Eloquent也可以「软删除」模型。软删除的模型并不是真的从数据库中删除了。事实上,是在模型上设置了 deleted_at属性并将其值写入数据库。如果deleted_at值非空,代表这个模型已被软删除。如果要开启模型软删除功能,你需要在模型上使用Illuminate(Database( Eloquent(SoftDeletes trait :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Flight extends Model
{
use SoftDeletes;
}
4、自动验证【重点】
自动验证:前端会有一些对表单的验证操作(通过JavaScript),但是JavaScript有些情况下是不好用的(例如禁用JavaScript)。因此后端也需要有一套类似的机制,能够在后端实现对用户提交的数据进行验证,这个就是后端的自动验证。
建议去查看手册https://learnku.com/docs/laravel/8.x/validation/9374
(1)基本语法
使用控制器中的validate方法来完成,$request->validate($request,[验证规则]);
如果验证失败,laravel会自动将用户重定向回上一个位置,并将验证错误信息一次性存放到session中。
请求验证:
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
//验证规则可以使用数组而不是单个 | 分隔的字符串:
$validatedData = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
可以使用 validateWithBag 方法来验证请求,并将所有错误信息储存在一个 命名错误信息包 中:
$validatedData = $request->validateWithBag('post', [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
在首次验证失败时停止运行
$request->validate([
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
(2)基本验证规则
required: 不能为空
max:255最长255个字符,
min:1最少1个字符
email:验证邮箱是否合法
confirmed:验证两个字段是否相同,如果验证的字段是password,则必须输入一个与之匹配的password_confirmation字段
integer:验证字段必须是整型
ip:验证字段必须是IP地址
numeric 验证字段必须是数值
max:value 验证字段必须小于等于最大值,和字符串,数值,文件字段的size规则一起使用。
min:value 验证字段的最小值,对字符串、数值、文件字段而言,和size规则使用方式一致。
size:value 验证字段必须有和给定值value想匹配的尺寸,对字符串而言,value是相应的字符数目,对数值而言,value是给定整型值;对文件而言,value是相应的文件字节数。
string 验证字段必须是字符串
unique:表名,字段,需要排除的ID
(3)输出错误信息
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
也可以单独提示
<span>{{ $errors->first('username') }}</span>

但是这样做的话,在初次打开这个页面的时候,报错的标签就已经存在了,所以需要优化一下,加上判断来判断初次打开页面有没有报错
@if($errors->has('username'))
<span>{{ $errors->first('username') }}</span>
@endif
但是官方给了更好的解决方案 error模板命令
@error("username")
<span>{{ $errors->first('username') }}</span>
@enderror
每次提交数据后 已经填好的数据也会被清空
<input type="text" name="username" placeholder="用户名" value="{{old('username')}}">
(4)把输出效果转换成中文
方法1:自定义翻译
可以在定义自动验证的时候,给validate方法传递第二个参数,第二个参数即错误提示:
$request->validate([
"username"=>["required","max:20","min:3"]
],
[
"username.required"=>'用户名必填'
]
]
);
该方式比较繁琐,每个规则都要自己定义错误信息。
方法2:借助于第三方的语言包。
由于中文和英文都是属于语言范畴,如果要切换提示文字,则需要有中文语言包的支持。目前框架只有en语言包,则需要其他语言包需要去下载。
网址:https://packagist.org composer主要的代码托管网站
中文网址:https://packagist.p2hp.com/
在官网搜索laravel-lang
注意:后期下载软件依赖的时候一般会综合一下下载量和收藏量进行下载选择。
①需要寻找下载命令
安装命令:
composer require laravel-lang/lang
②使用composer进行安装
在项目根目录下运行上述的命令


翻译:
语言包文件在vendor/caoue/laravel-lang中;将你需要的语言目录复制到resources/lang目录下即可。
③使用方法
将需要的语言包复制到语言包目录:
根据提示:
翻译:在文件(config/app.php)中修改locale的值,改成你需要使用的语言简称。
简称其实就是语言包的文件夹名称。
测试效果:
注意:并不是所有的字段都有对应的翻译(或者有的翻译可能不是很准确),如果想自己定义翻译,则需要去修改语言包文件代码。
文件位置:
修改后续的值,或者新增需要的元素:
效果:
(5)删除下载的语言包文件
如果依赖的语言包文件已经没用的话,可以直接执行命令来删除刚才的语言包依赖
composer remove laravel-lang/lang

