Laravel框架开发实践

Laravel是一款优秀的PHP框架,它的流行不仅仅是因为它的优秀特性,而且它开创了一种全新的编程思路,帮助开发者更加高效地完成Web应用的开发。在学习Laravel开发过程中,我深刻体会到了Laravel框架的简洁、高效和灵活,下面是我的学习心得和总结。

一、编程思路

1. Laravel基于MVC设计模式

 Laravel框架基于MVC设计模式,MVC是一种将应用程序的逻辑层分离出来的设计模式,将数据、显示和用户请求分离开来,各自职责明确。这种设计模式让Laravel框架更具有可扩展性、可维护性和可测试性。

2. 命令行工具

Laravel框架的命令行工具--“Artisan”可以帮助开发者快速的生成代码,减少开发过程中的重复代码,提升开发效率。例如,使用“make:model”命令生成一个新的数据模型,使用“make:controller”命令生成一个新的控制器,可以减少开发人员不必要的繁琐工作。同时,“Artisan”提供了丰富的命令行工具,可以帮助开发者快速调试应用程序,提高开发效率。

3. Composer

Laravel使用Composer管理依赖关系,通过使用Composer,开发者不必担心手动管理PHP类库的依赖关系,让开发者专注于业务逻辑的实现,同时可以节省开发时间和维护成本。

二、技巧运用

1. 中间件

中间件在Laravel框架中扮演了很重要的角色,可以实现对HTTP请求的预处理,例如鉴权、记录日志、参数验证等。中间件采用MVC设计模式,让代码分离的更加清晰,让系统更加健壮可靠。

2. Blade模板引擎

Laravel框架中强大的Blade模板引擎,可以让开发者更轻松地进行前端开发。Blade模板引擎提供丰富的模板语法,支持if语句、foreach循环等常用的语法,让前端排版更加直观简单,同时也可以降低前后端分离的开发成本。

3. Eloquent ORM

Laravel框架中的Eloquent ORM提供了非常强大的数据处理能力,代码简洁易懂。ORM将数据库中表的操作转换为对象的操作,让开发者不必直接操作数据库,大大简化了代码的编写和维护。

三、软件工程类学习体会

1. 单一职责原则

在使用Laravel框架时,我们要注意遵守单一职责原则,使得每一个类和函数都只有单一的职责。这样可以保证代码的可读性,也方便进行单元测试以及代码得复用。

2. 依赖注入原则

当我们在开发Laravel应用时,我们会发现Laravel框架完全支持依赖注入原则,所有的依赖注入和实例化都可以由Laravel容器完成。这样开发者只需要注重开发业务逻辑,而不需要关注类的实例化以及依赖的实现,降低了代码的耦合性,也方便横向扩展和单元测试。

3. 设计模式

Laravel框架完全支持常见的23种设计模式,例如Factory, Decorator, Observer等。在实际开发中,我们可以运用合适得设计模式,更好地完成动态拓展,提高代码质量和可维护性。

四、项目总结与分析

在实际应用中,我曾使用Laravel框架开发了一个在线的购物系统。该系统支持用户注册、商品浏览、购物车、订购、商品评价等功能,使用Laravel框架和Bootstrap前端框架。在该项目中,我深刻的感受到了Laravel框架的优秀特性,并对开源框架的开发、封装有了更深的体会。

总而言之,Laraval框架是一款功能强大、易扩展并且具有高性能的PHP框架,堪称PHP语言的一大福音。本次Laravel框架开发实践中,我以自身的体验结合实际项目经验,分享了Laravel框架的编程思路、技巧运用、软件工程类学习体会和项目总结等方面的内容。我相信,掌握Laravel框架将会在PHP开发领域更加得心应手,对提升职业竞争力有极强的帮助。

Laravel 是一个非常流行的 PHP 框架,我们可以使用它快速构建一个 WEB 应用程序。而现在 WEB 应用中多会采用前后端分离技术,所以我们经常会遇到使用 Laravel 搭建 API 项目的需求。 Laravel 在提供 API 这方面,很多地方都只是提供了一个规范,并没有告诉我们如何去实现它。这样带来的好处是 Laravel 放开了限制,使大家可以按照自己的习惯去使用它。 但这样做也给刚接触 Laravel 不久的同学带来了一些困扰:到底怎样使用这个框架才更优雅些呢,有没有例子可以参考下呢。

