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');
PHP
事实上的Http请求标准
使用示例php
$httpClient = new \GuzzleHttp\Client([ 'timeout' => 5, 'http_errors' => false, //忽略掉请求错误 'headers' => [ 'Accept' => 'application/json', ], ]); # Get请求(query字符串) $httpClient->get('http://example.com/api', [query => $data]) # Post请求(表单数据) # $data数组自动编码为`application/x-www-form-urlencoded`形式 $httpClient->post('http://example.com/api', [form_params => $data]) # Post请求(Json数据) # $data数组自动编码为json字符串 $httpClient->post('http://example.com/api', [json => $data]) ## Promise异步并发请求 $promises = [ $httpClient->requestAsync('POST', 'http://example.com/apixx', [json => $data]), $httpClient->requestAsync('POST', 'http://example.com/apiyy', [json => $data]), ]; $responses = Promise\settle($promises)->wait();
phpDoc自动完成laravel
## 安装 ## 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);
## 提供如下数据收集器 ## * 可定制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, ...);
可定制的将松散输入数据hydrate到对象(fractal的逆向过程)git
## 安装 ## 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 );
相关概念github
PHP
领域广受欢迎的API数据
输出格式转换器ajax
单个对象
或者 集合对象
的格式化Include
动态加载JSON
、DataArray
、HAL
等等DingoApi
无缝结合对于WEB站
来讲数据库
原生使用json
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
使用bootstrap
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();
自动根据类phpdoc @var
或setter
的Typehint
将接口JSON数据hydrate
映射到类对象上api
## 安装 ## 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'); # 一组对象映射
Laravel5 RBAC权限系统数组
## 安装 ## 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
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']; }