laravel第三方包

安装包的时候 后置参数 –dev 表明只在开发环境中使用。

Debugbar

1
composer require "barryvdh/laravel-debugbar:~3.6" --dev

翻译包

支持了 52 个国家的语言

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

如果你想修改扩展包提供的语言文件,可以使用以下命令发布语言文件到项目里:

1
php artisan lang:publish zh_CN

图形验证码

1
composer require "mews/captcha:~3.0"

生成配置文件

1
php artisan vendor:publish --provider='Mews\Captcha\CaptchaServiceProvider'

调用

1
<img class="thumbnail captcha mt-3 mb-2" src="%7B%7B%20captcha_src('flat')%20%7D%7D" onclick="this.src='/captcha/flat?'+Math.random()" title="点击图片重新获取验证码">

验证

1
2
3
'captcha' => ['required', 'captcha'],
//required 验证必填
//captcha 验证验证码正确性

图片裁切

1
composer require "intervention/image:^2.7"

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use Intervention\Image\Facades\Image;

public function reduceSize($file_path, $max_width)
{
// 先实例化,传参是文件的磁盘物理路径
$image = Image::make($file_path);

// 进行大小调整的操作
$image->resize($max_width, null, function ($constraint) {

// 设定宽度是 $max_width,高度等比例缩放
$constraint->aspectRatio();

// 防止裁图时图片尺寸变大
$constraint->upsize();
});

// 对图片修改后进行保存
$image->save();
}

代码生成器

1
composer require "summerblue/generator:9.*" --dev

示例

1
php artisan make:scaffold Topic --schema="title:string:index,body:text,user_id:bigInteger:unsigned:index,category_id:integer:unsigned:index,reply_count:integer:unsigned:default(0),view_count:integer:unsigned:default(0),last_reply_user_id:integer:unsigned:default(0),order:integer:unsigned:default(0),excerpt:text:nullable,slug:string:nullable"

生成的文件作用

创建话题的数据库迁移文件 —— 2018_12_23_104258_create_topics_table.php;

创建话题数据工厂文件 —— TopicFactory.php;

创建话题数据填充文件 —— TopicsTableSeeder.php;

创建模型基类文件 —— Model.php, 并创建话题数据模型;

创建话题控制器 —— TopicsController.php;

创建表单请求的基类文件 —— Request.php,并创建话题表单请求验证类;

创建话题模型事件监控器 TopicObserver 并在 AppServiceProvider 中注册;

创建授权策略基类文件 —— Policy.php,同时创建话题授权类,并在 AuthServiceProvider 中注册;

在 web.php 中更新路由,新增话题相关的资源路由;

新建符合资源控制器要求的三个话题视图文件,并存放于 resources/views/topics 目录中;

执行了数据库迁移命令 artisan migrate;

因此次操作新建了多个文件,最终执行 composer dump-autoload 来生成 classmap。

laravel active

1
composer require "summerblue/laravel-active:9.*"

active_class 函数的用法,此函数的定义如下:

1
2
3
4
5
6
7
8
9
10
/**
* 如果 $condition 不为 False 即会返回字符串 `active`
*
* @param $condition
* @param string $activeClass
* @param string $inactiveClass
*
* @return string
*/
function active_class($condition, $activeClass = 'active', $inactiveClass = '')

if_route () - 判断当前对应的路由是否是指定的路由;

if_route_param () - 判断当前的 url 有无指定的路由参数。

if_query () - 判断指定的 GET 变量是否符合设置的值;

if_uri () - 判断当前的 url 是否满足指定的 url;

if_route_pattern () - 判断当前的路由是否包含指定的字符;

if_uri_pattern () - 判断当前的 url 是否含有指定的字符;

示例用法

1
2
active_class(if_route('topics.index'))
active_class((if_route('categories.show') && if_route_param('category', 4)))

HTMLPurifier for Laravel

HTMLPurifier for Laravel 是对 HTMLPurifier 针对 Laravel 框架的一个封装。本章节中,我们将使用此扩展包来对用户内容进行过滤。

1
composer require "mews/purifier:~3.3"

配置 HTMLPurifier for Laravel

1
php artisan vendor:publish --provider="Mews\Purifier\PurifierServiceProvider"

config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php return [
'encoding' => 'UTF-8',
'finalize' => true,
'ignoreNonStrings' => false,
'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,
],
],
];

示例

1
$topic->body = clean($topic->body, 'user_topic_body');

中文转拼音

PinYin 是 安正超 开发的

1
composer require "overtrue/pinyin:~4.0"

示例

1
2
3
4
5
use Overtrue\Pinyin\Pinyin;
public function pinyin($text)
{
return app(Pinyin::class)->permalink($text);
}

队列监控 Horizon

1
composer require "laravel/horizon:~5.6"

配置文件发布

1
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

访问 域名/horizon

Horizon 是一个监控程序,需要常驻运行,我们可以通过以下命令启动:

1
php artisan horizon

启动 Horizon 之后,就不需要queue:linsten监控了

laravel-permission

1
composer require "spatie/laravel-permission:~3.0"

生成数据库迁移文件

1
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

生成配置信息

1
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

加载 HasRoles

1
2
3
4
5
<?php use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable implements MustVerifyEmailContract
{
use HasRoles;
}

用法

