Tôi giả sử rằng đó AppFactory\Core\Api\SettingInterface::get()
là một điểm cuối REST. Trong trường hợp đó trong các bình luận phpdoc, bạn cần xác định cái này sẽ trả về cái gì. Trình xử lý Magento REST sẽ lấy giá trị đó và xử lý nó để loại bỏ tất cả dữ liệu không cần thiết. Những gì còn lại sẽ được mã hóa thành JSON để trong javascript, bạn có thể truy xuất nó dưới dạng băm JS đã được mã hóa đúng và không phải là chuỗi được mã hóa json.
Mẹo về những điểm cuối đó là bạn cần xác định chính xác những gì bạn sẽ trả lại. Magento sẽ không thể xử lý một cái gì đó chung chung như "mảng" nơi bạn sẽ đặt bất cứ thứ gì bạn thích.
Trong trường hợp của bạn, để không thử chơi với một chuỗi các chuỗi, việc tạo giao diện mà điểm cuối của bạn sẽ trở lại sẽ dễ dàng hơn.
<?php
namespace AppFactory\Core\Api;
/**
* @api
*/
interface SettingsInterface
{
/**
* @return Data\SettingsInterface
*/
public function get();
}
Bây giờ khi bạn trả về một thể hiện của một đối tượng triển khai giao diện đó, Magento sẽ đọc phpdocs của nó và sẽ xử lý các giá trị trả về của chúng. Bây giờ tạo một tập tin AppFactory\Core\Api\Data\SettingsInterface
như sau
<?php
namespace AppFactory\Core\Api\Data;
interface SettingsInterface
{
/**
* @return int[]
**/
public function getSettings();
/**
* @return string[]
**/
public function getExtra();
}
Bây giờ khi bạn tạo lớp thực tế sẽ thực hiện 2 phương thức get đó và bạn sẽ trả về nó AppFactory\Core\Api\SettingsInterface::get()
sau đó magento sẽ trả về một cái gì đó như
{
"settings": [1, 2, 5],
"extra": ["my","array","of","strings"]
}
Nếu bạn muốn một cấp độ khác, bạn cần tạo một giao diện khác sẽ giữ settings
cấu trúc và thêm nó làm giá trị trả về cho AppFactory\Core\Api\Data\SettingsInterface::getSettings()
.
Nếu bạn cần phải có thứ gì đó năng động và bạn không muốn hoặc không thể chuẩn bị giao diện cấu trúc này thì bạn có thể thử đặt chuỗi mã hóa json và đặt @return string
cho bất kỳ trường nào. Tuy nhiên, theo cách này, bạn sẽ phải đảm bảo giải mã chuỗi đó theo cách thủ công sau khi nhận được phản hồi vì khi đó phản hồi của bạn sẽ như thế này:
{
"settings": [1, 2, 5],
"extra": "{\"test\":\"string\",\"value\":8}"
}
và để sử dụng, response.extra.test
trước tiên bạn sẽ phải làm response.extra = JSON.parse(response.extra);
thủ công