반업주부의 일상 배움사

[PHP] Codeigniter 에 GraphQL 적용하기 본문

IT 인터넷/PHP

[PHP] Codeigniter 에 GraphQL 적용하기

Banjubu 2020. 10. 15. 20:02
반응형

 

컴포저로 GraphQL을 추가해요.

composer require webonyx/graphql-php

 

라우트 설정하고요.

$route['graphql'] = '/graphql_ctl';

 

controllers 폴더에 Graphql_ctl.php를 만들어요.

<?php defined('BASEPATH') OR exit('No direct script access allowed');

use GraphQL\Type\Definition\Type;

class Graphql_ctl extends Graphql_Controller
{
    //=====================================================
    //
    // Constructor
    //
    //=====================================================
    
    public function __construct()
    {
        parent::__construct();
    }
    
    //=====================================================
    //
    // Public Methods
    //
    //=====================================================
    
    /**
     * Painterus 홈페이지
     */
	public function index()
    {
		return [
			'echo'=>[
				'type'=> Type::string(),
				'args'=> [
					'message' => Type::nonNull(Type::string()),
				],
				'resolve'=> function($root, $args){
					return $root['prefix'] . $args['message'];
				}
			],
			'randomint'=>[
				'type'=>Type::int(),
				'args'=>[
					'min'	=> [
						'type'=>Type::int(),
						'defaultValue'=> 0
					],
					'max'	=> [
						'type'=>Type::int(),
						'defaultValue'=>10
					],
				],
				'resolve'=>function($root, $args){
					return rand(
						$args['min'],
						$args['max']
					);
				}
			]
		];
	}

	public function rootValue()
	{
		return ['prefix' => 'You said: '];
	}
}

 

core 에 파일을 만들어요.

require_once 'vendor/autoload.php';

class Graphql_Controller extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
        
        try{
            $queryType = new GraphQL\Type\Definition\ObjectType([
                'name'  => 'Query',
                'fields'=> $this->index(),
            ]);
            $schema = new GraphQL\Type\Schema([
                'query'=> $queryType
            ]);
            $query = ...POST로 받기
            $variableValues = ...POST로 받기
            $result = GraphQL\GraphQL::executeQuery($schema, $query, $this->rootValue(), NULL, $variableValues);
            $output = $result->jsonSerialize();
        } catch (Exception $e) {
            $output = [
                'errors' => [
                    [
                        'message'   => $e->getMessage(),
                        'code'      => $e->getCode()
                    ]
                ]
            ];
        } finally {
            $this
                ->output
                ->set_content_type('json')
                ->set_output(json_encode($output));
        }
    }

    public function rootValue()
    {
        return [];
    }
}

 

끝났어요. 포스트맨으로 호출해보죠. (https://~/graphql)

반응형
LIST
Comments