Symfony: Anforderungsverarbeitung in der API

  • Tutorial
Bild

Ich denke, es ist kein Geheimnis für viele, dass die Form-Komponente nicht für die API geeignet ist.
Jeder erfindet sein eigenes Fahrrad, um es zu ersetzen. Ich habe beschlossen, eines dieser Fahrräder zu teilen. Ich gebe nicht vor, die „beste Entscheidung“ zu sein, aber wenn meine Entscheidung für jemanden nützlich ist oder wenn ich neues Wissen erhalte, wird sie sehr cool sein.

In unserer API wird jede Anfrage unter Verwendung eines Modells verarbeitet. Dabei spielt es keine Rolle, ob es sich um die Essenz einer Doktrin oder nur um eine Klasse handelt. Daher basiert die Lösung auf Anmerkungen in diesen Modellen.

Ein Modell könnte ungefähr so ​​aussehen:

Modellauflistung
city;
    }
    /**
     * @param mixed $value
     */
    public function setCity($value)
    {
        $this->city = $value;
        return $this;
    }
    /**
     * @return string
     */
    public function getQuery()
    {
        return $this->query;
    }
    /**
     * @param string $value
     */
    public function setQuery($value)
    {
        $this->query = $value;
        return $this;
    }
}


Annotation akzeptiert die folgenden Parameter:
- name (optionaler Parameter, Namensfeld in der Anforderung)
- type (optionaler Parameter, Feldtyp, mögliche Werte: string, integer, float, boolean, timestamp, array, entity, array_of_entity)
- groups (not Der erforderliche Parameter, der Gültigkeitsbereich der Anforderung, wird benötigt, wenn dasselbe Modell an verschiedenen Stellen, jedoch mit unterschiedlichen Feldern verwendet wird.)

Und nun, wie es in der Steuerung aussieht:

/** @var Request $request */
$request = $this->get('request');
$data = $request->getRealMethod() == 'GET' ? $request->query->all() : $request->request->all();
/** @var DataMapperManager $manager */
$manager = $this->get('data_mapper.manager');
$model = $manager
    ->setGroups($groups)
    ->setValidationGroups($validationGroups)
    ->setIsClearMissing($clearMissing)
    ->setIsValidate(true)
    ->handle($model, $data);


Der Manager selbst ordnet alle Daten dem Modell zu, führt die Validierung durch und löst eine Ausnahme aus, wenn sie nicht bestanden wird.

Wenn wir über die reale Verwendung sprechen, wird der gesamte Controller-Code an den Basis-Controller ausgegeben und im realen Action-Code wird er extrem klein:

public function createAction()
{
    $user = $this->getUser();
    $entity = $this->save($this->handleRequest(new Common\Entity\Blog\Post($this->getUser())));
    $this->getNotificationManager()->notifyModerators($entity);
    return $entity;
}


Projektcode:
- github: github.com/Troytft/data-mapper
- packagist: packagist.org/packages/troytft/data-mapper-bundle

Jetzt auch beliebt: