Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Laravel 5.7 + GraphQL(ScalarType編)

LaravelとGraphQLでAPI開発こちらの記事の続きです。

シリーズ記事

GraphQLのスカラー型

Folkloreatelier/laravel-graphqlに標準で組み込まれているスカラー型はID、String、Int、Float、Booleanの5種類しかありません。
日付型(DateTime)をGraphQLで表示するために自分でカスタムスカラー型を定義します。

$ php artisan make:graphql:scalar DateTimeType

app/GraphQL/Scalars/DateTimeType.php

<?php

declare(strict_types = 1);

namespace App\GraphQL\Scalars;

use Folklore\GraphQL\Support\Contracts\TypeConvertible;
use GraphQL\Type\Definition\ScalarType;
use DateTime;

class DateTimeType extends ScalarType implements TypeConvertible
{
    /**
     * @var string
     */
    public $name = 'DateTimeType';

    /**
     * @var string
     */
    public $description = 'DateTime scalar type';

    /**
     * @param mixed $value
     * @return mixed
     */
    public function serialize($value) : DateTime
    {
        return $value;
    }

    /**
     * @param mixed $value
     * @return string
     */
    public function parseValue($value) : string
    {
        return $value;
    }

    /**
     * @param $ast
     * @return null|string
     */
    public function parseLiteral($ast) : ?string
    {
        return null;
    }

    /**
     * @return DateTimeType
     */
    public function toType() : DateTimeType
    {
        return new static();
    }
}

強い型付けを追加しただけで、コードの挙動はひな形のままです。

config/graphql.php

    'types' => [
        App\GraphQL\Type\UserType::class,
        // custom scalar type
        App\GraphQL\Scalars\DateTimeType::class,
    ],

作成したスカラー型クラスを登録します。

app/GraphQL/Type/UserType.php

    public function fields() : array
    {
        return [
            // ... 省略
            'created_at' => [
                'type' => GraphQL::type('DateTimeType'),
                'description' => 'The created_at of user',
            ],
            'updated_at' => [
                'type' => GraphQL::type('DateTimeType'),
                'description' => 'The updated_at of user',
            ],
        ];
    }

UserTypeクラスの fields 関数にDateTime型のカラムを追加します。

動作確認

{
  user {
    id
    name
    created_at
    updated_at
  }
}

queryを実行します。

{
  "data": {
    "user": {
      "id": "1",
      "name": "Maximus Bechtelar",
      "created_at": {
        "date": "2018-10-13 09:13:29.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "updated_at": {
        "date": "2018-10-13 09:13:29.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      }
    }
  }
}

とこんな感じでDateTimeの値を取得できます。

UnixTimeを返したい

app/GraphQL/Scalars/DateTimeType.php

    public function serialize($value) : int
    {
        return (int)$value->format('U');
    }

serialize関数で DateTime 型を返していたところを UnitTime に変換して int 型で返します。

{
  user {
    id
    name
    created_at
    updated_at
  }
}

同じqueryを発行します。

{
  "data": {
    "user": {
      "id": "1",
      "name": "Maximus Bechtelar",
      "created_at": 1539422009,
      "updated_at": 1539422009
    }
  }
}

UnixTime が返ってきます。
シンプルに書けて良き😊

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?