يبدوا أن سبب الخطأ كان إما في نسيان إنشاء نوع أو خطأ في تسجيله . فالexception يقول أن العائد من الدالة type داخل ملف ال queries ليس متوافق مع المتوقع فالأرجح هو أن الدالة الاخيرة تقوم باعادة null في حين أنها يجب أن تقوم بارجاع النوع المرادف للQuery التي يتم العمل عليها .
فطبقا للتوثيق الرسمي للحزمة على الجيت هب فان انشاءgraphql query يتطلب الخطوات التالية :
1 - أولاً ، تقوم بإنشاء نوع تريد إرجاعه من الاستعلام :
<?php
namespace App\GraphQL\Types;
use App\Item;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Type as GraphQLType;
class ItemType extends GraphQLType
{
protected $attributes = [
'name' => 'Item',
// لاحظ تعريف المودل في النوع
'description' => 'An Item of Graphql Type',
'model' => Item::class,
];
// يتطلب تعريف الحقول في النوع
public function fields()
{
return [
'id' => [
'type' => Type::nonNull(Type::int()),
'description' => 'The id of the item'
],
];
}
public function resolve($root, $args)
{
return Item::findOrFail($args['id']);
}
}
2 - ثم تحتاج الى اضافة النوع المنشئ حديثا و تسجيله .
اما باضافته مباشرة الى المخطط الخاص بك schemas :
<?php
'schemas' => [
'default' => [
// ...
'types' => [
App\GraphQL\Types\ItemType::class,
],
او اضافته بشكل عام globally في ملف الاعداد graphql.php :
<?php
..
'types' => [
App\GraphQL\Types\ItemType::class,
],
او باستعمال الواجهة GraphQL :
<?php
GraphQL::addType(\App\GraphQL\Types\ItemType::class);
3 - الان وبعد اضافة النوع يمكنك انشاء الqueries الخاصة بك والتي تنتمي لهذا النوع على هذا النحو :
<?php
namespace App\GraphQL\Queries;
use Closure;
use App\Item;
use Rebing\GraphQL\Support\Facades\GraphQL;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Query;
class ItemsQuery extends Query
{
protected $attributes = [
'name' => 'items',
];
public function type() // يجب أن تعيد instance من Type المرافق
{
return Type::nonNull(Type::listOf(Type::nonNull(GraphQL::type('Item'))));
}
public function args()
{
return [
'id' => [
'name' => 'id',
'type' => Type::int(),
'rules' => ['required']
],
];
}
public function resolve($root, $args, $context, ResolveInfo $resolveInfo, Closure $getSelectFields)
{
return Item::findOrFail($args['id']);
}
}
4 - يتبقى فقط تسجيل الQuery المنشئة حديثا بملف الاعداد graphql.php :
<?php
..
'schemas' => [
'default' => [
'query' => [
App\GraphQL\Queries\ItemsQuery::class
],
// ...
]
]
و الان المفروض كل شيء سيعمل بشكل سليم .