laravel入门知识点整理


Posted in PHP onSeptember 15, 2020

laravel入门

简介

作为PHP最常用的框架之一,Laravel的框架目录布置得尤其清晰,适用于各种类型的项目开发。今天来记录下laravel入门需要熟悉的知识点。

1、根目录

laravel入门知识点整理

其中,public/index.php是项目的入口文件

2、配置

laravel入门知识点整理

1)config目录

该文件夹下面,包含的是各种配置文件。包括mysql数据库连接信息,redis,自定义的配置文件信息等等

2).env文件

用以存储一些依赖环境的变量,比如数据库配置,因为它不会被加入到版本库中, 所以还用以配置一些敏感信息:比如正式环境的一些第三方应用账号,token 等。有点类似Yii框架中的main-local.php

用法参考:env('DB_HOST','192.168.1.223')

说明:优先使用.env文件中配置的DB_HOST对应的值,如果.env中没有配置,则使用这里设置的默认值'192.168.1.223'

laravel入门知识点整理

3)用法参考

config('redis_keys.redis_keys.all_follow_user')

3、MVC

laravel入门知识点整理

4、路由

1、routes目录

routes目录包含了应用定义的所有路由。Laravel 默认提供了四个路由文件用于给不同的入口使用:web.php、api.php、 console.php 和 channels.php。 除此之外,我们还可以自定义路由文件。

laravel入门知识点整理

这里介绍两个比较重要的官方提供的默认路由文件web.php和api.php

1)web.php

文件包含的路由通过 RouteServiceProvider 引入,都被约束在 web 中间件组中,因而支持 Session、CSRF 保护以及 Cookie 加密功能,如果应用无需提供无状态的、RESTful 风格的 API,那么路由基本上都要定义在 web.php 文件中

2)api.php

文件包含的路由通过 RouteServiceProvider 引入,都被约束在 api 中间件组中,因而支持频率限制功能,这些路由是无状态的,所以请求通过这些路由进入应用需要通过 token 进行认证并且不能访问 Session 状态。

2、路由定义

laravel入门知识点整理

稍微复杂一点的情况:

laravel入门知识点整理

3、RouteServiceProvider

文件包含的路由通过 RouteServiceProvider 引入

laravel入门知识点整理

5、中间件

提到中间件,那一定离不开app/Http/Kernel.php这个文件

1) kernel

Kernel 中定义了重要的中间件列表,所有的请求 request 在被应用处理前,都必须经过这些中间件,筛过一遍后,才会被决定如何处理。这涉及到中间件(middleware)的作用。

App\Http\Kernel

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
 /**
  * The application's global HTTP middleware stack.
  *
  * These middleware are run during every request to your application.
  *
  * @var array
  */
 protected $middleware = [
  \App\Http\Middleware\CheckForMaintenanceMode::class,
  \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
  \App\Http\Middleware\TrimStrings::class,
  \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
  \App\Http\Middleware\TrustProxies::class,
  \App\Http\Middleware\EnableCross::class,
 ];

 /**
  * The application's route middleware groups.
  *
  * @var array
  */
 protected $middlewareGroups = [
  'web' => [
   \App\Http\Middleware\EncryptCookies::class,
   \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
   \Illuminate\Session\Middleware\StartSession::class,
   // \Illuminate\Session\Middleware\AuthenticateSession::class,
   \Illuminate\View\Middleware\ShareErrorsFromSession::class,
   \App\Http\Middleware\VerifyCsrfToken::class,
   \Illuminate\Routing\Middleware\SubstituteBindings::class,
  ],
  'api' => [
//   'throttle:300,1',
   'bindings',
  ],
  'web_api' => [
//   'throttle:300,1',
   'bindings',
   'check_token'
  ],
  'admin_api' => [
//   'throttle:300,1',
   'bindings',
   'admin'
  ],
 ];

 /**
  * The application's route middleware.
  *
  * These middleware may be assigned to groups or used individually.
  *
  * @var array
  */
 protected $routeMiddleware = [
  'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
  'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
  'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
  'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
  'can' => \Illuminate\Auth\Middleware\Authorize::class,
  'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
  'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
  'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  'check_token' => \App\Http\Middleware\CheckToken::class,
 ];
}
上面的 $middleware[] 是面向全局的,特别是针对 HTTP 以及较为底层的。后面的 $middlewareGroups[] 和 $routeMiddleware[] 是比较具体的实施层面的。应该是可以根据开发需要继续添加。

我们再看看App\Http\Kernel继承的父类Illuminate\Foundation\Http\Kernel

<?php

namespace Illuminate\Foundation\Http;

use Exception;
use Throwable;
use Illuminate\Routing\Router;
use Illuminate\Routing\Pipeline;
use Illuminate\Support\Facades\Facade;
use Illuminate\Contracts\Debug\ExceptionHandler;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Http\Kernel as KernelContract;
use Symfony\Component\Debug\Exception\FatalThrowableError;

