Add-Presenter

Der Add-Presenter \Alvine\Application\Web\Presenter\Data\Add ist von \Alvine\Application\Web\Presenter\Data\Object abgeleitet und stellt Methoden für die bearbeitung von POST Anfragen bereit. Für die DELETE, GET, HEAD, PUT und PATCH Methoden ist ein eigener Object-Presenter verantwortlich.

Die Steuerung, welcher View zur Anwendung kommt, erfolgt über den vom Client mitgesendeten Accept-Header. Hier ist entweder application/json oder text/html möglich. Für die HTML-Ausgabe ist der Standardview des Presenters - wenn keiner über die Konfiguration angegeben wird - die von der Methode Object::getDefaultViewClass() zurückgegebene Klasse.

Der View kann auch über die Konfiguration in der Route definiert werden.

Hinweis

Sie müssen sicherstellen das Ihr View das Interface \Alvine\Application\Web\View\InstanceFromContainer implementiert.

Objekt hinzufügen

Über die POST Anfrage können ein oder mehrere Objekte hinzugefügt werden. Als Ergebnis wird entweder der Status 204 No Content oder wenn JSON unterstützt wird ein Array mit dem Ergebnis zurück gegeben. Über den Parameter whatif kann die Anfrage simuliert werden.

Parmater Beschreibung
whatif Anfrage nur flüchtig, ohne echte Aktion durchführen

Wird in der Route eine Redirect-URL definiert, so wird diese bei der Änderung eines Datensatzes per Location Header an den Client übergeben. Bei der Rückgabe von JSON oder mehreren Änderungen ist die Location in der Antwort enthalten.

In dem folgenden Beispiel werden die zwei Datensätze hinzugefügt.

curl --request POST \
  --url 'http://example.com/api/object' \
  --header 'accept: application/json' \
  --header 'content-type: application/json' \
  --data '{
    "dataset": [
        {
            "name": "Neuer Name",
        },
        {
            "flag":2,
        }
    ]
}'

Im Erfolgsfall ist das Ergebnis folgendes JSON

{
  "dataset": [
    {
      "dataset": {
        "id": 2,
        "name": "Neuer Name",
        "flag": 5,
      },
      "sys": {
        "created": "2017-10-21T16:15:35",
        "message": "200 OK",
        "code": 200
      }
    },
    {
      "dataset": {
        "id": 5,
        "name": "Alter Name",
        "flag": 2,
      },
      "sys": {
        "created": "2017-10-21T16:15:35",
        "message": "200 OK",
        "code": 200
      }
    }
  ]
}

In diesem Beispiel wurde ein Datensatz geändert und beim zweiten Datensatz ist ein Fehler aufgetreten (die angegebene ID gibt es nicht; 404).

{
    "dataset": [
        {
            "dataset": {
              "id": 5,
              "name": "Alter Name",
              "flag": 2,
            },
            "sys": {
                "updated": "2017-10-21T16:30:31",
                "message": "200 OK",
                "code": 200,
                "location": ""
            }
        },
        {
            "sys": {
                "error": {
                    "code": 404,
                    "message": "404 Not Found"
                }
            }
        }
    ],
    "sys": {
        "error": {
            "code": 400,
            "message": "400 Bad Request"
        }
    }
}

Werden keine oder falsche Daten übertragen, so wird folgende Fehlermeldung zurückgegeben:

{
    "sys": {
        "error": {
            "code": 400,
            "message": "400 Bad Request"
        }
    }
}

Konfiguration der Route

Objekte können über folgende Konfiguration verarbeitet werden. Wichtig ist hier, dass der Parameter dataset definiert ist.

<route id="ROUTE-ID-ADD">
    <method>POST</method>
    <presenter>MyPresenter</presenter>
    <pattern><![CDATA[^\/api\/object$]]></pattern>
    <template><![CDATA[/api/object]]></template>
    <parameters>
        <parameter name="dataset" type="ArrayType" />
    </parameters>
    <configuration>
        <model>  <!-- Klassenname des Models -->
            <class>MyModel</class>    
        </model>
    </configuration>
</route> 

Ein Redirect kann über den Linksbereich in der Route definiert werden.

<route id="ROUTE-ID-ADD">
    ...
    <links> 
        <!-- die ID der anzuwendende Route und die Relation "redirect" -->
        <link route="ROUTE-ID-UPDATE" relation="redirect" />
    </links>
</route>