新建角色,只需要提供 name 字段即可

1
2
3
use Spatie\Permission\Models\Role;

$role = Role::create(['name' => 'Founder']);

为角色添加权限

1
2
3
4
use Spatie\Permission\Models\Permission;

Permission::create(['name' => 'manage_contents']);
$role->givePermissionTo('manage_contents');

赋予用户某个角色:

1
2
3
4
5
6
7
8
#单个角色
$user->assignRole('Founder');

#多个角色
$user->assignRole('writer', 'admin');

#数组形式的多个角色
$user->assignRole(['writer', 'admin']);

检查用户角色

1
2
3
4
5
6
7
8
9

#是否是站长
$user->hasRole('Founder');

#是否拥有至少一个角色
$user->hasAnyRole(Role::all());

#是否拥有所有角色
$user->hasAllRoles(Role::all());

检查权限:

1
2
3
4
5
6

#检查用户是否有某个权限
$user->can('manage_contents');

#检查角色是否拥有某个权限
$role->hasPermissionTo('manage_contents');

直接给用户添加权限

1
2
3
4
5
#为用户添加『直接权限』
$user->givePermissionTo('manage_contents');

#获取所有直接权限
$user->getDirectPermissions()

用户切换工具

1
composer require "viacreative/sudo-su:~1.1"

添加 Provider

1
2
3
4
5
//在 app/Providers/AppServiceProvider.php 的 register 方法中添加

if (app()->isLocal()) {
$this->app->register(\VIACreative\SudoSu\ServiceProvider::class);
}

发布资源文件

1
php artisan vendor:publish --provider="VIACreative\SudoSu\ServiceProvider"

修改配置信息

1
2
3
4
5
6
7
8
<?php return [

// 允许使用的顶级域名
'allowed_tlds' => ['dev', 'local', 'test'],

// 用户模型
'user_model' => App\Models\User::class
];

模板植入

1
2
3
@if(app()->isLocal())
@include("sudosu::user-selector")
@endif

注: 配置信息中的 allowed_tlds 的值一定要配置,自己域名的顶级域名,即top,com等

短信发送组件

1
composer require "overtrue/easy-sms"

github地址

该组件还没有 Laravel 的 ServiceProvider

添加配置文件(config/easysms.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php return [
// HTTP 请求的超时时间(秒)
'timeout' => 10.0,

// 默认发送配置
'default' => [
// 网关调用策略,默认:顺序调用
'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,

// 默认可用的发送网关
'gateways' => [
'aliyun',
],
],
// 可用的网关配置
'gateways' => [
'errorlog' => [
'file' => '/tmp/easy-sms.log',
],
'aliyun' => [
'access_key_id' => env('SMS_ALIYUN_ACCESS_KEY_ID'),
'access_key_secret' => env('SMS_ALIYUN_ACCESS_KEY_SECRET'),
'sign_name' => 'Larabbs',
],
'templates' => [
'register' => env('SMS_ALIYUN_TEMPLATE_REGISTER'),
],
],
];

然后创建一个 ServiceProvider

1
php artisan make:provider EasySmsServiceProvider

写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php namespace App\Providers;

use Overtrue\EasySms\EasySms;
use Illuminate\Support\ServiceProvider;

class EasySmsServiceProvider extends ServiceProvider
{
public function boot()
{
//
}

public function register()
{
$this->app->singleton(EasySms::class, function ($app) {
return new EasySms(config('easysms'));
});

$this->app->alias(EasySms::class, 'easysms');
}
}

最后打开config/app.php
在 providers中增加App\Providers\EasySmsServiceProvider::class,

调用

1
2
3
4
5
6
7
8
9
10
11
12
$sms = app('easysms');
try {
$sms->send(13212345678, [
'template' => 'SMS_174806102',
'data' => [
'code' => 1234
],
]);
} catch (\Overtrue\EasySms\Exceptions\NoGatewayAvailableException $exception) {
$message = $exception->getException('aliyun')->getMessage();
dd($message);
}

通过迁移文件修改字段属性需要doctrine/dbal 组件

1
composer require doctrine/dbal

Include 机制

1
composer require spatie/laravel-query-builder

github地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Spatie\QueryBuilder\QueryBuilder;
use Spatie\QueryBuilder\AllowedFilter;


$topics = QueryBuilder::for(Topic::class)
->allowedIncludes('user', 'category')
->allowedFilters([
'title',
AllowedFilter::exact('category_id'),
AllowedFilter::scope('withOrder')->default('recentReplied'),
])
->paginate();
//allowedIncludes 是否加载关联关系
//allowedFilters 筛选
//llowedFilter::scope scope方法(scopeWithOrder)

sql日志

1
composer require overtrue/laravel-query-logger --dev
1
tail -f ./storage/logs/laravel.log

配置信息(在logging中添加如下内容)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
'query' => [
'enabled' => env('LOG_QUERY', env('APP_ENV') === 'local'),

// Only record queries that are slower than the following time
// Unit: milliseconds
'slower_than' => 0,

// Only record queries when the QUERY_LOG_TRIGGER is set in the environment,
// or when the trigger HEADER, GET, POST, or COOKIE variable is set.
'trigger' => env('QUERY_LOG_TRIGGER'),

// Log Channel 指定通道
'channel' => 'sql',
],