本项目就是为了给大家提供一个参考而建立的,这是一个使用 Laravel 框架实现的 API 项目,项目中提供了一些常见功能的示例。 本项目从零开始,在重要修改部分末尾都会添加 [commit] 链接, 可自行查看变更记录。

需要注意的是:

  1. 这并不是一个 Laravel 的新手教程,文中很多地方需要你了解 Laravel 的基础知识。 Laravel官网文档
  2. 如果你已经有自己的实现方式,可以略过此教程,这个项目的实现方式可能也没比你的实现方式更优雅。
  3. Laravel 各个版本之前实现方式还是有一些区别的,要注意区分,但整体思路是一样的。

安装

这里使用 composer 安装 Laravel ,下面命令会安装最新版本的 Laravel 。此项目创建时的 Laravel 版本为 v8.21.0

composer create-project --prefer-dist laravel/laravel laravel-api-example

安装好之后需要自行配置项目使其可以对外访问,当在浏览器中输入项目地址进入到 Laravel 的欢迎页时,就可以继续向下阅读了。

路由

在欢迎页我们可以看到,Laravel 返回的信息是一个 web 页面,也就是 html 代码。这个默认的路由是在 routes/web.php 中定义的,我们需要把它给移除掉。[commit]

我们所有的路由都要定义到 routes/api.php 中,这个是专门用来定义 API 路由的文件,当然如果你的路由特别多你也可以在 routes 中定义其他路由文件,然后在 RouteServiceProvider 中按照同样的方式去加载它们。 在 RouteServiceProvider 中我们可以看到,我们在 routes/api.php 中定义的路由会默认加上 api 前缀,这对 WEB 和 API 混写在同一个项目中很有必要,但单独的 API 项目一般也会单独域名。如:

https://api.apihubs.cn/holiday/get

所以我们要移除这个 api 前缀或换成其他前缀如接口版本号 V1 [commit]

在 routes/api.php 中默认的路由是一个需要身份验证的 /user

我们使用浏览器或 postman 访问的时候,会得到一个错误页面,其中的主要信息为:Route [login] not defined.

我们使用 ajax 或者在 postman 的 header 中添加 X-Requested-With:XMLHttpRequest 头信息后又会得到一个 JSON 的错误信息:{"message": "Unauthenticated."}

这实际上都是未登录的原因,在未登录访问需要鉴权的接口时 Laravel 会抛出一个 AuthenticationException ,而在响应类 Response 中会根据请求的 header 头自动做出响应。 也就是如果是以页面形式调用的,就会跳转到登录页面,因为项目中还没定义登录页面的路由就出现我们上面看到的那个错误。如果是以接口形式访问的就会 401 状态码并返回 JSON 信息。

但我们这是一个 API 项目,提供出去的都是接口地址,在接口地址中一会返回 JSON 一会又返回一个页面这是不是显得很尴尬。

这里我们需要新增一个 Middleware 来解决这个问题。然后在 Kernel 中注册这个 Middleware 使其全局生效。 [commit]

php artisan make:middleware JsonApplication

这样我们已经配置好一个 JSON 应用了,在 Laravel 抛出任何异常时,无论我们以什么方式访问都会始终得到 JSON 响应信息。

需要注意的是我们依然不能在路由的闭包或控制器中使用 ~~return view($view)~~ ,因为这会强制返回一个 html 页面响应。 我们应该在路由的闭包或控制器中始终 return 一个对象或数组,这两种格式会使 Laravel 自动为我们返回正确的 JSON 信息。

错误码

通过上面的配置,我们的应用可以始终返回 JSON 信息了。比如在出现异常的时候:

  • 鉴权失败会返回 http 状态码 401 的 {"message": "Unauthenticated."}
  • 请求的 method 不正确会返回 http 状态码 405 的 {"message":"The POST method is not supported for this route. Supported methods: GET, HEAD.","exception":"Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException",...}
  • 请求的 URL 地址不存在会返回 404 的 {"message":"","exception":"Symfony\Component\HttpKernel\Exception\NotFoundHttpException",...}
  • ...