class Kernel implements KernelContract
{
 /**
  * The application implementation.
  *
  * @var \Illuminate\Contracts\Foundation\Application
  */
 protected $app;

 /**
  * The router instance.
  *
  * @var \Illuminate\Routing\Router
  */
 protected $router;

 /**
  * The bootstrap classes for the application.
  * 引导类,起引导作用的类
  * 这些类里面基本上都有一个 bootstrap(Application $app) 方法,
  * 从不同的角度 bootstrap 应用。为最终 boot() 最准备。
  * 注意:这些事做不完,不能接受请求,或许连$request都无法正确生成。
  * @var array
  */
 protected $bootstrappers = [
  // 载入服务器环境变量(.env 文件?)
  \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
  // 载入配置信息(config 目录?)
  \Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
  // 配置如何处理异常
  \Illuminate\Foundation\Bootstrap\HandleExceptions::class,
  // 注册 Facades
  \Illuminate\Foundation\Bootstrap\RegisterFacades::class,
  // 注册 Providers
  \Illuminate\Foundation\Bootstrap\RegisterProviders::class,
  // 启动 Providers
  \Illuminate\Foundation\Bootstrap\BootProviders::class,
 ];

 /**
  * The application's middleware stack.
  *
  * @var array
  */
 protected $middleware = [];

 /**
  * The application's route middleware groups.
  *
  * @var array
  */
 protected $middlewareGroups = [];

 /**
  * The application's route middleware.
  *
  * @var array
  */
 protected $routeMiddleware = [];

总之,Kernel 做了两件事,第一个是定义 $bootstraps[],做好了 boot 系统的准备,第二个是定义 各种 middleware,这些都对 $request 进行加工、处理、甄选、判断,最终为可以形成正确的、有效的 $response 做准备,都完成后,进行了 index.php 中的 $kernel->handle($request),返回 $response。

总结:

1) $request ---> $kernel { service providers/middlewares/routers } ---> $response

2) Kernel 是就是个大黑箱,送入请求,输出响应,我们只管往里面添加服务、中间件、路由等等。

2) middleware

laravel入门知识点整理

系统自带的VerifyCsrfToken.php

laravel入门知识点整理

自定义的中间件CheckToken.php

基本上中间件的具体过滤操作都在handle方法中完成

laravel入门知识点整理

6、日志

1) 日志的配置文件:config/logging.php

laravel入门知识点整理

2) logging.php

laravel入门知识点整理

3) 使用参考

Log::channel('wechatlog')->info("获取第三方平台component_access_token",['data'=>$data]);

然后执行请求完毕,就可以在storage/logs这个文件夹下面看到对应的日志记录

laravel入门知识点整理

7、服务提供者

1)自定义服务提供者

在laravel里面,服务提供者其实就是一个工厂类。它最大的作用就是用来进行服务绑定。当我们需要绑定一个或多个服务的时候,可以自定义一个服务提供者,然后把服务绑定的逻辑都放在该类的实现中。在larave里面,要自定一个服务提供者非常容易,只要继承Illuminate\Support\ServiceProvider这个类即可

举个栗子

app/providers/AppServiceProvider.php

laravel入门知识点整理

在这个举例里面,可以看到有一个register方法,这个方法是ServiceProvider里面定义的。自定义的时候,需要重写它。这个方法就是用来绑定服务的。

2)laravel初始化自定义服务提供者的源码

laravel入门知识点整理

3)config/app.php

从上一步的源码也能看到,laravel加载自定义服务提供者的时候,实际是从config/app.php这个配置文件里面的providers配置节找到所有要注册的服务提供者的。

laravel入门知识点整理

参考链接:https://blog.csdn.net/qqtaizi123/article/details/95949672

PHP 相关文章推荐
PHP iconv 函数转gb2312的bug解决方法
Oct 11 PHP
第4章 数据处理-php数组的处理-郑阿奇
Jul 04 PHP
PHP得到某段时间区间的时间戳 php定时任务
Apr 12 PHP
PHP漏洞全解(详细介绍)
Nov 13 PHP
php 发送带附件邮件示例
Jan 23 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
PHP弱类型的安全问题详细总结
Sep 25 PHP
利用php做服务器和web前端的界面进行交互
Oct 31 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
Sep 15 #PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 15 #PHP
laravel中Redis队列监听中断的分析
Sep 14 #PHP
PHP实现限制域名访问的实现代码(本地验证)
Sep 13 #PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
Sep 13 #PHP
PHP重载基础知识回顾
Sep 10 #PHP
PHP反射基础知识回顾
Sep 10 #PHP
You might like
php抽象类使用要点与注意事项分析
2015/02/09 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
Python pickle模块用法实例
2015/04/14 Python
Django实现图片文字同时提交的方法
2015/05/26 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
什么是Python变量作用域
2020/06/03 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
导师工作推荐信
2015/03/27 职场文书
召开会议通知范文
2015/04/15 职场文书
酒店员工手册范本
2015/05/14 职场文书
夏洛特的网观后感
2015/06/15 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