Carbon
PHP
事实上的标准时间处理包
- 面向对象的角度来进行时间方面的处理工作
- 其解决了诸多时间处理上的
疑难杂症
$now = Carbon::now();
$now->format('Y-m-d H:i:s');
$tomorrow = Carbon::tomorrow();
$tomorrow->addDays(3);
$tomorrow->diffInDays($now);
$sometime = Carbon::parse('2017-01-01');
GuzzleHttp
PHP
事实上的Http请求标准
使用示例
$httpClient = new \GuzzleHttp\Client([
'timeout' => 5,
'http_errors' => false, //忽略掉请求错误
'headers' => [
'Accept' => 'application/json',
],
]);
# Get请求(query字符串)
$httpClient->get('http://doumi.com', [query => $data])
# Post请求(表单数据)
# $data数组自动编码为`application/x-www-form-urlencoded`形式
$httpClient->post('http://doumi.com', [form_params => $data])
# Post请求(Json数据)
# $data数组自动编码为json字符串
$httpClient->post('http://doumi.com', [json => $data])
laravel-ide-helper
phpDoc自动完成
## 安装 ##
composer require barryvdh/laravel-ide-helper:~2.2 --dev
## AppServiceProvider中注册 ##
public function register()
{
if ($this->app->environment() !== 'production') {
$this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
}
// ...
}
## 输出配置文件 ##
php artisan vendor:publish --provider="Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider" --tag=config
## 输出phpDocs支持文件/_ide_helper.php,增强IDE的自动提示 ##
# 编辑 config/ide-helper.php
# 默认只输出facade注解
'include_helpers' => true, # helper函数注解支持
'include_fluent' => true, # migration中链式调用注解支持
php artisan clear-compiled # 清理bootstrap/compiled.php
php artisan ide-helper:generate # 自动完成Facades的注解(需要经常执行,项目根下会导出_ide_helper.php文件)
php artisan optimize # 重建bootstrap/compiled.php
# 编辑composer.json实现每次`composer update nothing`后自动刷新phpDocs支持文件
"scripts":{
"post-update-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postUpdate",
"composer dump-autoload --optimize",
"php artisan clear-compiled",
"php artisan ide-helper:generate",
"php artisan ide-helper:meta",
"php artisan optimize"
]
},
## 输出模型类字段注解 ##
# 首先调通数据库连接
composer require Doctrine/dbal:^2.5 --dev #用于获取数据表列的定义
php artisan ide-helper:models --write ["\\完整命名空间模型"]
## 输出PhpStorm Meta,提供IOC容器提示支持 ##
php artisan ide-helper:meta # 项目根下会导出.phpstorm.meta.php文件
## lumen框架下安装 ##
# 编辑bootstrap/app.php启用如下几行
$app->withFacades();
$app->register(App\Providers\AppServiceProvider::class);
laravel-debugbar
## 提供以下数据收集器 ##
* 可定制collector:`QueryCollector、RouteCollector、ViewCollector、EventsCollector、LaravelCollector、SymfonyRequestCollector、LogsCollector、FilesCollector、ConfigCollector`
* Laravel启用collector:`LogCollector、SwiftMailCollector、SwiftLogCollector`
* 默认collector:`PhpInfoCollector、MessagesCollector、TimeDataCollector、MemoryCollector、ExceptionsCollector`
## 安装 ##
composer require barryvdh/laravel-debugbar:^2.3 --dev
# 注册在config/app.php中
'providers' => [Barryvdh\Debugbar\ServiceProvider::class, ...]
'aliases' => ['Debugbar' => Barryvdh\Debugbar\Facade::class, ...]
# 发布包配置文件
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
# 使用
Debugbar::enable|disable();
Debugbar::info|error|warning|addMessage();
Debugbar::startMeasure|stopMeasure|addMeasure|measure();
debug($var, ...);
Incoming
可定制的将松散输入数据hydrate到对象(fractal的逆向过程)
## 安装 ##
composer require incoming/incoming=^0.2.1
## 使用 ##
class MyModelHydrator implements Incoming\Hydrator\HydratorInterface
{
public function hydrate($input, $model)
{
# 可以做一些输入数据校验逻辑
$model->setName($input->name);
return $model;
}
}
$incoming = new Incoming\Processor();
$hydratedModel = $incoming->process(
app('request')->all(),
$myModel,
$myModelHydrator
);
Fractal
相关概念
PHP
领域广受欢迎的API数据
输出格式转换器
- 支持
单个对象
或者集合对象
的格式化 - 通过Fractal Transformer显式修饰对象的数据输出,将复杂数据转为ajax/restful
- 额外特性
- 关联数据的
Include
动态加载 - 数据载荷转换到各种协议格式:
JSON
、DataArray
、HAL
等等
- 关联数据的
- 友好的和
DingoApi
无缝结合
对于WEB站
来说
- 不建议过多进行数据格式化,直接输出完整对象,尽量用对象来替代数组
- 特别的字段值计算可以封装为对象的方法
原生使用
class MyTransformer extends League\Fractal\TransformerAbstract
{
# normalize主逻辑
public function transform($object){
return [
'id' => $object->id,
'name' => $object->name,
];
}
## include特性 ##
## 使用前需要检测include参数:$manager->parseIncludes($_GET['include']);
protected $defaultIncludes = []; #声明需要默认include的资源
protected $availableIncludes = [tag]; #声明可选include资源
public function includeTag($object){
$tag = $object->tag;
return $this->item($tag, new TagTransformer); #包含单对象
#return $this->collection($tags, new TagTransformer); #包含集合对象
}
}
$itemResource = new \Fractal\Resource\Item(
$object,
League\Fractal\TransformerAbstract $myTransformer
);
$collectionResource = new \Fractal\Resource\Collection(
$objects,
League\Fractal\TransformerAbstract $myTransformer
);
$manager = new League\Fractal\Manager();
$manager = $manager->createData($itemResource|$collectionResource)->toArray|toJson(); #transformer转换数据
# 可以进一步使用serializer在toArray()输出前调整数据结构
Laravel
下Fractal
使用
- 安装
Fractal
驱动spatie/laravel-fractal
class BookTransformer extends League\Fractal\TransformerAbstract
{
# normalize逻辑
public function transform($object){
return [
'id' => $object->id,
'name' => $object->name,
];
}
}
# 集合对象序列化(两种写法)
- Fractal::collection($books)->transformWith(new BookTransformer())->toArray();
- fractal($books, new BookTransformer())->toArray();
# 单个对象序列化(两种写法)
- Fractal::item($book)->transformWith(new BookTransformer())->toArray();
- fractal($book, new BookTransformer())->toArray();
JsonMapper
自动根据类phpdoc @var
或setter
的Typehint
将接口JSON数据hydrate
映射到类对象上
- 映射到模型上便于封装方法
- 接口变更只需调整数据模型,不用调整业务代码
- 有以上特性带来的IDE自动完成能力
## 安装 ##
composer require netresearch/jsonmapper=^1.0
## 使用 ##
$mapper = new JsonMapper();
$mapper->classMap['AaClass'] = 'BbClass'; #微调映射处理的类型(AaClass是抽象类时)
$mapper->bStrictNullTypes = false; #设置允许json字段为空
$mapper->bExceptionOnUndefinedProperty = false;
$mapper->bExceptionOnMissingData = true;
$mapper->bIgnoreVisibility = true;
$mapper->bStrictObjectTypeChecking = true;
$mapper->bEnforceMapType = true;
$myModel= $mapper->map(Object $jsonData, new MyModel()); # 单一对象映射
$myModels= $mapper->mapArray($jsonDataList, array()|Collection, 'MyModel'); # 一组对象映射
Ultraware/Roles
Laravel5 RBAC权限系统
扫描二维码关注公众号,回复:
1025426 查看本文章
## 安装 ##
composer require ultraware/roles:~5.4
# 发布配置和数据库迁移
php artisan vendor:publish --provider="Ultraware\Roles\RolesServiceProvider" --tag=config
php artisan vendor:publish --provider="Ultraware\Roles\RolesServiceProvider" --tag=migrations
php artisan migrate
# config/app.php中注册providor
'providers' => [
Ultraware\Roles\RolesServiceProvider::class,
...
]
# User模型调整
- implements \Ultraware\Roles\Contracts\HasRoleAndPermission;
- use \Ultraware\Roles\Traits\HasRoleAndPermission;
## 使用 ##
$testRole = Role::create(['name'=>xx, 'slug'=>yy]);
$user->attachRole|detachRole($testRole);
$user->detachAllRoles();
$user->syncRoles($roles);
$user->isTestRole(); //魔术调用
$user->hasRole($testRole->slug|$testRoles->slugs [,boolAllMatch]);
$user->level();
$testPermission = Permission::create(['name'=>xx, 'slug'=>yy]);
$role|$user->attachPermission|detachPermission($testPermission);
$role|$user->detachAllPermissions();
$role|$user->syncPermissions($permissions);
$user->hasPermission($testPermission->slug);
$user->canTestPermission(); //魔术调用
# 权限继承:上层level的role拥有所有下层level role的权限
# 实体检查
$user->allowed($testPermission->slug, $entity [, boolOwnerCheck]);
# blade拓展
- @role($testRole->slug [,boolAllMatch])...@else...@endrole
- @level($testRole->level)...@else...@endlevel
- @permission($testPermission->slug)...@else...@endpermission
- @allowed($testPermission->slug, $entity)...@else...@endallowed
## 路由中权限约束 ##
# app/Http/Kernel.php中注册路由中间件
protected $routeMiddleware = [
...
'role' => \Ultraware\Roles\Middleware\VerifyRole::class,
'permission' => \Ultraware\Roles\Middleware\VerifyPermission::class,
'level' => \Ultraware\Roles\Middleware\VerifyLevel::class,
]
# 路由中调用约束
$router->middleware(role:testrole);
$router->middleware(permission:testpermission);
$router->middleware(level:testlevel);
#校验失败时抛出以下异常
- \Ultraware\Roles\Exceptions\RoleDeniedException
- \Ultraware\Roles\Exceptions\PermissionDeniedException
- \Ultraware\Roles\Exceptions\LevelDeniedException
Eloquence
EloquentORM功能增强
* `composer require sofa/eloquence:~5.3`
* `bootstrap/app.php`中注册`Sofa\Eloquence\ServiceProvider`
* Model引入特性Trait(顺序重要)
#### Eloquence Trait增强 ####
# 助手方法
CustomModel::hasColumn($colName)
CustomModel::getColumnListing()
# hooks
class CustomModel extends Model
{
use Eloquence;
use Mappable, Mutable;
protected $maps = ['name' => 'profile.name'];
protected $getterMutators = ['name' => 'ucwords'];
protected $setterMutators = ['name' => 'strtolower'];
}
- oss驱动实现github.com/tyua07/laravel-upload