GraphQL در لاراول
GraphQL یک زبان کوئری نویسی برای کار با API ها و همچنین یک محیط اجرایی سمت سرور برای اجرای کوئری ها توسط type system هایی است که شما تعریف کرده اید.این نوع api به هیچ نوع پایگاه داده یا موتور ذخیره سازی وابسته نیست و بجای آن از همان کدهایی که نوشته ایم استفاده می کنه.
برای یکپارچه کردن لاراول با GraphQL اول این پکیج رو نصب میکنیم :
composer require rebing/graphql-laravel
- Query : برای دریافت داده ها استفاده می شود .
- Typeها : برای تعریف نوع فیلدهای query استفاده می شود. Typeها به ما کمک می کنند تا نوع فیلدهای نتایجی که از اجرای یک کوئری بدست می آید را فرمت بندی کنیم. برای مثال نوع های بولین، رشته ای، اعشاری و اعداد صحیح و … . همچنین می توانیم نوع های سفارشی تعریف کنیم.
- Mutation ها : این پوشه شامل Classهایی میشود که عملیات insert، update و delete را مدیریت میکنند.
<?php namespace App\GraphQL\Query; use App\User; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Support\Query; use Rebing\GraphQL\Support\SelectFields; class UsersQuery extends Query { protected $attributes = [ 'name' => 'Users Query', 'description' => 'A query of users' ]; public function type() { // result of query with pagination laravel return GraphQL::paginate('users'); } // arguments to filter query public function args() { return [ 'id' => [ 'name' => 'id', 'type' => Type::int() ], 'email' => [ 'name' => 'email', 'type' => Type::string() ] ]; } public function resolve($root, $args, SelectFields $fields) { $where = function ($query) use ($args) { if (isset($args['id'])) { $query->where('id',$args['id']); } if (isset($args['email'])) { $query->where('email',$args['email']); } }; $user = User::with(array_keys($fields->getRelations())) ->where($where) ->select($fields->getSelect()) ->paginate(); return $user; } }
<?php namespace App\GraphQL\Type; use App\User; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Support\Type as GraphQLType; class UsersType extends GraphQLType { protected $attributes = [ 'name' => 'Users', 'description' => 'A type', 'model' => User::class, // define model for users type ]; // define field of type public function fields() { return [ 'id' => [ 'type' => Type::nonNull(Type::int()), 'description' => 'The id of the user' ], 'email' => [ 'type' => Type::string(), 'description' => 'The email of user' ], 'name' => [ 'type' => Type::string(), 'description' => 'The name of the user' ], // field relation to model user_profiles 'user_profiles' => [ 'type' => GraphQL::type('user_profiles'), 'description' => 'The profile of the user' ] ]; } protected function resolveEmailField($root, $args) { return strtolower($root->email); } }
<?php /** * Created by PhpStorm. * User: ardani * Date: 8/4/17 * Time: 10:02 AM */ namespace App\GraphQL\Mutation; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Support\Mutation; use App\User; class NewUserMutation extends Mutation { protected $attributes = [ 'name' => 'NewUser' ]; public function type() { return GraphQL::type('users'); } public function args() { return [ 'name' => [ 'name' => 'name', 'type' => Type::nonNull(Type::string()) ], 'email' => [ 'name' => 'email', 'type' => Type::nonNull(Type::string()) ], 'password' => [ 'name' => 'password', 'type' => Type::nonNull(Type::string()) ], 'first_name' => [ 'name' => 'first_name', 'type' => Type::nonNull(Type::string()) ], 'last_name' => [ 'name' => 'last_name', 'type' => Type::string() ], 'avatar' => [ 'name' => 'avatar', 'type' => Type::string() ] ]; } public function resolve($root, $args) { $args['password'] = bcrypt($args['password']); $user = User::create($args); if (!$user) { return null; } $user->user_profiles()->create($args); return $user; } }
و در نهایت تغییرات رو در فایل config/graphql.php اعمال میکنیم .