但这样的返回信息也有问题:

  1. 返回信息的格式并不统一,JSON 中的 key 时有时无,接口调用方在很多时候找不到要以什么作为依据进行判断
  2. 许多异常信息为服务端敏感信息,会直接报漏给用户,存在安全隐患
  3. 异常信息都是通过 HTTP 状态码抛出的,会导致许多错误的 HTTP 状态码相同,比如 500

而通常的做法是需要根据不同的业务场景定义不同的错误代码和错误信息, 然后始终返会 http 状态码 200 的 {"code":"","msg":"","data":""}

在这里我们需要引入一个第三方的库(这个库会在项目中许多地方使用,也是本教程的核心,当然这个库的功能是仿照 Java 枚举而来的) phpenum 。 [commit]

composer require phpenum/phpenum

这是一个枚举库,在这里用来定义和管理错误码和错误信息,错误码的位数应该是固定的,至少一个模块下的错误码位数是固定的,这里使用 5 位错误码,你可以根据实际使用场景来定义。 我们在 app 目录下新建一个 Enums 目录,然后添加 ErrorEnum 为不同的错误和异常定义不同的错误码。 [commit]

定义好错误码后,我们还需要借助 Laravel 的 渲染异常 来渲染自定义异常类 ApiException 。 [commit]

php artisan make:exception ApiException

在上面这个 commit 中,我们对常见的异常都做了处理,使他们返回固定的错误码和错误信息,尤其对数据验证失败在 data 中返回了详细的错误信息,你也可以在 Handler 中添加一些其他需要处理的异常。

而未特殊定义状态码的异常会统一返回错误码 99999 的 未知错误,生产环境中是不应该出现这个错误码的,这个异常一般出现在调试阶段,我们需要解决掉它。

由于接口不再返回任何错误信息了,我们排查问题的方式也只能通过日志来排查 默认的日志在你本地的这个目录下 Laravel的日志也是非常强大,你可以随意更改存储的位置和介质,这里就不展开介绍了。

到这里我们就配置好统一错误码了,接下来无论在项目中出现什么错误,抛出什么异常,接口返回的信息始终保持为http状态码200的 {"code":"","msg":"","data":""}

但这些状态码都是系统产生异常时返回的,我们要自己返回自定义状态码要怎么做呢? 非常简单,你只需要在任何你想返回自定义状态码的地方抛出自定义异常就可以了(但除了 controller 层,其他层可能会以非 web 的方式掉用,比如 console ,它不应该捕获到 ApiException ,所以尽量保证在 controller 抛出 ApiException)

throw new ApiException(ErrorEnum::UNKNOWN_ERROR()); // {"code":99999,"msg":"服务器繁忙,请稍后再试","data":""}
throw new ApiException(ErrorEnum::UNKNOWN_ERROR(), 'This is an data'); // {"code":99999,"msg":"服务器繁忙,请稍后再试","data":"This is an data"}

那要是返回成功信息要怎么办呢,这个实现方式有很多,可以用官方文档示例中的 响应宏 , 也可以使用帮助类,还可以使用... 这里我们选 Laravel 的 Resource , 新建一个 Resource 类 JsonResponse, 在里面处理了常见的 Laravel 对象和添加分页处理。 [commit]

这样当我们想返回成功信息时只需要 return 这个实例就可以了。

return new JsonResponse($mixed);

配置信息

Laravel 的配置信息都保存在 config 中,你也可以自定义自己的配置信息,获取时只需要使用 config('filename.array_key') (支持多层级)就能轻松的获取到配置信息。 Laravel 的配置信息多是搭配了各个服务的门面模式来定义的,就比如 cache ,你只需要在 config 中修改 default driver ,就可以轻松的在 file 或 redis 或 database 等等等诸多存储介质之间切换,你还可以自定义存储介质。关于门面模式你可以自行查看 文档 和 源码 ,这里不展开介绍了。

这里还有个问题,就是比如数据库配置,一般我们都会区分开发、测试、生产环境,但是 config 中的配置只能在仓库中保存一份,这里我们就要用到另外一个特殊配置文件 .env

所有配置文件中以类似于 env('DB_HOST', '127.0.0.1') 这种方式定义的都会读取 .env 文件,第一个参数作为配置名称,如果未在 .env 文件中定义,则使用第二个参数默认值返回

一般我们会把所有区分环境的配置都定义在这个文件中

