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 相关文章推荐
用文本文件实现的动态实时发布新闻的程序
Oct 09 PHP
php中通过Ajax如何实现异步文件上传的代码实例
May 07 PHP
PHP反转字符串函数strrev()函数的用法
Feb 04 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
php+ajax导入大数据时产生的问题处理
Jun 11 PHP
详解WordPress开发中wp_title()函数的用法
Jan 07 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
SSO单点登录的PHP实现方法(Laravel框架)
Mar 23 PHP
PHP中的表达式简述
May 29 PHP
PHP链表操作简单示例
Oct 15 PHP
PHP生成随机字符串实例代码(字母+数字)
Sep 11 PHP
PHP数组与字符串互相转换实例
May 05 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生成RSS订阅的方法
2015/02/13 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
2021/03/09 PHP
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
Python合并多个装饰器小技巧
2015/04/28 Python
python简单实现获取当前时间
2016/08/27 Python
Python实现单词翻译功能
2017/06/06 Python
Python适配器模式代码实现解析
2019/08/02 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
教育实习生的自我评价分享
2013/11/21 职场文书
园林技术个人的自我评价
2014/02/15 职场文书
电力安全事故反思
2014/04/27 职场文书
工程负责人任命书
2014/06/06 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
2015年幼儿园德育工作总结
2015/05/25 职场文书
团队拓展训练感想
2015/08/07 职场文书
检举信的写法
2019/04/10 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js