Laravel Project Introduction
一、PHPStorm + Laravel 6.x 开发环境说明
1. 通过Composer拉取Laravel 6.x
composer create-project --prefer-dist laravel/laravel laravel "6.*" #拉取laravel6.x的版本
cd ./laravel #进入目录
php artisan serve #运行HTTP服务
访问 http://127.0.0.1:8000 ,检查laravel是否部署成功
2. 在PHPStrom里面打开Laravel项目,然后安装PHPStorm的laravel-plugin插件,并添加artisan命令支持
3. 安装barryvdh/laravel-ide-helper插件开启代码提示,安装doctrine/dbal插件用于模型字段支持
#代码提示插件的安装应用
composer require barryvdh/laravel-ide-helper --dev
php artisan ide-helper:generate
#数据库Migrate插件,用于对数据结构的扩展支持
composer require "doctrine/dbal: ~2.3"
4. 安装 Laravel-Oh-Generators 对项目结构进行更好更细的分层(MVC+)
#安装生产器,用于代码结构解耦分层
composer require yish/generators
5. 安装Debugbar插件,用于开发调试
composer require barryvdh/laravel-debugbar --dev
6. 依赖包管理,开发环境与生产环境
#若依赖包仅限于开发环境使用,则在composer后面加入--dev参数,如下所示
composer require barryvdh/laravel-debugbar --dev
composer require barryvdh/laravel-ide-helper --dev
#在上线生产环境时,则需要跳过composer.json里面的require-dev包含的组件包
composer install --no-dev #跳过require-dev中的依赖组件包
composer install #安装所有依赖组件包
#注意在生产环境要慎用 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主目录说明
APP/Http/Controllers #为控制器目录
APP/Services #为业务逻辑层
APP/Models #为数据模型层
APP/Repository #为数据库操作层
- 不同的模块在不同的目录,生成一份模块名的目录,如User模块,则分别对应如下目录
APP/Http/Controllers/User #为User的控制器目录
APP/Services/User #为User的业务逻辑层
APP/Models/User #为User的数据模型层
APP/Repository/User #为User的数据库操作层
三、配置文件部署说明
1. 配置信息
- 一些配置信息,如redis库名,多个mysql数据库,都配置在指定文件位置中
- 存储在 .env 和 config/app.php 文件中,然后使用 config()函数来读取
.env 文件中设置:
DB_NAME=test
DB_REDIS_NAME=test
config/app.php 文件中设置:
"db_name" => env('DB_NAME', null)
程序中获取配置 的方法
config('app.cdn_domain')
- 在此统一规定:所有程序配置信息 必须 通过 config() 来读取,所有的 .env 配置信息 必须 通过 config() 来读取,绝不 在配置文件以外的范围使用 env()。
2. 关于Redis配置(一个项目多个select配置)
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’ => ‘’
];
+ 可以配置多个数据库链接 配置参考MySQL 配置多个Config数组mysql连接
+ 指定要操作的数据库
```python
#database.php 的配置多个config数组存放多个mysql连接
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’)
];
+ 切换MongoDB链接
```python
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模块
队列的任务类都放在 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;
protected $podcast;
/**
* 新建一个任务实例
*
* @param Podcast $podcast
* @return void
*/
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
/**
* 执行任务
*
* @param AudioProcessor $processor
* @return void
*/
public function handle(AudioProcessor $processor)
{
// 处理上传播客...
}
}
+ 分发到指定队列
```python
Job::dispatch(); #这个任务将被分发到默认队列...
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
{
/**
* 应用中自定义的 Artisan 命令
*
* @var array
*/
protected $commands = [
//
];
/**
* 定义计划任务
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
}
}
+ Artisan命令调度:可以给 command 方法传递命令名称或者类来调度一个 Artisan 命令
```python
$schedule->command('emails:send Taylor --force')->daily();
$schedule->command(EmailsCommand::class, ['Taylor', '--force'])->daily();
- 队列任务调度:job 方法可以用来调度 队列任务
```python
$schedule->job(new Heartbeat)->everyFiveMinutes();
// 分发任务到「heartbeats」队列…
$schedule->job(new Heartbeat, ‘heartbeats’)->everyFiveMinutes();
+ Shell调度命令:exec 方法可用于向操作系统发送命令
```python
$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’);
+ 时间范围限制:between 方法可用于限制任务在一天中的某个时间段执行
```python
$schedule->command('reminders:send')
->hourly()
->between('7:00', '22:00');
- 闭包检测限制:when 方法可根据检测结果来执行任务
$schedule->command('emails:send')->daily()->when(function () {
return true;
});
- 避免任务重复:以使用 withoutOverlapping 方法
$schedule->command('emails:send')->withoutOverlapping();
- 启动调度器
使用调度器时,需要把下面的 Cron 入口添加到服务器中
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
当 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();