Laravel常用包整理

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动态加载
    • 数据载荷转换到各种协议格式:JSONDataArrayHAL等等
  • 友好的和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()输出前调整数据结构

LaravelFractal使用

  • 安装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 @varsetterTypehint将接口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

猜你喜欢

转载自my.oschina.net/u/2400083/blog/988715