注意这个文件是不能提交到仓库的,所以你拉去代码后很有可能看不到这个文件,只需要将 .env.example copy 一份为 .env 即可 (首次安装 Laravel 会自动执行 copy) 然后配置好正确的数据库连接信息

数据库迁移(生产环境使用需谨慎)

文档

大多数框架都有数据库迁移功能,它对保持数据库结构的一致性起到非常大的作用,但这个功能如果没有合理使用则风险非常大,我之前就有同事使用了这个功能不小心把所有表都给重置了,还好数据是有备份的,及时进行了恢复。 Laravel 的数据迁移文件在 database/migrations 中,由于 Laravel 框架是国外开发者开发的,他们对用户的信息是以 email 为主,我们要在 user 表中增加手机号码字段。[commit]

添加完成后要在 model 添加该字段 [commit]

这里我们是直接对表迁移文件进行修改,是因为我们还没有进行数据库迁移,当你执行过数据库迁移后,Laravel 会在数据库中记录你已经迁移过的文件,这时如果再想修改应使用 更新表 的操作

接下来就可以执行数据库迁移操作了 (开发环境)

php artisan migrate

验证规则

Laravel 提供了非常多的 验证规则 ,这些验证规则可以满足大数据的验证场景,部分特殊验证需要我们自定义验证规则,比如手机号码 我们通过以下命令来创建一个 手机号码的验证规则 [commit]

php artisan make:rule PhoneNumber

添加好规则后我们可以在 ServiceProvider 中为规则配置别名 [commit]

参数验证

验证规则一般可以直接写在 controller 中,也可以单独定义 Requests 进行管理,这里我们使用第二种方式统一在 Requests 中定义管理验证逻辑。

我们先来创建一个获取验证码的 Request [commit]

php artisan make:request GetSmsCodeRequest

Request 中一般我们要在 messages 方法中重新定义错误信息,添加好 Request 后,我们就可以直接在 controller 中使用,结合之前我们的配置,当验证不通过时会返回以下信息

{
    "code": 10004,
    "msg": "数据验证失败",
    "data": {
        "phone_number": [
            "请输入您的手机号码"
        ]
    }
}

获取验证码

到这里我们的基础配置就完成了,让我们来实际的添加一个接口吧,首先在 routes/api.php 中添加一条获取验证码的路由(限制访问频次 30 分钟 100 次) [commit]

Route::middleware('throttle:100,30')->post('getSmsCode', [AuthController::class, 'getSmsCode']);

然后在添加 Controller Contract Service 以及在 ServiceProvider 中绑定 Contract 和 Service 的关系 [commit]

php artisan make:controller AuthController

这种实现方式是参考了 Laravel 的 自动注入 和 Laravel 的 将接口绑定到实现 而实现的

这里为了方便测试,验证码直接在接口中返回,实际使用需要修改为短信发送

laravel框架基础知识
一、laravel简介
laravel是一套优雅简介的PHP开发框架,受欢迎程度非常之高,功能强大,工具齐全;今天我们一起来看看框架的基础知识
二、版本选择
本篇学习笔记以laravel5.2.15版本为框架的版本基础;更多版本请移步https://www.golaravel.com/
三、laravel下载安装以及开发环境搭建
(一):环境搭建
由于laravel使用较多的php新特性,所以新版本的laravel对PHP的版本要求比较高,这里选择的laravel5.2.15要求 PHP>5.5.9+ 。Win系统下推荐使用集成的开发环境比如wamp、phpStudy、Xampp都可以,下载安装的时候需要注意PHP版本,Linux系统下需要编译安装。
(二):下载、安装及大致介绍
1、安装包下载安装
原本laravel中文网是可以下载一键安装包的,但是等我去下载的时候发现没地方可以下载,也只能通过度娘找其它下载资源下载安装包然后安装;我的资源:https://github.com/yuwenbo5/laravel5.2.15.git;下载安装包后解压更改名称(laravel),直接拷贝到环境根目录www(win下wamp环境)或者 /var/www/html(linux下lamp环境)中;打开浏览器输入url:localhost/laravel/public 然后回车,出现如下画面表示安装成功:

Laravel框架开发实践_第1张图片

