laravel - 用户通过身份验证时如何在 API 响应中包含额外数据

标签 laravel laravel-5.8

我正在创建一个项目,用户可以使用闪存卡进行学习。我有一个 API,用户可以从中检索一副纸牌。未通过身份验证的用户仍然可以检索牌组,但其学习进度不会存储在数据库中。

我希望经过身份验证的用户在从 API 检索闪存卡时在响应中接收额外的数据。更具体地说,每张卡片都应该有一个额外的“study_at”字段,其中包含下次学习该卡片的日期。

“study_at”日期存储在名为“card_user”的数据透视表中。

我尝试修改 Card 模型上的 toArray() 方法,但我不知道这是否是正确的方法。

这是 API 端点:

Route::get('/decks', 'DecksController@index');

DecksController

class DecksController extends Controller
{
    public function index()
    {
        $decks = Deck::all();

        return new DeckCollection($decks);
    }

套牌集合

class DeckCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}

甲板资源

class DeckResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'cards' => new CardCollection($this->cards),
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

卡片收藏

class CardCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}

卡片资源

这是我想包含“study_at”日期的位置

class CardResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'front' => $this->front,
            'back' => $this->back,
            // Include 'study_at' date here
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

这是我希望经过身份验证的用户收到的响应:

{
    "id": 1,
    "name": "Coffee Break French",
    "cards": [
        {
            "id": 1,
            "front": "Good morning",
            "back": "Bonjour",
            "study_at": "2019-05-26T15:00:00.000000Z"
            "created_at": "2019-04-14T21:04:05.000000Z",
            "updated_at": "2019-04-14T21:04:05.000000Z"
        },
        {
            "id": 2,
            "front": "Good afternoon",
            "back": "Bonne après-midi",
            "study_at": "2019-05-26T15:00:00.000000Z"
            "created_at": "2019-04-14T21:04:21.000000Z",
            "updated_at": "2019-04-14T21:04:21.000000Z"
        },
        {
            "id": 3,
            "front": "My name is John",
            "back": "Je m'appelle John",
            "study_at": "2019-05-26T15:00:00.000000Z"
            "created_at": "2019-04-14T21:04:37.000000Z",
            "updated_at": "2019-04-14T21:04:37.000000Z"
        }
    ],
    "created_at": "2019-04-14T21:03:38.000000Z",
    "updated_at": "2019-04-14T21:03:38.000000Z"
}

最佳答案

要仅在特定条件下包含属性,您应该使用 conditional attributes :

class CardResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'front' => $this->front,
            'back' => $this->back,
            // Include 'study_at' date here
            'study_at' => $this->when(auth()->user(), $this->study_at), // Retrieve your value through eloquent relation
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

关于laravel - 用户通过身份验证时如何在 API 响应中包含额外数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55731378/

相关文章:

php - 在没有 httponly 标志的情况下创建的 Cookie XSRF-TOKEN - Laravel 5.8

javascript - 使用 React JS 和 Laravel 处理多张图片上传

php - Laravel 5.8 重定向错误,未显示消息

php - HTTP 500 错误 这很奇怪......网站无法显示此页面 Laravel

php - 计算 Laravel 中的远程关系总数(急切加载?)

php - 尝试使用 Laravel 5.8 向我的 slack 发送通知时出错

php - Laravel5.8 模型绑定(bind)路由 Arg 1 传递的必须是 Model 的实例

php - 如何在不使用 laravel 中的连接关系的情况下通过 Eloquent 查询进行排序?

php - 自动替换服务器端 mysql 数据库转储中的用户密码 (Laravel)

laravel - NGINX Google Compute Engine 中从 Http 重定向到 https 的问题