pixeloven/framework

简单的Laravel请求模型扩展库

2.0.0 2021-09-24 19:45 UTC

This package is auto-updated.

Last update: 2024-09-30 01:16:30 UTC


README

Build Status Donate

一个用于扩展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注释。