laravel5启动页面
2、composer安装
cd到环境根目录,使用命令:composer create-project --prefer-dist laravel/laravel=5.2.15 laravel(项目名称,可修改)
3、简单介绍
laravel是基于mvc模式的php框架,m——模型层,v——视图层,c——控制器层;以下为laravel框架的目录文件,框出来的文件目录将在后续中用到:
 

Laravel框架开发实践_第2张图片

框架目录
app是应用的核心代码文件目录,以后的代码基本都在这里完成;app/Http/Controller目录是应用的控制器文件;routes.php是框架的路由文件,负责路由分配和映射;Http下的类文件,比如上面目录中的User.php、Menu.php文件是应用的模型文件;config目录是所有应用的配置文件目录;public是框架的入口文件及静态资源文件目录;resources/views则是应用的视图文件目录。
四、laravel路由
(一):简介
用过thinkPHP的开发者都知道,传统的MVC的url都是对应应用的控制器及控制器中的方法,laravel中的MVC则是通过路由功能映射到对应的程序(控制器方法),通过路由将用户的请求发送到对应的程序进行处理,其作用就是建立url和处理程序之间的映射关系,这样做有一个好处,对url进行美化只需要修改路由而无需对程序本身进行修改。
laravel中请求类型包括:get、post、put、patch、delete。
前面说了route.php是laravel的路由文件,所有的路由映射都要通过编辑route.php文件进行代码书写。
(二):路由学习
1、基本路由
get请求:

1 


post请求:

1 


2、多请求路由
顾名思义,多请求路由则是可以通过多种请求方式进行请求,多请求路由主要有两种方式,match和any
(1)、match接收请求类型的数组从而限定请求的类型:

1 


(2)、any方式

1 


3、路由参数
给路由绑定参数,接收参数进行处理
(1)、必选参数

1 


(2)、可选参数($userid=null表示默认值,可设置没有参数时的默认值)

1 


(3)、路由参数过滤(用正则表达式对传入的参数进行过滤)

1 where('num','[0-9]+');
11 
12 访问url:http://127.0.0.1/laravel/public/num/5
13 返回输出:this num is 5
14 
15 访问url:http://127.0.0.1/laravel/public/num
16 返回输出:this num is 15
17 
18 访问url:http://127.0.0.1/laravel/public/num/fhdja
19 页面报错
20 
21 //多个参数过滤
22 Route::get('info/{name}/{age?}', function($name,$age=null){
23     return 'name is '.$name.', age is '.$age;
24 })->where(['name' => '[a-zA-Z]+', 'age' => '[1-9]+']);
25 
26 可使用数组形式过滤多个参数


4、路由别名
给路由通过['as' => 'alias']数组使用别名后,可通过route('别名')生成url,请看代码理解:

1  'studentInfo' ,function(){ 
6  
7     //通过route('studentInfo')生成完成url后返回 
8     return route('studentInfo'); 
9 
10 }]);
11 
12 
13 访问url:http://127.0.0.1/laravel/public/student/info
14 页面返回:http://127.0.0.1/laravel/public/student/info
15 
16 注:别名的好处在于,以后在控制器中使用route('别名')的方式生成url后,即便修改了路由的名字,也不用再修改控制器程序,因为通过别名程序能自动生成修改后的url


5、路由群组
通过关键字group创建路由群组

1  'admin'], function(){
8      
9     //此时的访问地址:http://127.0.0.1/laravel/public/admin/student/info
10     Route::get('student/info',['as' => 'studentInfo' ,function(){
11         return route('studentInfo');
12     }]);
13 
14     //此时的访问地址:http://127.0.0.1/laravel/public/admin/info/yuwenbo/20
15     Route::get('info/{name}/{age?}', function($name,$age=null){
16         return 'name is '.$name.', age is '.$age;
17     })->where(['name' => '[a-zA-Z]+', 'age' => '[1-9]+']);
18     
19 });
20 
21 此时的访问地址url必须要加上群组前缀,否则将不能访问


6、路由中输出视图
通过view()函数输入视图

1 


一般情况是不会在路由中输出视图的。
五、控制器
控制器目录app/Http/Controller,此目录下有一个基本的控制器Controller,新增的控制器统一继承此Controller;
命名空间:namespce App\Http\Controller;
命名规则:控制器文件名跟类名统一首字母大写,以 控制器名+Controller 为命名规则,比如新建一个控制器 :AdminController.php

