Appite – validace zanořené entity

Richard Faila
Člen | 36
+
0
-

Zdravím

Potřeboval jsem udělat api, tak jsem se rozhodl zkusit appite. Nemělo by to být nic složitého, pár endpoitů, ale bude muset zpracovávat a validovat velké json struktury.

Šel jsem podle dokumentace a zkusil udělat jednoduché vytvoření uživatele.

namespace App\Controllers;

use Apitte\Core\Annotation\Controller\Method;
use Apitte\Core\Annotation\Controller\Path;
use Apitte\Core\Annotation\Controller\Responses;
use Apitte\Core\Annotation\Controller\Response;
use Apitte\Core\Annotation\Controller\RequestBody;
use Apitte\Core\Annotation\Controller\Tag;
use Apitte\Core\Annotation\Controller\RequestParameter;
use Apitte\Core\Annotation\Controller\RequestParameters;
use Apitte\Core\Http\ApiRequest;
use Apitte\Core\Http\ApiResponse;
use App\Entity\Request\User;
use Apitte\Negotiation\Http\ArrayEntity;


/**
 * @Path("/user")
 */
final class UserController extends BaseV1Controller
{
	/**
	 * @Path("/create")
	 * @Method("POST")
	 * @RequestBody(entity="App\Entity\Request\User")
	 * @Responses({
	 *     @Response(code="200", description="Success"),
	 *     @Response(code="404", description="Not found")
	 * })
	 */
	public function create(ApiRequest $request, ApiResponse $response): ApiResponse
	{
		/** @var User $entity */
	    $entity = $request->getEntity();

		var_dump($entity);

		return $response
			->withStatus(ApiResponse::S200_OK)
			->withEntity(ArrayEntity::from($entity->toArray()));
	}

}

Vstup je

namespace App\Entity\Request;

use Apitte\Core\Mapping\Request\BasicEntity;
use Symfony\Component\Validator\Constraints as Assert;

final class User extends BasicEntity
{

    /**
     * @var string
     *
     * @Assert\NotBlank
     */
    public $name;

    /**
     * @var string
     *
     * @Assert\NotBlank
     */
    public $surname;

	/**
	 * @var Address
	 *
	 * @Assert\NotBlank
	 * @Assert\Type("App\Entity\Request\Address")
	 * @Assert\Valid
	 */
	public $address;
}

kde je zanořený objekt s adresou (samostatná třída pro další použití):

namespace App\Entity\Request;

use Apitte\Core\Mapping\Request\BasicEntity;
use Symfony\Component\Validator\Constraints as Assert;

final class Address extends BasicEntity
{
	/**
	 * @var string
	 * @Assert\NotBlank
	 */
	public $street;

	/**
	 * @var string
	 * @Assert\NotBlank
	 */
	public $city;
}

Jenže při pokusu o odeslání:

{
    "name": "John",
    "surname": "Doe",
    "address": {
        "street": "Browning street",
        "city": "London"
    }
}

Dostanu chybu:

{
    "status": "error",
    "data": {
        "code": 422,
        "error": "Request body contains an error. See context for details.",
        "context": {
            "validation": {
                "address": [
                    "This value should be of type App\\Entity\\Request\\Address."
                ]
            }
        }
    }
}

Pokud z adresy odeberu anotaci s typem, adresa se nevaliduje vůbec. Uniká mi něco? Dík moc.

Felix
Nette Core | 1163
+
0
-

To vypada jako vystup ze symfony/validator. Mohl bys napsat jake verze PHP a knihoven pouzivas?

A uplne idealni by bylo, nemohl bys pridat tuhle ukazku do skeletonu (https://github.com/…te-skeleton) Ja bych to pak mohl rovnou vyzkouset.

Richard Faila
Člen | 36
+
0
-

PHP 7.4, verze knihoven by měli být nejnovější, vše jsem stahoval přes composer require

{
	"name": "nette/web-project",
	"description": "Nette: Standard Web Project",
	"keywords": ["nette"],
	"type": "project",
	"license": ["MIT", "BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
	"require": {
		"php": ">= 7.4",
		"nette/application": "^3.1",
		"nette/bootstrap": "^3.1",
		"nette/caching": "^3.1",
		"nette/database": "^3.1",
		"nette/di": "^3.0",
		"nette/security": "^3.1",
		"nette/utils": "^3.2",
		"tracy/tracy": "^2.8",
		"contributte/apitte": "^0.9.1",
		"nettrine/annotations": "^0.7.0",
		"symfony/validator": "^5.4",
		"nettrine/cache": "^0.3.0",
		"contributte/validator": "^1.1"
	},
	"require-dev": {
		"nette/tester": "^2.3",
		"symfony/thanks": "^1"
	},
	"autoload": {
		"psr-4": {
			"App\\": "app"
		}
	},
	"minimum-stability": "stable",
	"config": {
		"allow-plugins": {
			"symfony/thanks": true
		}
	}
}

Na ten skeleton se podívám a pošlu odkaz na repo.