Ich gehe davon aus, dass dies AppFactory\Core\Api\SettingInterface::get()
ein REST-Endpunkt ist. In diesem Fall müssen Sie in phpdoc-Kommentaren definieren, was dies zurückgeben soll. Der Magento REST-Handler nimmt diesen Wert und verarbeitet ihn, um alle unnötigen Daten zu entfernen. Was übrig bleibt, wird in JSON codiert, sodass Sie es in Javascript als bereits richtigen JS-Hash und nicht als json-codierten String abrufen können.
Der Trick bei diesen Endpunkten besteht darin, dass Sie sehr genau definieren müssen, was Sie zurückgeben möchten. Magento ist nicht in der Lage, etwas so Allgemeines wie "Array" zu verarbeiten, in dem Sie festlegen können, was Sie möchten.
In Ihrem Fall ist es einfacher, eine Schnittstelle zu erstellen, die Ihr Endpunkt zurückgibt, um nicht mit einer Reihe von Zeichenfolgen zu spielen.
<?php
namespace AppFactory\Core\Api;
/**
* @api
*/
interface SettingsInterface
{
/**
* @return Data\SettingsInterface
*/
public function get();
}
Wenn Sie nun eine Instanz eines Objekts zurückgeben, das diese Schnittstelle implementiert, liest Magento seine PHPDOCs und verarbeitet deren Rückgabewerte. Erstellen Sie nun eine Datei AppFactory\Core\Api\Data\SettingsInterface
wie folgt
<?php
namespace AppFactory\Core\Api\Data;
interface SettingsInterface
{
/**
* @return int[]
**/
public function getSettings();
/**
* @return string[]
**/
public function getExtra();
}
Wenn Sie nun eine tatsächliche Klasse erstellen, die diese AppFactory\Core\Api\SettingsInterface::get()
beiden get-Methoden implementiert, und Sie sie zurückgeben, gibt magento so etwas wie zurück
{
"settings": [1, 2, 5],
"extra": ["my","array","of","strings"]
}
Wenn Sie eine andere Ebene wünschen, müssen Sie eine andere Schnittstelle erstellen, die die settings
Struktur beibehält und als Rückgabewert für hinzufügt AppFactory\Core\Api\Data\SettingsInterface::getSettings()
.
Wenn Sie etwas benötigen, das dynamisch ist und Sie diese Strukturschnittstelle nicht vorbereiten möchten oder können, können Sie versuchen, eine json-codierte Zeichenfolge festzulegen und @return string
für eines der Felder zu platzieren. Auf diese Weise müssen Sie jedoch sicherstellen, dass Sie diese Zeichenfolge nach Erhalt der Antwort manuell dekodieren, da Ihre Antwort dann folgendermaßen aussieht:
{
"settings": [1, 2, 5],
"extra": "{\"test\":\"string\",\"value\":8}"
}
und um zu verwenden, müssen response.extra.test
Sie zuerst response.extra = JSON.parse(response.extra);
manuell tun