1 


1、路由关联控制器,通过路由访问控制器程序:

1  'AdminController@index']);
11 
12 
13 //路由别名关联控制器:
14 
15 Route::get('admin/index', [
16     'uses' => 'AdminController@index',
17     'as' => 'adminindex'
18 ]);


2、路由关联控制器进行参数绑定:

1 //路由书写 route.php 
2  'AdminController@index', 
6     'as' => 'adminindex' 
7 ])->where('num', '[0-9]+'); 
8  
9 ?>
10 
11 
12 
13 //控制器代码 AdminController.php
14 
32 
33 访问url:127.0.0.1/laravel/public/admin/index/5
34 页面输出:num is 5


六、模型
laravel框架的模型文件在app目录下,统一首字母大写,文件名与类名一致,统一继承于 Illuminate\Database\Eloquent\Model 基类;
(一)、新建模型及使用

1 //模型文件 Admin.php 
2 
22 
23 
24 //控制器文件 AdminController.php
25 


(二)、数据库操作
连接数据库mysql,laravel的数据库连接只需要配置好数据库的配置文件即可,也就是config目录下的database.php

1 //database.php文件 
2  
3  
4 'mysql' => [
5             'driver' => 'mysql', 
6             'host' => env('DB_HOST', 'localhost'), 
7             'port' => env('DB_PORT', '3306'), 
8             'database' => env('DB_DATABASE', 'forge'), 
9             'username' => env('DB_USERNAME', 'forge'),
10             'password' => env('DB_PASSWORD', ''),
11             'charset' => 'utf8',
12             'collation' => 'utf8_unicode_ci',
13             'prefix' => 'shop_',
14             'strict' => false,
15             'engine' => null,
16      ]
17 
18 //配置文件读取的是.env文件的内容


打开.env文件,做如下配置修改即可连接到mysql数据库

1 APP_ENV=local 
2 APP_DEBUG=true 
3 APP_KEY=base64:IxkVvrRLqdJeU9h8vGu1W58OG3NVuDtkMWyC6nIT4qs= 
4 APP_URL=http://localhost 
5  
6 //mysql连接配置 
7 DB_CONNECTION=mysql 
8 DB_HOST=localhost 
9 DB_PORT=3308
10 DB_DATABASE=shop
11 DB_USERNAME=root
12 DB_PASSWORD=root
13 
14 CACHE_DRIVER=file
15 SESSION_DRIVER=file
16 QUEUE_DRIVER=sync
17 
18 REDIS_HOST=127.0.0.1
19 REDIS_PASSWORD=null
20 REDIS_PORT=6379
21 
22 MAIL_DRIVER=smtp
23 MAIL_HOST=mailtrap.io
24 MAIL_PORT=2525
25 MAIL_USERNAME=null
26 MAIL_PASSWORD=null
27 MAIL_ENCRYPTION=null


1、使用DB facade操作数据库
类似原生的sql语句进行curd操作,例如:新建一个表user包含id、username、passwrod、email、sex、create_time、update_time字段

1 


使用DB facade操作数据库,初学还是很简单的,因为原生的sql还是比较熟的。
2、使用查询构造器操作数据库
使用查询构造器进行数据库操作使得操作简介、方便,示例使用上面的user表进行演示
查询构造器----新增数据

1 insert(
21             ['username' => 'yuwenbo', 'email' => '[email protected]', 'sex' => 1]
22         );//返回布尔值
23 
24         //插入一条数据返回插入的id
25         $insert_id = DB::table('user')->insertGetId(
26             ['username' => 'yuwenbo', 'email' => '[email protected]', 'sex' => 1]
27         );
28 
29 
30         //插入多条数据
31         $bool = DB::table('user')->insert([
32             ['username' => 'yuwenbo', 'email' => '[email protected]', 'sex' => 1],
33             ['username' => 'tom', 'email' => '[email protected]', 'sex' => 0]
34         ]);
35 
36     }
37 
38 }


查询构造器-----更新数据:更新指定内容和自增自减两种方式

