Laravel 整理的文档

说明文档

Laravel Project Introduction

一、PHPStorm + Laravel 6.x 开发环境说明

1. 通过Composer拉取Laravel 6.x
  1. composer create-project --prefer-dist laravel/laravel laravel "6.*" #拉取laravel6.x的版本
  2. cd ./laravel #进入目录
  3. php artisan serve #运行HTTP服务
  4. 访问 http://127.0.0.1:8000 ,检查laravel是否部署成功
2. 在PHPStrom里面打开Laravel项目,然后安装PHPStorm的laravel-plugin插件,并添加artisan命令支持
3. 安装barryvdh/laravel-ide-helper插件开启代码提示,安装doctrine/dbal插件用于模型字段支持
  1. #代码提示插件的安装应用
  2. composer require barryvdh/laravel-ide-helper --dev
  3. php artisan ide-helper:generate
  4. #数据库Migrate插件,用于对数据结构的扩展支持
  5. composer require "doctrine/dbal: ~2.3"
4. 安装 Laravel-Oh-Generators 对项目结构进行更好更细的分层(MVC+)
  1. #安装生产器,用于代码结构解耦分层
  2. composer require yish/generators
5. 安装Debugbar插件,用于开发调试
  1. composer require barryvdh/laravel-debugbar --dev
6. 依赖包管理,开发环境与生产环境
  1. #若依赖包仅限于开发环境使用,则在composer后面加入--dev参数,如下所示
  2. composer require barryvdh/laravel-debugbar --dev
  3. composer require barryvdh/laravel-ide-helper --dev
  4. #在上线生产环境时,则需要跳过composer.json里面的require-dev包含的组件包
  5. composer install --no-dev #跳过require-dev中的依赖组件包
  6. composer install #安装所有依赖组件包
  7. #注意在生产环境要慎用 composer update,该操作会对所有依赖包进行版本更新,可能会存在依赖包更新后与应用出现不兼容的现象

二、Laravel应用目录规划

1. App目录为应用代码目录,其中主要分为四个分层Controller/Service/Repository(DAO)/Model
2. 分层作用说明
  • Model层即数据库实体层,也被称为Entity层。一般数据库一张表对应一个实体类,类属性同表字段一一对应。
  • Repository层,即DAO层即数据持久层,也被称为Mapper层。DAO层的作用为访问数据库,向数据库发送SQL语句,完成数据的增删改查任务。
  • Service层即业务逻辑层。Service层的作用为完成功能设计。Service层调用DAO层接口,接收DAO层返回的数据,完成项目的基本功能设计。
  • Controller层即控制层。Controller层的功能为请求和响应控制。Controller层负责前后端交互,接受前端请求,调用Service层,接收Service层返回的数据,最后返回具体的页面和数据到客户端。
  • Service与Repository层的调用设计
    • Service只调Repository
    • Service主调Repository,偶尔调其它Service
    • Service调其它Service,Repository只允许自己的Service调
3、APP主目录说明
  1. APP/Http/Controllers #为控制器目录
  2. APP/Services #为业务逻辑层
  3. APP/Models #为数据模型层
  4. APP/Repository #为数据库操作层
  • 不同的模块在不同的目录,生成一份模块名的目录,如User模块,则分别对应如下目录
    1. APP/Http/Controllers/User #为User的控制器目录
    2. APP/Services/User #为User的业务逻辑层
    3. APP/Models/User #为User的数据模型层
    4. APP/Repository/User #为User的数据库操作层

三、配置文件部署说明

1. 配置信息
  • 一些配置信息,如redis库名,多个mysql数据库,都配置在指定文件位置中
  • 存储在 .env 和 config/app.php 文件中,然后使用 config()函数来读取
    1. .env 文件中设置:
    2. DB_NAME=test
    3. DB_REDIS_NAME=test
    1. config/app.php 文件中设置:
    2. "db_name" => env('DB_NAME', null)
    1. 程序中获取配置 的方法
    2. config('app.cdn_domain')
  • 在此统一规定:所有程序配置信息 必须 通过 config() 来读取,所有的 .env 配置信息 必须 通过 config() 来读取,绝不 在配置文件以外的范围使用 env()。
