Laravel是一套简洁、优雅的PHP WEB开发框架(PHP Web Framework),具有富于表达性且简洁的语法,Laravel是易于理解且强大的,它提供了强大的工具用以开发大型,健壮的应用,例如具有自动验证、路由、Session、缓存、数据库迁移工具、单元测试等常用的工具和功能
官网:https://laravel.com/
中文官网:http://www.golaravel.com/
中文社区:https://laravel-china.org/
Laravel框架的广告语:
为 WEB 艺术家创造的 PHP 框架
目前大部分的框架公共的特点(了解):
(1)单入口,所有的请求必须从单入口开始,主要是便于管理(统一的参数过滤)
(2)MVC的思想(分层思想,主要是为了协同开发,实现后期的维护方便)
(3)ORM操作数据库(Object Relations Model,关联模型):AR模式
注意:Laravel框架有一个特点,所有的URL访问都必须事先定好路由规则。
Laravel框架的运行对环境是有严格要求的。
php.ini配置文件需要开启的扩展:
extension=php_openssl.dll
extension=php_pdo_mysql.dll
extension=php_mbstring.dll
extension=php_fileinfo.dll(验证码代码依赖需要该扩展)
extension=php_curl.dll(主要用于请求的发送)
httpd.conf配置文件需要开启的模块:
LoadModule deflate_module modules/mod_deflate.so
LoadModule rewrite_module modules/mod_rewrite.so
如果php的版本不满足基本要求需要升级,则有2个方法可供使用:
a. 使用带有符合要求的php版本的集成环境替换当前环境(phpstudy),如当前数据库的数据仍需要,则需要备份下数据库,在装好新的环境之后导入备份的数据库;
b. apache、mysql不做任何替换操作,单独的下载符合要求的版本php,替换原先低版本的php;
c. 建议php使用php7+版本
①在php安装好之后需要将php.exe的位置的目录添加到环境变量中去(如果之前有加过别的版本的php环境变量则需要删除掉);
②得确保在添加环境变量之后,通过命令“php -v”运行得到的结果中php版本号与实际运行的版本号一致;
将PHP加入环境变量(目录):
命令行PHP版本检测运行结果(如果使用集成环境,则要求命令行显示php版本要与集成环境的版本一致):
composer英文单词意思:音乐指挥者
composer是PHP中用来管理依赖(dependency)关系的工具,你可以在自己的项目中声明所依赖的外部工具库(libraries),composer会帮您安装这些依赖的库文件。
一句话,composer是一个工具,是为php项目准备的软件管家。
工作原理:
如上图,composer可以去packagist应用市场 里边下载软件,但是该市场只给返回软件的地址,对应的软件都是在github里边存储的,最终下载的软件是从github返回的。
https://packagist.org
官方网站:https://getcomposer.org
下载地址:https://getcomposer.org/download/
注意前提条件:
开启PHP中openssl扩展。
安装composer需要明确php.exe的文件路径。
安装 composer需要联网
①运行composer安装程序
②直接下一步
③选择需要使用的php所在路径(如果显示不正确,可以点击浏览自行选择)
④代理设置(默认不设置代理)
⑤直接下一步
⑥继续下一步
⑦完成安装
安装完成后,进入到命令提示符(cmd),运行“composer”,如果出现如下提示,则安装完成。
第一步:切换镜像(软件下载地址)为国内镜像【建议】
镜像官网:
https://developer.aliyun.com/composer
通过composer可以去packagist.org市场 和 github代码库 下载功能代码
但是packagist和github对应的服务器都部署在国外。
这时“镜像”应运而生,其是把存储在packagist和github等外国服务器上的全部内容定期(更新比较及时,几分钟的延迟)同步到国内服务器里边,使得广大开发者可以不用绕远到外国,相反在自己国家就可以把软件更新到自己的项目中,方便了composer的使用。
给composer配置镜像:
修改 composer 的全局配置文件(推荐方式)
#composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
第二步:composer部署laravel项目【重点】。
#composer create-project laravel/laravel --prefer-dist ./
命令含义:
composer:表示需要执行composer
create-project:表示需要通过composer创建一个项目
laravel/laravel:创建一个Laravel项目
–prefer-dist:表示强制使用压缩包方式下载(省时间)
./或者其他名称:表示项目需要创建的路径【在创建项目的时候一定要确保路径目录为空】
例如:需要创建一个Laravel项目
上述命令默认安装的是当前镜像网站中最新的版本:5.5.28。
比如创建一个名为shop的laravel项目
#composer create-project laravel/laravel --prefer-dist shop
运行composer的时候需要注意,在什么地方运行(命令行的当前工作路径)composer则就会在什么地方创建项目。
注意,如果要下载其他版本,比如5.4版本中最新版本号(用表示),可以使用这个命令
#composer create-project laravel/laravel=5.4. --prefer-dist ./
#composer create-project laravel/laravel=5.5.28 --prefer-dist ./ 指定版本
(1)app目录:项目的核心目录,主要用于存放核心代码,也包括控制器、模型、中间件。
(2)bootstrap目录,laravel启动目录
(3)config目录,项目的配置目录,主要存放配置文件,比如数据库的配置
app.php:全局配置文件,在后期开发的时候需要频繁的使用这个配置文件;
auth.php:用户登录时候需要用到的用户认证模块的配置文件;
database.php:数据库的配置文件;
filesystems.php:文件系统(如文件存储等)的配置文件;
(4)database目录,数据迁移目录
factories:存放一些工厂模式需要用的一些文件;
migrations:迁移,存放的是迁移文件(创建/删除/修改数据表操作的类文件);
seeds:播种、种子,存放的是种子(填充器)文件(模拟向数据表中写入数据的操作类
(5)public目录,项目的入口文件和系统的静态资源目录(css,img,js,uploads)
后期使用的外部静态文件(js、css、图片等)都需要放到Public目录下
并且后期的网站的根目录也是这个目录(apache的documentroot目录为该目录路径)
(6)resources目录,存放视图文件,还有就是语言包文件的目录
language:存储语言包的目录;
views:视图文件存储目录;
(7)routes目录,是定义路由的目录,web.php是定义路由的文件
(8)storage目录,主要是存放缓存文件和日志文件,注意,如果在linux环境下,该目录需要有可写权限。(后期用户上传文件如果存在本地则也在storage下)
app:保存用户上传文件的路径;
framework:框架自带的文件存储目录;
logs:框架的日志文件存储位置;
(9)vendor目录,主要是存放第三方的类库文件,laravel思想主要是共同的开发,不要重复的造轮子(例如,里面可能存在验证码类,上传类,邮件类),该目录还存放laravel框架的源码。注意如果要使用composer软件管理的,composer下载的类库都是存放在该目录下面的。
(10).env文件:主要是设置一些系统相关的环境配置文件信息。config目录里面的文件配置内容一般都是读取该文件里面的配置信息(config里面的配置项的值基本都是来自.env文件)。
(11)artisan脚手架文件,主要用于生成的代码的(自动生成),比如生成控制器,模型文件等。
执行命令:#php artisan 需要执行的指令
要求1:php必须添加环境变量,并且保证版本;
要求2:artisan必须存在命令行当前的工作路径下;
(12)composer.json依赖包配置文件
声明当前需要的软件依赖,但是不能删除,composer需要使用。
需要重点掌握的目录(频繁使用)
目录 | 作用 |
---|---|
app | 保存模型文件(默认) |
app/Http/Controllers | app/Http/Controllers |
resources/views | 保存视图文件 |
config | 配置文件目录 |
routes | 存放路由文件 |
database/migrations | 存放数据库迁移文件(操作数据表结构) |
database/seeds | 存放数据库种子文件(模拟测试数据) |
方式一:Laravel框架提供了更简单的方式启动项目(相比配置apache)
执行命令:#php artisan serve
不推荐使用:
①能够跑php代码,但是不启动数据库。
②该方式启动后,如果修改了项目的配置.env的话,则需要重新启动才会生效。
③如果使用命令行方式进行启动,则如果想继续访问页面,需要命令行不能关闭。
方式二:使用 wamp或lamp环境(常见)
虚拟主机配置:(虚拟主机 ≠ 虚拟机)
什么是路由:将用户的请求按照事先规划的方案提交给指定的控制器或者功能函数来进行处理.【通俗的讲,路由就是访问地址形式】
在博客中,当我们在URL地址中,传递p(平台)、c(控制器)、a(方法)三个参数时,系统会自动跳转到指定模型中指定控制器的指定方法,这些处理过程都是由框架自动完成的。但是,在Laravel框架中,其并没有指定固定参数,其路由必须要手工进行配置。
路由文件在routes/web.php。
后续我们自己定义的路由都需要在该文件中去声明。
(1)默认根路由
问题:为什么当我们在浏览器中访问虚拟域名http://域名时,如何显示Laravel5?
答:原因是在路由文件web.php中,其已经定义好了一个路由,这个路由称之为“根路由”,一般用于访问网站的首页。
(2)路由定义格式:
Route::请求方式(‘请求的URL’, 匿名函数或控制器响应的方法)
比如请求域名下根目录
Route::get(’/’,function(){return ‘hello world’;});
函数的返回值,就是请求的响应。
页面上的显示:
又比如请求:http://域名/home地址则路由写成:
Route::get(’/home’,function(){return ‘您当前访问的是/home地址’;});
显示:
注意:路由地址中的第一个“/”可以不写(包括“根路由”)。
如果还有更多的路由需要去定义,则仿照上述的形式语法继续编写即可。但是只要需要访问,则必须需要定义路由。
如果路由错误或者没有定义则会看到以下错误页面(以Laravel5.4.30为准)
如果是5.5以后的版本,则提示如下:
(3)请求方式有哪些?
如果要解决“”这样的问题,则需要下面的两个方法解决:
常见的四个方法:
get方法:表示匹配请求类型为get的请求;
post方法:表示匹配请求类型为post的请求;
macth方法:表示匹配用户指定的几个请求类型(通过第一个参数去指定)的请求;
语法:Route::match([‘get’,’post’,’…’], u r l , url, url,calback);
any方法:表示匹配路由所支持的全部请求类型;
如果路由方法与实际的请求类型不一致,则会报错
在5.5及以后的版本中报错如下:
使用路由需要public目录下.htaccess文件设置apache重写路由
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
路由参数其实就是给路由传递参数。
参数分为必选参数和可选参数。
必选参数:一旦在路由中定义了,则必须传递,不传递就会报错。
例如:
Route::get(‘home1/{id}’,function($id){
echo ‘输入的id是’ . $id;
});
路由参数的传递通过路由地址中的“{参数名}”的形式来进行传递,该形式是必选参数的形式,可以选的则使用“{参数名?}”。
如果设定了可选路由参数,但是又没有给默认值同时也没传递,则报错:
扩展:
路由参数除了上述的2种传递方式之后,还支持传统的路由参数传递:
url?id=xxx&aaa=xxxx
这种方式传递参数不受路由的限制的,不需要在路由文件中事先定义好路由参数,例如:
路由别名相当于在路由定义的时候,为路由起了一个别名,在以后的程序中可以通过这个别名来获取路由的信息。/absafvdsadssdbfdsfa/qwdasd1312213fberfdvf/ascdfadvs => url1
后期在视图中会频繁使用到这样的代码“xxxx”
场景:在后期需要频繁的定义跳转地址,但是如果这些地址写死了的话,万一发生变化,得全部修改,这个操作比较麻烦,因此可以使用路由别名的机制(定义路由的时候给路由起名字,在后期需要使用路由的时候直接调用名字)去简化以后的操作。
给路由起名字的语法:
Route::请求类型(路由地址,响应方法) -> name(别名);
例如:给hello的路由起名字“h1”
调用该路由则可以写成:route(‘名字’);例如像刚才的h1,则需要写成route(‘h1’)
扩展补充:查看系统已经有的路由命令:#php artisan route:list
有后台有如下路由
/admin/login
/admin/logout
/admin/index
/admin/user/add
/admin/user/del
…
他们的共同点(这个共同点不局限于只是前缀)是,都有/admin/前缀,为了管理方便,可以把他们放到一个路由分组中,这个分组称之为路由群组。
使用prefix属性指定路由前缀,也就是其路由中都具备的相同部分。
语法:Route::group(公共属性数组,回调函数); 回调函数中放的剔除公共属性之后的路由
比如,想要为所有路由URLs前面添加前缀admin
Route::group(['prefix' => 'admin], function () {
Route::get(login, function () {
// 匹配 "/admin/login" URL
});
Route::get(logout, function () {
// 匹配 "/admin/logout" URL
});
Route::get(user/add, function () {
// 匹配 "/admin/user/add" URL
});
});
记住:以大局为重。
案例:编写路由/home/test/test1和/home/test/test2,要求使用路由群组
公共点:/home/test
Route::group([‘prefix’ => ‘home/test’],function(){
Route::get(‘test1’,function(){
});
Route::get(‘test2’,1function(){
});
});
注意:使用路由群组不会改变其原有在地址栏中输入的地址。变的只是路由定义的写法。
在后期还会接触到middleware(中间件)属性。
控制器主要的作用主要负责接收用户输入请求,调度模型处理数据最后利用视图展示数据。
其中Auth存放的是框架自带的Auth认证相关的示例控制器文件,controller.php文件是框架的基类控制器。
命名可以参考Auth文件夹中给定的示例文件:
文件的命名方式:大驼峰+Controller.php
友情提示:在写的时候不要带“+”。
注意:其控制器基础结构代码,不需要自己去手动编写,可以通过artisan命令行来自动生成。
因此需要记住对应的命令:
#php artisan make:controller 控制器名(大驼峰)Controller
不要写“.php”。
例如:使用artisan命令创建TestController.php文件。先确定命令:
#php artisan make:controller TestController
其中已经写好的结构代码:
后续如果需要更多的控制器只需要重复的执行上述的artisan命令即可。
注意:控制器可以分目录管理。
即,如何使用路由规则调用控制器下的方法,而不再走回调函数。
路由设置格式基本相同,只是将匿名函数换成‘控制器类名@方法名’
定义格式如下:
Route::请求方法(‘路由表达式’,’控制器@方法’);
例如:在Test控制器中创建test1方法,其中输出phpinfo信息
编写路由规则:
设定路由: /test1
效果如下:
接收用户输入的类:Illuminate\Support\Facades\Input
Facades:"门面"的思想。门面是介于一个类的实例化与没有实例化中间的一个状态。其实是类的一个接口实现。在这个状态下可以不实例化类但是可以调用类中的方法。说白了就是静态方法的调用。
Input:get('参数的名字','如果参数没有被传递使用该默认值'); //类似php里三元运算符
Input::all();获取所有的用户输入
Input::get('参数的名字');获取单个的用户的输入
Input::only(['id','age']);获取指定几个用户的输入
Input::except(['id','age']);获取指定几个用户的输入以外的所有的参数
Input::has('name');判断某个输入的参数是否存在
上述方法既可以获取get中的信息,也可以获取post中的信息
在laravel中如果需要使用facdes的话,但是又不想写那么长的引入操作:
Use Illuminate\Support\Facades\Input
则可以在config/app.php中定义长串的别名(在aliases数组中定义别名)
案例:在/test2路由下测试上述的方法
定义路由:
/test2
编写test2方法测试上述的获取信息的操作:
给test2路由传递一系列的参数(get传值)
在Laravel中友好输出函数:dd(需要打印的内容);
dd=dump + die
dd函数之后的内容将不会继续执行;
在Laravel中除了Input类可以获取用户的输入,Request也可以获取用户输入。
按照MVC的架构,对应的操作应该放在Model中完成,但如果不使用Model,我们也可以用laravel框架提供的DB类操作数据库。而且,对于某些极其复杂的sql,用Model已经很难完成,需要开发者自己手写sql语句,使用DB类去执行原生sql。laravel 中DB类的基本用法 DB::table(‘tableName’)获取操作tableName表的实例(对象)。
建立数据库:
建立数据库的方式:
①sql语句
②图形界面 phpMyAdmin Navicat
create table member(
id int primary key auto_increment,
name varchar(32) not null,
age tinyint unsigned not null,
email varchar(32) not null
)engine myisam charset utf8mb4;
(2)数据库在laravel框架中的配置
在.env文件里面,
也可以在config目录下面的database.php文件里面配置。使用env函数,表示先从env环境里面读取,如果获取成功则使用,如果获取失败,则使用env函数的第二个参数。
注意:如果是php artisan serve 方式启动的,修改了配置文件,则需要重新启动,才能读取修改后的配置文件:如果是wamp/lamp等环境则不需要重启。
(3)在Test控制器中引入DB门面;
(4)定义增删改查需要的路由;
增加: /add get
删除: /del get
修改: /mod get
查询: /select get
对数据库中的某个表增加数据主要有两个函数可以实现,分别是insert()和insertGetId()
insert(数组)可以同时添加一条或多条,返回值是布尔类型
insertGetId(一维数组),只能添加一条数据,返回自增的id
语法:DB::table(‘表名’) -> insert(); 连贯操作/链式操作
数据修改可以使用update()、inscrement()和decrement()方法来实现。
①Update方法表示可以修改整个记录中的全部字段;
②Increment和decrement表示修改数字字段的数值(递增或者递减),典型应用:记录登录次数、积分的增加。
案例:把id=1的名称,改名为 ‘张三丰’
-> where() -> update([])
注意:where方法之后可以继续调用where之类的方法。
-> where() -> where() ->where() … 这个语法是并且 (and) 关系语法。
-> where() -> orWhere() -> orWhere()… 这个语法是或者 (or) 关系语法。
Orwhere方法的参数与 where一致。
Where参数顺序:
-> where(字段名,运算符,字段值)。例如id=1,则可以写成:where(‘id’,’=’,1),简写成Where(‘id’,1); 【只有=可以简写】
返回值,表示受到影响的行数
案例:把id=1的用户年龄字段值加10;【了解】
DB::table(’ member’)->increment(‘age’); 每次+1
DB::table(’ member’)->increment(‘age’, 5); 每次+5
DB::table(’ member’)->decrement(‘age’); 每次-1
DB::table(’ member’)->decrement(‘age’, 5); 每次-5
案例1:获取member表中所有的数据
DB::table(‘member’)->get(); //相当于select * from member;
返回值是一个集合对象,
返回值:
完成遍历取出的数据:
注意:Get查询的结果每一行的记录是对象的形式,不是数组。
由于每一条记录都是一个对象,因此在循环或者访问字段的值的时候需要使用对象调用属性的方式进行访问,不能再用数组形式进行访问。否则就会报以下错误:
案例2:获取id<3的数据
->where()->get();
DB::table(‘member’)->where(‘id’,‘1’)->first();//返回值是一个对象
等价于limit 1
DB::table(‘member’)->where(‘id’,‘1’)->value(‘name’);
$users = DB::table(‘member’)->select(‘name’, ‘email’)->get();
$users = DB::table(‘member’)->select(‘name as user_name’)->get();
$db -> select(DB::raw(‘name,age’)) -> get(); // 不解析字段,原样使用
注意:有多少个字段就有多少个参数(select方法),除了DB::raw之外。
DB::table(‘member’)->orderBy(‘age’,‘desc’)->get(); desc降序 asc 升序 默认升序
DB::table(‘member’)->limit(3)->offset(2)->get();
Limit:表示限制输出的条数(分页中每页显示记录数)
Offset:从什么地方开始
组合起来等价于limit 2,3 limit 3(offset),2(length)
归纳:具体的查询等操作方法一般都是放在连贯操作的最后。辅助方法可以放在中间,并且其先后顺序是无所谓的。
在删除中,有两种方式:物理删除(本质就是删除)、逻辑删除(本质是修改)
数据删除可以通过delete函数和truncate函数实现,
delete表示删除记录;
truncate表示清空整个数据表;
DB::table(‘table_name’)->where(‘id’,‘1’)->delete();
例如:删除id小于3的记录
返回值表示删除的行数:
【补充:truncate】
语法:DB::table(‘member’) -> truncate();
(1)执行原生查询语句
DB::select(“select语句”);
(2)执行原生插入语句
DB::insert(“insert语句”);
(3)执行原生修改语句
DB::update(“update语句”);
(4)执行原生删除语句
DB::delete(“delete语句”);
(5)执行一个通用语句(没有返回值的语句,例如:create table等)
DB::statement(“语句”);
注意:
a. 视图可以分目录管理
b. 视图的后缀在laravel中一般一般都是“.blade.php”
c. 视图的创建无法通过artisan来实现
(1)文件名习惯小写(建议小写)
(2)文件名的后缀是 .blade.php(因为laravel里面有一套模板引擎就是使用blade,可以直接使用标签语法{{ $title }}, 也可以使用原生的php语法显示数据。)
(3)需要注意的是也可以使用.php结尾,但是这样的话就不能使用laravel提供的标签{{ $title }}语法显示数据,只能使用原生语法 显示数据
两个视图文件同时存在,则.blade.php后缀的优先显示。
案例:编写一路由地址,调用Test控制器的test3方法,展示视图test3文件(创建2个,一个以.blade.php结尾,另外一个.php结尾)【验证优先级】
创建对应路由:
/test3
编写控制器方法:
展示视图的方法:
return view(‘视图文件的名称’);
视图可以进行分目录管理的,例如需要展示home/test/test2视图,则可以写成:
return view(‘home/test/test2’) 当然也支持点写法:view(‘home.test.test2’)
展示方法:
没有视图文件报错:
新建2个视图(一个以“.blade.php”结尾,一个是“.php”结尾)最终展示的是.blade.php文件
语法:
①view(模板文件名称,数组) 数组就是需要分配的变量集合,数组是一个键值数组,其键与变量名尽量一致
②view(模板文件名称)->with(数组)
③view(模板文件名称)->with(名称,值)->with(名称,值)…
使用view()方式渲染一个视图后,在.blade.php的视图文件中,模板中输出变量使用“{{ $变量名 }} ”(变量名就是分配过来数组的键)
案例:需要将控制器方法中的时间(年月日时分秒)数据传递到视图中去,并且输出
创建test3方法
创建模版页面:
输出效果:
提示:变量在视图中展示的时候,在原先PHP文件中怎么写,在视图中依旧按照原先的方式进行编写,只需要写好之后在最外层套2个“{ }”即可。例如对于时间戳的格式化:
Compact函数,是php内置函数跟laravel框架没有关系。作用主要是用于打包数组的。
语法:compact(‘变量名1’,’变量名2’,…);
因此刚才3中的案例还可以写成:
只是影响的是后台的数组打包,跟前台使用没有什么关系。
//在视图里面遍历数据【重点】
案例:使用循环标签的语法,在视图中输出数据
新建路由:
/test4
创建需要的test4方法
创建视图,视图中的循环输出:
显示效果:
需要注意的是,如果本身data是结果集的话,则循环到的value一般会是一个对象(此时不能使用“[]”访问数组的形式进行属性访问,而应该使用“->”形式)。
//在视图里面可以执行if判断【重点】
案例:要求在php代码中(控制器的方法)动态输出今天的星期数字(1-7),将数字传递给视图,显示出今天是星期几,如假设传递的数字是7,则页面中要输出“星期天”【将数字转化成汉字】
a. 先在控制器方法中输出当前的星期数字
b. 需要在视图中获取数字,并且通过if判断输出今天的星期汉字
效果:
继承不仅仅在php类中存在,在视图中同样存在。一般是用于做有公共部分的页面。
以上图为例,可以将头和尾单独的放到一个页面中去(父页面),可变的区域称之为叫子页面,如果子页面需要用到父页面的东西,则需要使用继承。
问题:PHP父类中的方法能不能在子类中重写?
案例:编写父级页面(父类),再编写一个子页面(子类)(相当于php中的两个类)
编写父级页面:
语法:@yield(‘名字’) 在父级页面中的占位,也就是空出可变区域
在父页面中,头尾是固定的,中间是可变的区域,由于内容不知道是什么,所以通过yield占位,等待子页面去补充(等待子页面重写yield区域)。
再去创建子页面和其路由
/test5
创建test5方法,展示视图
创建视图test5(只是展示可变区域)
继承语法:
子模版中按以下语法书写:
@extends(‘需要继承的模版文件名’) 其名称要是完整的路径,类似view视图路径
通过section标签绑定区块/部件到父级页面,区块名称就是父级页面yield标签的参数名。
@section(区块名称)
代码
@endsction
效果:
模版包含:
语法:@include(模版文件名) 文件名不含后缀,语法类似view方法参数
CSRF是跨站请求伪造(Cross-site request forgery)的英文缩写:
Laravel框架中避免CSRF攻击很简单:Laravel自动为每个用户Session生成了一个CSRF Token,该Token可用于验证登录用户和发起请求者是否是同一人,如果不是则请求失败。【该原理和验证码的原理是一致】
Laravel提供了一个全局帮助函数csrf_token来获取该Token值,因此只需在视图提交表单中添加如下HTML代码即可在请求中带上Token:
<input type="hidden" name="_token" value="">
案例:通过案例实现csrf的机制验证
①创建两个路由,一个用于展示表单(get),另外处理请求(post)
/test6 展示表单 get
/test7 提交处理 post
②创建需要的方法
③创建需要的简易表单
④提交效果(报错页面)
说明Laravel框架是默认开启了csrf认证的(必须)。
⑤解决报错问题(如何通过csrf验证)
就是可以使用之前说的,可以在表单中添加一个隐藏域:
在html页面中显示如下:
{{csrf_token()}}:表示直接输出token值;
{{csrf_field()}}:表示的是直接输出整个隐藏域的input框;
第16行和第17行效果是等价的:
场景选择:一般在视图里用csrf_field即可,大部分的时候在JavaScript代码段中(特别是在做ajax异步提交的时候)可以考虑用csrf_token。
添加了csrf的token之后,表单就可以正常的提交。
CSRF验证机制与图形验证码的原理是一致的,都是将用户提交的值与与session中的值进行比对,如果一致则通过,否则不通过。
针对csrf_token与csrf_field的选择问题:
如果只需要使用值(例如,在ajax的post提交的时候),则使用csrf_token,如果需要的是隐藏域(在表单里),则使用csrf_field。
并不是所有请求都需要避免CSRF攻击,比如去第三方API获取数据的请求。
可以通过在VerifyCsrfToken(app/Http/Middleware/VerifyCsrfToken.php)中间件中将要排除的请求URL添加到$except属性数组中:
排除写法:
说明:如果这个操作不是刚需,则此功能不建议使用。