1 where('username','admin')->update(['password' => '123456']);//返回影响的行数
22 
23         //更新自增自减24         $rows = DB::table('user')->where('username','admin')->increment('sex');//自增1
25         $rows = DB::table('user')->where('username','admin')->increment('sex',$n);//自增n
26
27         $rows = DB::table('user')->where('username','admin')->decrement('sex');//自减1
28         $rows = DB::table('user')->where('username','admin')->decrement('sex',$n);//自减n
29 
30         //自增同时修改其它内容
31         $rows = DB::table('user')->where('username','admin')->increment('sex', 3, ['email' => '[email protected]']);//自增同时修改内容
32 
33     }
34 
35 }


查询构造器----删除数据

1 where('username','admin')->delete();
21 
22         //清空数据(危险,谨慎使用)
23         DB::table('user')->truncate();
24 
25     }
26 
27 }


查询构造器-----查询数据

1 get();
21         $user_list = DB::table('user')->where('id','>=',2)->get();
22 
23         //多条件查询
24         $user_list = DB::table('user')->whereRaw('id >= ? and sex = ?', ['5' ,'1'])->get();
25 
26         //按照默认排序返回第一条数据first()
27         $user = DB::table('user')->first();
28         $user = DB::table('user')->orderBy('id','desc')->first();
29         $user = DB::table('user')->where('id', 2)->first();
30 
31         //返回结果集中指定的字段pluck
32         $usernames = DB::table('user')->whereRaw('id >= ? and sex = ?', ['5' ,'1'])->pluck('username');
33
34         //返回指定字段的下标lists
35         $usernames = DB::table('user')->whereRaw('id >= ? and sex = ?', ['5' ,'1'])->lists('username', 'id');//以id作为下标
36 
37         //返回指定的多个字段select()
38         $user_list = DB::table('user')->where('id', '>=', '1')->select('username','email','sex')->get();
39 
40         //每次查指定的条数chunk
41         DB::table('user')->chunk(2, function($user_list){
42             dd($user_list);
43         });
44 
45     }
46 
47 }


mysql中的聚合函数对应的构造器方法count()、max()、min()、avg()、sum(),使用都比较简单也很好理解,这里不再赘述
七、视图
laravel框架的视图支持原生的php文件,视图的目录 resources/views;
命名:统一以.php为后缀的PHP文件,规则:视图名+.+blade,例如新建一个视图文件:index.blade.php
一般情况下一个控制器会建一个视图目录,例如AdminController控制器,我们将在views下新建一个admin目录
(一)、新建视图

1 //模板文件 views/admin/index.blade.php2 3 this is views/admin/index.blade


(二)、输出视图

1 //路由文件 
2  
7  
8  
9 //控制器文件 AdminController.php
10 


输出视图时可以携带变量然后在模板中输出出来,这点将在后面的模板的详细使用中用到;
(三)、模板详解
1、模板继承
由于多数页面有相同部分,所以使用模板继承简化模板使用;以下首先在views/common下新建一个基本的公共模板文件base.blade.php,公共的模板文件放在views/common文件夹下
base.blade.php

1  
2  
3  
4  
5 后台管理-@yield('title') 
6  
7  
8 @section('style') 
9     //样式代码区
10 @show
11 
14 
15 
16 
17 
18 
19 @section('header')
20   
21 //头部 22
23 @show 24 25 26 @section('leftmenu') 27 30 @show 31 32
33 34 @yield('content') //主内容区域 35 36
37 @section('footer') 38 //页面底部 39 @show 40 @section('javascript') 41 //javascript代码区 42 @show 43 44


在views下新建首页index.blade.php继承公共模板文件
index.blade.php

1 @extends('common.base')
2  
3 @section('title') 
4   首页 
5 @stop 
6  
7 @section('style') 
8  
14 @stop
15 
16 @section('leftmenu')
17 38 @stop39 40 @section('content')
41  
42 43

相关版块涉及样式示例文档(文档说明)

44

这里是相关常用性样式预设,具体根据内容版块调整,列表添加字段注意考虑笔记本屏幕显示;
此页面仅为样式参考,程序对接可移除,具体布局根据项目内容而定
注意保留rt_content.parent
常用 “统计图” “Tab切换” “加载进度” “弹窗效果” “基础按钮及表格布局”“HTML5canvas特效”等等,具体根据实际需求添加修改追加!

45
46 @stop