2. 关于Redis配置(一个项目多个select配置)
  • Redis 与 Laravel 使用 推荐安装并使用 PhpRedis PHP 扩展
    通过 Composer 安装 predis / predis 包

    1. composer require predis/predis
  • Redis 配置都在配置文件 config/database.php 的redisConfig数组中
    tym_shop_api业务使用0库,常规缓存使用1库,tym_shop业务使用2库,tym_store业务使用3库

    1. $redisConfig = [
    2. 'url' => env('REDIS_URL', ''),
    3. 'host' => env('REDIS_HOST', '127.0.0.1'),
    4. 'password' => env('REDIS_PASSWORD', null),
    5. 'port' => env('REDIS_PORT', '6379'),
    6. 'database' => env('REDIS_DB', '0'), //默认0 切换Redis库根据配置文件库名
    7. ];
  • 指定要操作的数据库

    1. Redis::select(config('redisBbName')); #必须读取配置向指定数据库的配置库名
  • 使用多个 Redis 连接,在database.php 的配置多个redisConfig数组存放多个redis连接
    1. $redis = Redis::connection(config('redisBbName'));#必须读取配置项
3. 关于MySQL配置(多连接参数配置,一个连接参数多数据库配置)
  • MySQL 配置都在配置文件 config/database.php 的Config数组中
    ```python
    $config = [
    ‘host’ => env(‘DB_MYSQL_HOST’, ‘127.0.0.1’),
    ‘port’ => env(‘DB_MYSQL_PORT’, ‘3306’),
    ‘database’ => env(‘DB_MYSQL_DATABASE’, ‘tym_offline_shop1’),
    ‘username’ => env(‘DB_MYSQL_USERNAME’, ‘root’),
    ‘password’ => env(‘DB_MYSQL_PASSWORD’, ‘root’),
    ‘charset’ => ‘utf8mb4’,
    ‘collation’ => ‘utf8mb4_unicode_ci’,
    ‘prefix’ => ‘’

];

  1. + 可以配置多个数据库链接 配置参考MySQL 配置多个Config数组mysql连接
  2. + 指定要操作的数据库
  3. ```python
  4. #database.php 的配置多个config数组存放多个mysql连接
  5. DB::connection(config('mysqlBbName')) #必须读取配置项
4. 关于MongoDB配置(同MySQL)
  • MongoDB 配置都在配置文件 config/database.php 的mongodbConfig数组中
    ```python
    $mongodbConfig = [
    ‘host’ => env(‘DB_MONGO_HOST’, ‘127.0.0.1’),
    ‘port’ => env(‘DB_MONGO_PORT’, ‘27017’),
    ‘database’ => env(‘DB_MONGO_DATABASE’, ‘test’),
    ‘username’ => env(‘DB_MONGO_USERNAME’, ‘root’),
    ‘password’ => env(‘DB_PASSWORD’, ‘root’)

];

  1. + 切换MongoDB链接
  2. ```python
  3. DB::connection(config('MongoDBName'))#必须读取配置项

四、队列与任务调度规范

1. 队列
  • 使用列表里的队列服务前,必须安装以下依赖扩展包:
    Amazon SQS: aws/aws-sdk-php ~3.0 - Beanstalkd: pda/pheanstalk ~4.0 - Redis: predis/predis ~1.0

  • 队列配置文件存放在 config/queue.php。
    注意:
    redis 队列驱动,你需要在 config/database.php 配置文件中配置 Redis 的数据库连接
    queue 配置文件中包含一个 queue 属性。队列任务被发给指定连接的时候会被分发到 queue 属性和指定连接相同的队列中

  • 创建队列任务
    不同的模块在不同的目录,生成一份模块名的目录,如User模块

    1. 队列的任务类都放在 app/Jobs/User 目录下

    可以用以下的 Artisan 命令来生成一个新的队列任务
    php artisan make:job/user ProcessPodcast
    队列任务处理逻辑 写在handle 方法中
    ```python
    <?php

namespace App\Jobs;

use App\Podcast;
use App\AudioProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class ProcessPodcast implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

  1. protected $podcast;
  2. /**
  3. * 新建一个任务实例
  4. *
  5. * @param Podcast $podcast
  6. * @return void
  7. */
  8. public function __construct(Podcast $podcast)
  9. {
  10. $this->podcast = $podcast;
  11. }
  12. /**
  13. * 执行任务
  14. *
  15. * @param AudioProcessor $processor
  16. * @return void
  17. */
  18. public function handle(AudioProcessor $processor)
  19. {
  20. // 处理上传播客...
  21. }

}

  1. + 分发到指定队列
  2. ```python
  3. Job::dispatch(); #这个任务将被分发到默认队列...
  4. Job::dispatch()->onQueue('emails'); #这个任务将被发送到「emails」队列...
  • 运行队列处理器
    队列处理器将送到队列中的任务执行,使用 queue:work Artisan 命令运行处理器
    php artisan queue:work
