maxxxam / graphql-yii
GraphQL, yii2 lib
Requires
- php: >=5.5.9
- illuminate/support: 5.1.*|5.2.*|5.3.*|5.4.*
- webonyx/graphql-php: 0.9.*
This package is auto-updated.
Last update: 2025-01-28 09:55:37 UTC
README
Данное расширение позволяет реализовать GraphQL API в Yii2. Расширение основано на расширении GraphQL webonyx. Более подробная информация о GraphQL - GraphQL Introduction.
Установка
Зависимости:
1- Установка пакета через Composer. Добавьте следующий код в файл composer.json
.
{ "require": { "maxxxam/graphql": "~0.2" } }
2- Запустите установку пакетов Composer
$ composer install
или обновите вместе с существующими пакетами
$ composer update
Yii2
1- Добавьте компонент в config/main.php
file
'graphql' => [ 'graphql' => require(__DIR__ . DIRECTORY_SEPARATOR . 'require' . DIRECTORY_SEPARATOR . 'graphql.php') ],
2- Переместите config ./src/config/require
в common/config/require
. Отредактируйте конфигурацию согласно вашему окружению.
Объекты Types, Queries, Mutations могут быть загружены вручную (заданием в конфигурации), либо автоматически из заданных директорий.
Пример конфигурации graphql.php
приведен ниже:
$appNamespace = 'app\modules\graphql'; $graphqlDir = dirname(dirname(__DIR__)) . '/modules/graphql'; return [ 'class' => 'GraphQLYii\GraphQL', 'namespace' => $appNamespace, 'graphqlDir' => $graphqlDir, 'types' => [ 'UserType' => $appNamespace . '\types\UserType', 'AccessType' => $appNamespace . '\types\AccessType', 'ImageType' => $appNamespace . '\types\ImageType', 'EventType' => $appNamespace . '\types\EventType', 'TrophyType' => $appNamespace . '\types\TrophyType', 'TeamType' => $appNamespace . '\types\TeamType', 'AlbumType' => $appNamespace . '\types\AlbumType', 'FriendType' => $appNamespace . '\types\FriendType', 'SportType' => $appNamespace . '\types\SportType', ], 'queries' => [ 'UsersQuery' => $appNamespace . '\query\user\UsersQuery', 'UserQuery' => $appNamespace . '\query\user\UserQuery' ], 'mutations' => [ 'AddFriendMutation' => $appNamespace . '\mutation\user\AddFriendMutation', 'RemoveFriendMutation' => $appNamespace . '\mutation\user\RemoveFriendMutation', 'SignupMutation' => $appNamespace . '\mutation\user\SignupMutation', ], 'typesPath' => '/types', 'queriesPath' => '/queries', 'mutationsPath' => '/mutations', 'subscriptionPath' => '/subscription', ];
3- Создайте новый action для обработки пользовательского запроса
public function actionIndex(){ Yii::$app->response->format = Response::FORMAT_JSON; $data = Yii::$app->request->post(); $query = isset($data['query']) ? str_replace(["\r","\n"], "", $data['query']) : null; $params = isset($data['variables']) ? str_replace(["\r","\n"], "", $data['variables']) : null; /** @var GraphQL $GraphQL */ $GraphQL = \Yii::$app->get('graphql'); $result = $GraphQL->query($query, $params); if (!empty($result['errors'])){ Yii::$app->response->setStatusCode(400); } Yii::$app->response->headers->add('Content-Length', strlen(json_encode($result))); Yii::$app->response->headers->add('Content-Type', 'application/json'); $stream = fopen('php://memory','wb'); fwrite($stream, json_encode($result)); rewind($stream); Yii::$app->response->stream = $stream; Yii::$app->response->send(); return true; }
4- В качестве авторизации используется oAuth2 сервер Filsh/yii2-oauth2-server
5- Добавьте поведение в Controller
public function behaviors() { Yii::$app->controller->enableCsrfValidation = false; return ArrayHelper::merge(parent::behaviors(), [ 'authenticator' => [ 'class' => CompositeAuth::className(), 'authMethods' => [ ['class' => HttpBearerAuth::className()], ['class' => QueryParamAuth::className(), 'tokenParam' => 'accessToken'], ] ], 'exceptionFilter' => [ 'class' => ErrorToExceptionFilter::className() ], ]); }