مرجع سريع

ورقة غش مكتبة Absinthe GraphQL في Elixir

دليل مرجعي سريع لمكتبة Absinthe GraphQL في Elixir و Phoenix: المخططات Schemas، المحللات Resolvers، الأنواع، الاستعلامات والطفرات.

· تاريخ النشر

Absinthe هي حزمة أدوات GraphQL المتكاملة لتطبيقات Elixir و Phoenix.

البداية السريعة والمفاهيم الأساسية (Core Concepts)

  • المخطط (Schema): التعريف الجذري للاستعلامات والطفرات والاشتراكات والأنواع.
  • المحلل (Resolver): دالة Elixir المسؤولة عن جلب البيانات أو تعديلها.
  • النوع (Type): يحدد البنية والحقول والقيود للكيانات المرجعة.

التكامل مع Plug في Phoenix

# web/router.ex
defmodule Blog.Web.Router do
  use Phoenix.Router

  forward "/api", Absinthe.Plug,
    schema: Blog.Schema
end

يعمل Absinthe كـ Plug يقبل إعدادات المخطط الجذري الخاص بك.


تعريف المخطط (Schema Definition)

# web/schema.ex
defmodule Blog.Schema do
  use Absinthe.Schema
  import_types Blog.Schema.Types

  query do
    @desc "Get a list of blog posts"
    field :posts, list_of(:post) do
      resolve &Blog.PostResolver.all/2
    end
  end
end

يستجيب هذا المخطط لطلب { posts { ... } }، ويعلن نوع الإرجاع كـ list_of(:post)، ويفوض التنفيذ للمحلل.

المحللات (Resolvers)

# web/resolvers/post_resolver.ex
defmodule Blog.PostResolver do
  def all(_args, _info) do
    {:ok, Blog.Repo.all(Blog.Post)}
  end
end

ترجع دوال المحلل إما {:ok, result} أو {:error, reason}.

الأنواع المخصصة (Custom Types)

# web/schema/types.ex
defmodule Blog.Schema.Types do
  use Absinthe.Schema.Notation

  @desc "A blog post entity"
  object :post do
    field :id, :id
    field :title, :string
    field :body, :string
  end
end

الاستعلامات والطفرات (Queries & Mutations)

معاملات الاستعلام

{
  user(id: "1") {
    name
    email
  }
}
# web/schema.ex
query do
  field :user, type: :user do
    arg :id, non_null(:id)
    resolve &Blog.UserResolver.find/2
  end
end
def find(%{id: id} = _args, _info) do
  case Blog.Accounts.get_user(id) do
    nil -> {:error, "User not found"}
    user -> {:ok, user}
  end
end

الطفرات (Mutations)

mutation CreatePost {
  post(title: "Hello World") {
    id
    title
  }
}
# web/schema.ex
mutation do
  @desc "Create a new post"
  field :post, type: :post do
    arg :title, non_null(:string)
    resolve &Blog.PostResolver.create/2
  end
end

مراجع ذات صلة

موضوعات ذات صلة