2. 任务调度
  • 定义调度
    在 App\Console\Kernel 类的 schedule 方法中定义所有的调度任务 如下:
    ```python
    <?php

namespace App\Console;

use Illuminate\Support\Facades\DB;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
/**

  1. * 应用中自定义的 Artisan 命令
  2. *
  3. * @var array
  4. */
  5. protected $commands = [
  6. //
  7. ];
  8. /**
  9. * 定义计划任务
  10. *
  11. * @param \Illuminate\Console\Scheduling\Schedule $schedule
  12. * @return void
  13. */
  14. protected function schedule(Schedule $schedule)
  15. {
  16. $schedule->call(function () {
  17. DB::table('recent_users')->delete();
  18. })->daily();
  19. }

}

  1. + Artisan命令调度:可以给 command 方法传递命令名称或者类来调度一个 Artisan 命令
  2. ```python
  3. $schedule->command('emails:send Taylor --force')->daily();
  4. $schedule->command(EmailsCommand::class, ['Taylor', '--force'])->daily();
  • 队列任务调度:job 方法可以用来调度 队列任务
    ```python
    $schedule->job(new Heartbeat)->everyFiveMinutes();

// 分发任务到「heartbeats」队列…
$schedule->job(new Heartbeat, ‘heartbeats’)->everyFiveMinutes();

  1. + Shell调度命令:exec 方法可用于向操作系统发送命令
  2. ```python
  3. $schedule->exec('node /home/forge/script.js')->daily();
  • 调度频率设置:可以给任务分配多种调度方式
    ```python
    // 每周一 13:00 执行…
    $schedule->call(function () {
    //
    })->weekly()->mondays()->at(‘13:00’);

// 工作日(周一至周五) 8 点 至 17 点每小时执行一次…
$schedule->command(‘foo’)
->weekdays()
->hourly()
->timezone(‘America/Chicago’)
->between(‘8:00’, ‘17:00’);

  1. + 时间范围限制:between 方法可用于限制任务在一天中的某个时间段执行
  2. ```python
  3. $schedule->command('reminders:send')
  4. ->hourly()
  5. ->between('7:00', '22:00');
  • 闭包检测限制:when 方法可根据检测结果来执行任务
    1. $schedule->command('emails:send')->daily()->when(function () {
    2. return true;
    3. });
  • 避免任务重复:以使用 withoutOverlapping 方法
    1. $schedule->command('emails:send')->withoutOverlapping();
  • 启动调度器
    使用调度器时,需要把下面的 Cron 入口添加到服务器中
    1. * * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
    2. schedule:run 命令被执行的时候,Laravel 会根据你的调度执行预定的程序

五、静态常量类

保存目录:项目根目录\app\Conastant\
示例:

静态类说明
App\Constant\DataStatus 数据表中,status对应的状态: -1删除、0停用、1正常;
App\Constant\PageConst 微页面相关静态值
App\Constant\RedisConst Redis缓存相关静态值
App\Constant\StatusCode 接口状态相关静态值

六、缓存

缓存使用Laravel提供的Cache门面操作: use Illuminate\Support\Facades\Cache;

1. 缓存键名(全小写、:分割)

命名规则:项目名:模块:子模块:ID,例如:shop_api:product:info:41862

2. 缓存操作

用法示例:Cache::put(键名, 数据, 时间[DateTimeInterface|DateInterval|int为分钟]);
写入缓存:Cache::put($key, $data, RedisConst::CACHE_EXPIRED_TIME);,时间设置为0则设置为立即过期,相当于清空。
读取缓存:Cache::get($key);
清理缓存:Cache::forget($key);

缓存标签:标记缓存,便于批量清空。
写入缓存:Cache::tags(['tag_a','tag_b','tag_c'])->put($key, $data, RedisConst::CACHE_EXPIRED_TIME);
读取缓存:Cache::tags(['tag_a','tag_b','tag_c'])->get($key);
清空含有tag_a标签的缓存:Cache::tags('tag_a')->flush();

 
posted @ 2020-12-25 13:41  jk波  阅读(30)  评论(0)    收藏  举报