Engineering of FISM
FISMのテックな話をしよう
https://www.wantedly.com/feed/s/fism_engineering
こんにちは!FISM採用広報担当です!
今週も始まりました。
企画開発メンバーによる特別連載「Engineering of FISM」の時間です。
先週に引き続き今週も、企画開発メンバーで執筆しました「Laravel + Vue.jsではじめる 実践 GraphQL入門」の全貌を大公開します!
今回は、note第4弾!
「GraphQL + Laravelでバックエンドを開発!(ログイン機能・ツイート機能)編」です。
せっかくですので、ほんの少しだけ中身を公開致します。
本当に、少しだけですよ。それでは、どうぞご覧くださいませ!
作成済みのアカウント情報を使ってログインする機能を実装します。
ログインで使用するミューテーションを作成します。
$ touch graphql/Mutations/Login.graphql
上記のコマンドを実行してファイルを作成し、次の内容を設定してください。
extend type Mutation { # ①
Login( # ②
email: String @rules(apply: ["required", "email"])
password: String @rules(apply: ["required", "max:16"])
): Token @field(resolver: "LoginResolver@resolve") # ③
}
2つ目以降のMutationを定義する際には extend を設定します(①)。
ログインにはメールアドレスとパスワードを使用します。(②)
Loginミューテーションはリゾルバーとして LoginResolver を使用し、 Token タイプを返却します(③)。
それではartisanコマンドを使って LoginResolver を生成しましょう。
$ php artisan lighthouse:mutation LoginResolver
ログインリゾルバーの実装は下記の通りです。
<?php
namespace App\GraphQL\Mutations;
use Carbon\Carbon;
use GraphQL\Type\Definition\ResolveInfo;
use Illuminate\Auth\AuthManager;
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
class LoginResolver
{
/**
* Return a value for the field.
*
* @param null $rootValue Usually contains the result returned from the parent field. In this case, it is always `null`.
* @param array $args The arguments that were passed into the field.
* @param GraphQLContext|null $context Arbitrary data that is shared between all fie lds of a single query.
* @param ResolveInfo $resolveInfo Information about the query itself, such as the e xecution state, the field name, path to the field from the root, and more.
*
* @return mixed
*/
public function resolve($rootValue, array $args, GraphQLContext $context, ResolveInf o $resolveInfo)
{
$authManager = app(AuthManager::class);
/** @var \Tymon\JWTAuth\JWTGuard $guard */
$guard = $authManager->guard('api');
$token = $guard->attempt([
'email' => $args['email'],
'password' => $args['password'],
]);
if ($token) {
/** @var \App\Models\Account $account */
$account = auth()->user();
$account->logged_in_at = Carbon::now();
$account->save();
}
return [
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => $guard->factory()->getTTL() * 60,
];
}
}
ログイン処理が用意できたので、Playgroundを使って動作を確認します。
リクエストを入力して実行してみま・・・
ちょっと厳しいみたいですので、続きは大橋noteにて大公開しております。
来週も木曜日に更新いたします!乞うご期待ください!
現在FISMでは、絶賛開発メンバーを募集しています。
GraphQL × Laravel + Vue.js + Swift で開発できるのはFISMだけ!
エントリーお待ちしています!