pixeloven / framework
简单的Laravel请求模型扩展库
Requires
- php: >=7.4
- laravel/lumen-framework: >=6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.18
- phpcompatibility/php-compatibility: ^9.3.5
- phpstan/phpstan: ^0.12.99
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.6.0
This package is auto-updated.
Last update: 2024-09-30 01:16:30 UTC
README
一个用于扩展Laravel/Lumen的简单框架
设置
最快的设置方法是首先确保您已安装docker。然后运行以下命令
docker-compose build
这将创建一个包含运行和验证我们代码所需所有内容的php-7.4 docker镜像和容器。完成后,我们可以在新创建的容器中运行composer。
docker-compose run php-7.4 composer install
代码质量测试
验证您的更改有两个简单的步骤。
测试
我们使用PHPUnit进行所有测试。
docker-compose run php-7.4 composer test
代码风格检查
我们使用PHPCodesniffer进行所有代码风格检查。
docker-compose run php-7.4 composer lint
静态分析
我们使用PHPStan进行所有静态分析。
docker-compose run php-7.4 composer stan
目前我们的配置设置为5级,基准中有1个忽略的错误。我们的目标是保持严格的基准,忽略错误尽可能少。随着我们的源代码与PHP 7.4+特性同步,我们将进一步收紧级别以应对不断增长的复杂性。
格式化
我们使用PHPFixer进行所有格式化需求。此命令将更改写入磁盘。
docker-compose run php-7.4 composer format
如果您只想检查问题而不写入磁盘,请运行以下命令。
docker-compose run php-7.4 composer format:dry-run
所有命令别名都可以在composer.json文件下的scripts中找到。上面的大部分内容都在我们的构建管道中运行,以确保质量。
使用方法
Http模型旨在帮助将请求抽象为输入模型。以下示例显示了它如何在生产中使用。
首先,我们有Address模型,它定义了我们的API如何接受地址。
<?php declare(strict_types=1); namespace App\Http\Models; use PixelOven\Http\Model; /** * @SWG\Definition( * type="object", * required={"street", "postal", "region", "country"}, * @SWG\Xml( * name="AddressBody" * ) * ) * * Class AddressBody * @package App\Http\Models */ class AddressBody extends Model { /** * @SWG\Property( * description="Street address", * ) * @var string */ public $street; /** * @SWG\Property( * description="Postal code", * ) * @var string */ public $postal; /** * @SWG\Property( * description="Region, Province or State", * ) * @var string */ public $region; /** * @SWG\Property( * description="Country", * ) * @var string */ public $country; }
然后,在此基础上,我们定义了User模型,它与Address有关联。
<?php declare(strict_types=1); namespace App\Http\Models; use PixelOven\Http\Model; /** * @SWG\Definition( * type="object", * required={"email", "name"}, * @SWG\Xml( * name="UserBody" * ) * ) * * Class UserBody * @package App\Http\Models */ class UserBody extends Model { protected $relations = [ 'address' => AddressBody::class ]; /** * @SWG\Property( * description="User's email", * ) * @var string */ public $email; /** * @SWG\Property( * description="User's full name", * ) * @var string */ public $name; /** * @SWG\Property( * description="Address body", * ) * @var AddressBody */ public $address; }
从上面的内容可以看出,User现在与address相关联,其中address是嵌套属性。如果我们希望有一个更扁平的结构,我们也可以扩展模型。
最后,我们可以使用这些模型来替换原始的Request对象。
<?php declare(strict_types=1); /** * @SWG\Post( * path="/pixeloven/v1/user", * summary="Create user", * tags={"V1 User"}, * description="Create a new user", * operationId="createUser", * consumes={"application/json"}, * produces={"application/json"}, * @SWG\Parameter( * name="UserBody", * in="body", * description="User object", * required=true, * @SWG\Schema(ref="#/definitions/UserBody") * ), * @SWG\Response(ref="#/responses/201", response=201), * @SWG\Response(ref="#/responses/404", response=404), * @SWG\Response(ref="#/responses/422", response=422), * @SWG\Response(ref="#/responses/500", response=500) * ) * * @param UserBody $model */ public function createUser( UserBody $model, ) { $model->validate([ 'email' => ['required', 'string', 'email'], 'name' => ['required', 'string'], ]); $userEmail = $model->email; $userName = $model->name; $userAddress = $model->address; // ...
在这个特定的例子中,我们还在使用
darkaonline/swagger-lume
此包允许我们在请求模型旁边使用swagger注释。