模板继承语法:@extends('目录.文件名');例如:@extends('common.base'),就可以继承common目录下的base.blade.php模板
使用@section重写子模板,使用@yield展示某个指定的section的内容;
@yield不能被子模板扩展,@section可以被子模板扩展
如果需要展示父模板内容,可使用@parent;例如:

1 @extends('common.base')
2 
3 @section('header')
4     @parent
5     header6 @stop


2、基础语法及使用
输出变量,使用{{ $变量名 }},如下所示:

1 //例如控制器中 
2  
3 public function index(){ 
4        
5         return view('index',['name' => 'yuwenbo']); 
6  
7 } 
8  
9 
11 
12 //模板中输出index.blade.php
13 
14 
15 

{{ $name }}

16 17 18 结果输出:yuwenbo


使用php函数,blade模板允许我们使用原生的php,也可以在模板中使用函数及运算符

1 //模板中使用php函数 
2  
3  
4 //输出时间戳 
5 

{{ time() }}

6 7 //格式化当前时间 8

{{ date('Y-m-d H:i:s', time()) }}

9 10 //三元运算符 11

{{ in_array($name,$array) ? 'true' : false }}


模板中短语法:{{ isset($age) ? $age : 'default value' }} 等同于 {{ $age or 'default value' }}
原样输出:
使用@{{ $count }}即可原样输出 ‘{{ $count }}’。
子视图引入
使用@include关键字;例如在views下新建模板leftmenu.blade.php

1 @extends('common.base') 
2  
3 @section('header') 
4     @parent 
5     header 
6 @stop 
7  
8 @section('leftmenu) 
9     //引入子视图
10     @include('leftmenu')
11 @stop


3、流程控制

if判断语句

1 //if流程判断语句
2 
3 @if($user == 'admin')
4    i am admin
5 @elseif($user == 'yuwenbo')
6    i am yuwenbo
7 @else
8    i am default9 @endif


for循环语句

1 //for循环语句
2 
3 @for($i = 1; $i <= 10; $i ++)
4     

i is {{ $i }}

5 @endfor


foreach循环语句

1 //控制器 
2 public function index() 
3 {
4      $data_list = array('name' => 'yuwenbo', 'age' => 22, 'job' => 'php');
5  
6      return views('index', ['data' => $data_list]); 
7 } 
8 
9 
10 //视图输出
11 @foreach($data as $key => $val)
12     {{ $key }} => {{ $val }}
13 @endforeach
1 //控制器 2 public function index() 3 { 4      $data_list = array( 5          array('name' => 'admin', 'age' => 20), 6          array('name' => 'word', 'age' => 18) 7      ); 8  9      return views('index', ['data' => $data_list]);10 }11 12 13 //模板输出14 @foreach($data as $key => $val)15     

name is {{ $val->name }}, age is {{ $val->age }}

16 @endforeach

1 //控制器 
2 public function index() 
3 { 
4      $data_list = array( 
5          array('name' => 'admin', 'age' => 20), 
6          array('name' => 'word', 'age' => 18) 
7      ); 
8  
9      return views('index', ['data' => $data_list]);
10 }
11 
12 
13 //模板输出
14 @foreach($data as $key => $val)
15     

name is {{ $val->name }}, age is {{ $val->age }}

16 @endforeach


4、模板中使用url
url()-->通过路由的名字生成url
action()-->通过指定控制器及方法名生成url
route()-->通过路由别名生成url

 1 //路由 route.php
 2  
 3 
 Route('index',[ 
 4     'uses' => 'IndexController@index',  
 5     'as' => 'in' 
 6 ]);
 7
 8 
 9
 10 //模板中生成url的方式
 11
 12 url方式
 13
 14 action方式
 15
 16 route方式
 17
 18
 19 //以上三种方式均生成url:20 http://127.0.0.1/laravel/public/index

以上三种方式在实际使用时都可以用,一般情况下,使用url()和route()较多,因为写法简介方便。

注册

按照上面的教程,我们先来添加一个注册的路由 [commit]

Route::middleware('throttle:100,30')->post('register', [AuthController::class, 'register']);

然后添加一个验证码的 rule 并为其添加别名 [commit]

使用验证码规则创建注册的 request [commit]

最后在添加 Controller Contract Service 中的方法 [commit]1

你可能感兴趣的:(前端)