LoginSignup
3

More than 3 years have 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 が返ってきます。
シンプルに書けて良き😊

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3