一、Laravel安装
通过composer 安装:(如何安装composer可以去官网下载:下载地址)
composer命令:
composer create-project laravel/laravel --prefer-dist ./
如果要给项目命名则可以通过:
composer create-project laravel/laravel --prefer-dist 项目名
二、目录结构分析
-
app目录:项目的核心目录,主要用于存放核心代码,也包括控制器、模型。
比如控制器存放如下位置:app/Http/Controllers模型文件存放位置,模型文件直接写在app目录下即可,但是也可以在该目录下建立其他目录用于专门存放模型文件,例如建立Admin目录专门存放后台需要的模型文件,建立Home目录存放前台模型文件目录
-
bootstrap目录,laravel启动目录
-
config目录,项目的配置目录,主要存放配置文件,比如数据库的配置:
App.php:项目主要配置文件;
Auth.php:用于定义用户认证(登录)的配置文件;
Database.php:针对数据库的配置;
Filesystems.php:上传文件、文件存储需要使用到的配置文件; -
database目录,数据迁移目录:
存储跟数据表相关的操作类文件(迁移文件【创建数据表的类文件】、种子文件【存放一些数据表的数据填充文件】)。 -
public目录,项目的入口文件和系统的静态资源目录(css,img,js,uploads)
后期使用的外部静态文件(js、css、图片等)都需要放到Public目录下。
当然重点的是项目单一入口文件也在这个目录下。因此后续配置虚拟主机的时候需要将站点位置指定到public下。 -
resources目录,存放视图文件,还有就是语言包文件的目录
Lang目录:语言包目录(如果项目需要本地化则需要配置语言包)
Views目录:视图文件存储目录(视图文件也可以分目录管理) -
routes目录,是定义路由的目录,web.php是定义路由的文件
-
storage目录,主要是存放缓存文件和日志文件,注意,如果在linux环境下,该目录需要有可写权限。(后期用户上传文件如果存在本地则也在storage下)
-
vendor目录,主要是存放第三方的类库文件,laravel思想主要是共同的开发,不要重复的造轮子(例如,里面可能存在验证码类,上传类,邮件类),该目录还存放laravel框架的源码。注意如果要使用composer软件管理的,composer下载的类库都是存放在该目录下面的。
-
.env文件:主要是设置一些系统相关的环境配置文件信息。config目录里面的文件配置内容一般都是读取该文件里面的配置信息(config里面的配置项的值基本都是来自.env文件)。
-
artisan脚手架文件,主要用于生成的代码的(自动生成),比如生成控制器,模型文件等。
执行命令:#php artisan 需要执行的指令
要求1:php必须添加环境变量,并且保证版本;
要求2:artisan必须存在命令行当前的工作路径下; -
composer.json依赖包配置文件
声明当前需要的软件依赖,但是不能删除,composer需要使用。
三、路由配置文件
通俗的讲,路由就是访问地址形式
在Laravel框架中,其并没有指定固定参数,其路由必须要手工进行配置。
- 路由定义格式:
Route::请求方式('请求的URL', 匿名函数或控制响应的方法)
- 路由请求方式:
Get表示支持get请求方式的路由;
Post表示支持post请求方式的路由;
Match表示匹配固定(自己定义)的请求方式的路由;
Any表示匹配任意请求方式的路由;
语法上match比get/post/any多一个参数:
Route::match(匹配的请求类型,地址,回调);
匹配请求类型要求是数组格式的声明(建议使用短数组)。
- 路由参数
参数分为必选参数和可选参数。
路由参数的传递通过路由地址中的“{参数名}”的形式来进行传递,该形式是必选参数的形式,可以选的则使用“{参数名?}”。
- 路由别名
路由别名相当于在路由定义的时候,为路由起了一个别名,在以后的程序中可以通过这个别名来获取路由的信息。
Route::any('/test5',function(){
echo "当前的用户id是" . $_GET['id'];
}) -> name(‘名字’);
调用该路由则可以写成:route(‘名字’);
查看系统已经有的路由命令:#php artisan route:list
- 路由群组
比如,你想要为所有路由URIs前面添加前缀admin
Route::group(['prefix' => 'admin'], function () {
Route::get(test1, function () {
// 匹配 "/admin/test1" URL
});
四、控制器使用
其位置位于app/Http/Controller
控制器文件命名:大驼峰的控制器名 + Controller.php
如果需要创建一个商品goods控制器,则命名为:GoodsController.php
- 创建控制器
控制器基础结构代码,不需要自己去手动编写,可以通过artisan命令行来自动生成。
php artisan make:controller 控制器名(大驼峰)Controller关键词
用artisan命令创建TestController.php文件。先确定命令:
php artisan make:controller TestController
2.控制器路由
路由设置格式基本相同,只是将匿名函数换成‘控制器类名@方法名’
定义格式如下:
Route::请求方法(路由表达式,控制器@方法')
- 控制器分目录管理
先建立相关的区分目录
创建控制器文件(使用artisan命令创建)
- 接收用户输入
接收用户输入的类:Illuminate\Support\Facades\Input
Facades:“门面”的思想。门面是介于一个类的实例化与没有实例化中间的一个状态。其实是类的一个接口实现。在这个状态下可以不实例化类但是可以调用类中的方法。说白了就是静态方法。
Input::get(‘参数的名字’, ‘如果参数没有被传递使用该默认值’)
Input::all(): 获取所有的用户的输入
Input::get(''): 获取单个的用户的输入
Input::only([ ]): 获取指定几个用户的输入
Input::except([ ]): 获取指定几个用户的输入以外的所有的参数
Input::has('name'):判断某个输入的参数是否存在
在laravel中如果需要使用facades的话,但是又不想写那么长的引入操作:
Use Illuminate\Support\Facades\Input
则可以在config/app.php中定义长串的别名(在aliases数组中定义别名)
在laravel中不仅仅是Input门面可以获取用户的输入,Request门面也可以获取用户输入的,其语法和Input一样,也存在get、all、only等方法。
五、DB类操作数据库
- 增加信息
对数据库中的某个表增加数据主要有两个函数可以实现,分别是insert()和insertGetId()
insert(数组)可以同时添加一条或多条,返回值是布尔类型。
insertGetId(一维数组),只能添加一条数据,返回自增的id。
DB::table('无前缀的表名') -> insert(); 连贯操作/链式操作
插入多条数据
DB::table('表名')—> insert(['key' => 'value','key' => 'value'],[],[])
- 修改数据
数据修改可以使用update()、increment()和decrement()函数来实现。
Update表示可以修改整个记录中的全部字段;
Increment和decrement表示修改数字字段的数值(递增或者递减),典型的应用:记录登录次数、积分的增加;
其返回的结果表示受到影响的行数。 - 查询数据
取出基本数据
DB::table('member')->get();
where方法之后继续调用where方法。
-> where() -> where() -> where().. 这个语法是并且(and)关系语法。
-> where() -> orWhere() -> orWhere()… 这个语法是或者(or)关系语法。
Orwhere方法的参数与where一致。
取出单行数据
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::table('member')->orderBy('age','desc')->get();
分页操作
DB::table('member')->limit(3)->offset(2)->get();
Limit:表示限制输出的条数
Offset:从什么地方开始
组合起来等价于limit 5,5
- 删除数据
DB::table('table_name')->where('id','1')->delete();
DB::table(‘member’) -> truncate();
- 执行任意的SQL语句
执行任意的insert update delete语句【影响记录的语句使用statement语法】
DB::statement(“insert into member values(null,’’)”);
执行任意的select语句【不影响记录的语句使用select语法】
$res = DB::select("select * from member");
六、视图操作
视图位置:resource/views
-
视图文件的命名与渲染
(1)文件名习惯小写(建议小写)
(2)文件名的后缀是 .blade.php(因为laravel里面有一套模板引擎就是使用blade,可以直接使用标签语法{{ $title }}, 也可以使用原生的php语法显示数据。)
(3)需要注意的是也可以使用.php结尾,但是这样的话就不能使用laravel提供的标签{{ $title }}语法显示数据,只能使用原生语法 <?php echo $title;?> 显示数据
两个视图文件同时存在,则.blade.php后缀的优先显示。 -
展示视图的方法
Return view(‘视图文件的名称’);
视图可以进行分目录管理的,例如需要展示home/test/test3视图,则可以写成:
Return view(‘home/test/test3’)
当然也支持点写法:
view(‘home.test.test3’)
①view(模板文件名称,数组) 数组就是需要分配的变量集合,数组是一个键值数组,其键与变量名尽量一致
②view(模板文件名称)->with(数组)
③view(模板文件名称)->with(名称,值)->with(名称,值)
可以用Compact函数:
Compact函数,是php内置函数跟laravel框架没有关系。作用主要是用于打包数组的。
语法:compact(‘变量名1’,’变量名2’,…);
- 模板中直接使用函数
在laravel中。视图调用函数其语法基本与js、php的语法一致,只不过要求左右包含大括号:
语法:{{函数名(参数1,参数2…)}} - 循环与分支语法标签
- 外部静态文件引入方式
在laravel中系统封装了一个方法asset:
七、Laravel避免CSRF攻击
- 通过csrf验证
在laravel中csrf验证机制默认是开启的。
在表单中,带上csrf需要token值,随着请求传递给后续的方法。
针对csrf_token方法的简化:{{csrf_field()}}
两者的区别:
Csrf_token只是输出token的值
Csrf_field输出了一个整个的input隐藏域
大部分情况下可以自己根据情况选择。但是有一个情况下开发者是没有选择权限的,必须需要使用csrf_token的,这个情况就是使用异步提交表单的方式。 - 从CSRF验证中排除例外路由
并不是所有请求都需要避免CSRF攻击,比如去第三方API获取数据的请求。
可以通过在VerifyCsrfToken(app/Http/Middleware/VerifyCsrfToken.php)中间件中将要排除的请求URL添加到$except属性数组中:
多个元素之间通过“,”分割,遵循数组写法。
如果需要排除全部路由使用csrf的话,则可以写成:"*"
八、模型操作
- 定义模型
定义模型的位置,默认是在app目录下面,但是为了管理方便,建议分目录进行创建 - 命名规则
本身laravel对模型的命名没有严格的要求,一般采用 表名(首字母大写).php
比如:Member.php User.php Goods.php - 创建模型
php artisan make:model Home/Member
-
定义模型注意事项
第一:(必做)定义一个 t a b l e 属 性 , 值 是 不 要 前 缀 的 表 名 , 如 果 不 指 定 则 使 用 类 名 的 复 数 形 式 作 为 表 名 。 如 果 模 型 为 M e m b e r 模 型 在 不 指 定 t a b l e 属 性 的 情 况 下 , 其 默 认 会 去 找 m e m b e r s 表 。 修 饰 词 : p r o t e c t e d 。 第 二 : ( 可 选 ) 定 义 table属性,值是不要前缀的表名,如果不指定则使用类名的复数形式作为表名。如果模型为Member模型在不指定table属性的情况下,其默认会去找members表。修饰词:protected。 第二:(可选)定义 table属性,值是不要前缀的表名,如果不指定则使用类名的复数形式作为表名。如果模型为Member模型在不指定table属性的情况下,其默认会去找members表。修饰词:protected。第二:(可选)定义primaryKey属性,值是主键名称,如果需要使AR模式的find方法,则可能需要指定主键(Model::find(n)),在主键字段不是id的时候则需要指定主键。修饰词:protected
第三: (可选)定义 t i m e s t a m p s 属 性 , 值 是 f a l s e , 如 果 不 设 置 为 f a l s e , 则 默 认 会 操 作 表 中 的 c r e a t e d a t 和 u p d a t e d a t 字 段 , 我 们 表 中 一 般 没 有 这 两 个 字 段 , 所 以 设 置 为 f a l s e , 表 示 不 要 操 作 这 两 个 字 段 。 修 饰 词 : p u b l i c 第 四 : ( 可 选 ) 定 义 timestamps属性,值是false,如果不设置为false,则默认会操作表中的created_at和updated_at字段,我们表中一般没有这两个字段,所以设置为false,表示不要操作这两个字段。修饰词:public 第四:(可选)定义 timestamps属性,值是false,如果不设置为false,则默认会操作表中的createdat和updatedat字段,我们表中一般没有这两个字段,所以设置为false,表示不要操作这两个字段。修饰词:public第四:(可选)定义fillable属性,表示使用模型插入数据时,允许插入到数据库的字段信息。修饰词:protected
使用模型中create插入数据时,要设置 f i l l a b l e 允 许 入 库 的 字 段 , 使 用 fillable允许入库的字段,使用 fillable允许入库的字段,使用guarded是设置排除入库的字段。
九、自动验证
- 基本语法
使用控制器中的validate方法来完成, t h i s − > v a l i d a t e ( this->validate( this−>validate(request,[验证规则]);
如果验证失败,laravel会自动将用户重定向回上一个位置,并将验证错误信息一次性存放到session中。
- 输出错误信息
- 把输出效果转换成中文
由于中文和英文都是属于语言范畴,如果要切换提示文字,则需要有中文语言包的支持。目前框架只有en语言包,则需要其他语言包需要去下载。
在官网搜索laravel-lang
安装命令:# composer require caouecs/laravel-lang:~3.0
语言包文件在vendor/caoue/laravel-lang中;将你需要的语言目录复制到resources/lang目录下即可。
在文件(config/app.php)中修改locale的值,改成你需要使用的语言简称。
简称其实就是语言包的文件夹名称。
注意:并不是所有的字段都有对应的翻译(或者有的翻译可能不是很准确),如果想自己定义翻译,则需要去修改语言包文件代码。