日常开发常用命令

Yarn

1
2
3
4
5
6
7
8
// 安装依赖时不读取或生成 yarn.lock 锁文件
yarn install --no-bin-links
// 使用 cross-env 解决跨平台 NODE_ENV 问题
yarn add cross-env
// 设置 yarn 源
yarn config set registry https://registry.npm.taobao.org

npm 热更新

1
2
3
4
5
// 监控所有相关的资源文件以便进行更改。Webpack 会在检测到文件更改时自动重新编译资源:
npm run watch-poll
// 强制安装所有模块,不管该模块之前是否安装过
npm install -f

修改时区和默认语言

1
2
3
4
5
6
7
// config/app.php 文件
return [
...
'timezone' => 'Asia/Shanghai',
...
'locale' => 'zh-CN',
];

Migration

1
2
3
php artisan make:migration create_users_table --create=users
php artisan make:migration add_votes_to_users_table --table=users
php artisan make:migration seed_users_table_data

快速实现用户模块

1
2
php artisan make:auth
php artisan migrate

使用第三方扩展包 overtrue/laravel-lang 实现多语言方案

1
composer require "overtrue/laravel-lang:~3.0"

通过 redirect()->intended() 实现页面重定向到上一次请求尝试访问的页面上

1
redirect()->intended(route('home'));

通过 makeVisible() 临时显示模型里指定的隐藏属性 $hidden

1
$usersArray = $users->makeVisible(['password', 'remember_token'])->toArray();

数据批量填充

1
2
3
4
5
6
7
8
9
10
<?php
$userIds = ['1','2','3'];
$faker = app(Faker\Generator::class);
$statuses = factory(Status::class)->times(100)->make()->each(function ($status) use ($faker, $userIds) {
$status->user_id = $faker->randomElement($userIds);
});
Status::insert($statuses->toArray());

Carbon 设置中文

1
2
3
4
5
6
7
8
9
public function boot()
{
\Carbon\Carbon::setLocale('zh');
}
...
// 显示友好的时间差
$model->updated_at->diffForHumans();

Auth::routes(); 等同代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');

form 元素完整声明

1
2
3
4
5
6
<form action="{{ route('users.update', $user->id) }}"
method="POST"
accept-charset="UTF-8"
enctype="multipart/form-data"
>
</form>

Laravel Rules 图片宽高验证规则

1
'avatar' => 'mimes:jpeg,bmp,png,gif|dimensions:min_width=200,min_height=200',

使用第三方扩展包 Intervention/image 实现图片裁剪功能

1
2
3
composer require intervention/image
php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"

使用数据迁移来实现生成数据填充

使用第三方扩展包 summerblue/generator 快速生成项目代码

1
composer require 'summerblue/generator:~0.5' --dev

使用第三方扩展包 hieu-le/active 来判断路由参数

1
composer require "hieu-le/active:~3.5"

使用 Request::url() 获取当前请求的 URL

使用 HTMLPurifier for Laravel 5 进行 XSS (跨站点脚本攻击)防御

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
composer require "mews/purifier:~2.0"
php artisan vendor:publish --provider="Mews\Purifier\PurifierServiceProvider"
// 打开文件 config/purifier.php 配置 purifier 信息
<?php
return [
'encoding' => 'UTF-8',
'finalize' => true,
'cachePath' => storage_path('app/purifier'),
'cacheFileMode' => 0755,
'settings' => [
'user_topic_body' => [
'HTML.Doctype' => 'XHTML 1.0 Transitional',
'HTML.Allowed' => 'div,b,strong,i,em,a[href|title],ul,ol,ol[start],li,p[style],br,span[style],img[width|height|alt|src],*[style|class],pre,hr,code,h2,h3,h4,h5,h6,blockquote,del,table,thead,tbody,tr,th,td',
'CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,margin,width,height,font-family,text-decoration,padding-left,color,background-color,text-align',
'AutoFormat.AutoParagraph' => true,
'AutoFormat.RemoveEmpty' => true,
],
],
];
// 配合辅助函数 clean 使用
$topic->body = clean($topic->body, 'user_topic_body');

使用 Guzzle 实现 HTTP 请求

1
composer require "guzzlehttp/guzzle:~6.3"

使用 PinYin 实现汉字转拼音

1
composer require "overtrue/pinyin:~3.0"

配置 Redis 队列

1
2
3
4
composer require "predis/predis:~1.0"
// .env 配置队列驱动
QUEUE_DRIVER=redis

失败任务:有时候队列中的任务会失败。Laravel 内置了一个方便的方式来指定任务重试的最大次数。当任务超出这个重试次数后,它就会被插入到 failed_jobs 数据表里面。我们可以使用 queue:failed-table 命令来创建 failed_jobs 表的迁移文件:

1
2
3
4
// 生成迁移文件
php artisan queue:failed-table
// 执行迁移文件
php artisan migrate

生成任务类

1
php artisan make:job QueenClass

  • Illuminate\Contracts\Queue\ShouldQueue 接口,表示将任务添加到队列,而不是同步执行
  • 引入 SerializesModels Trait,Eloquent 模型会被优雅的序列化和反序列化
  • handle 方法会在队列任务执行时被调用

Horizon 队列监控

1
2
composer require "laravel/horizon:~1.0"
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

使用 Supervisor 进程工具进行管理,配置和使用请参照 文档 进行配置;
每一次部署代码时,需 artisan horizon:terminate 然后再 artisan horizon 重新加载代码。

使用 @includeWhen() 判断是否加载文件

1
2
3
4
@includeWhen($boolean, 'view.name', ['some' => 'data'])
#### Laravel 消息通知系统
数据通知频道会在一张数据表里存储所有通知信息。我们后面会通过查询这张表的内容在应用界面上展示通知。

php artisan notifications:table
php artisan migrate
// 在 users 表里新增 notification_count 字段,用来跟踪用户有多少未读通知
php artisan make:migration add_notification_count_to_users_table –table=users

1
2
#### 使用 spatie/larave-permission 来实现权限管理

composer require “spatie/laravel-permission:~2.7”
php artisan vendor:publish –provider=”Spatie\Permission\PermissionServiceProvider” –tag=”migrations”
php artisan migrate
php artisan vendor:publish –provider=”Spatie\Permission\PermissionServiceProvider” –tag=”config”

1
2
#### 使用 summerblue/administrator:~1.1 快速生成管理后台

// 安装组件
composer require “summerblue/administrator:~1.1”

// 发布资源文件:config/administrator.php 配置文件,public/packages/summerblue/administrator 前端资源文件
php artisan vendor:publish –provider=”Frozennode\Administrator\AdministratorServiceProvider”

// 创建配置文件目录
mkdir config/administrator config/administrator/settings

1
2
#### Trait 方法重写

use Notifiable {
notify as protected laravelNotify;
}

1
2
3
#### 编写命令,提供给计划任务调用
使用调度器时,我们需要修改系统的 Cron 计划任务配置信息,运行以下命令:

export EDITOR=vi && crontab -e

1
复制下面这一行:

          • php /home/vagrant/Code/larabbs/artisan schedule:run >> /dev/null 2>&1
            ```