PHPackages                             itx/typo3-graphql - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. itx/typo3-graphql

ActiveTypo3-cms-extension[API Development](/categories/api)

itx/typo3-graphql
=================

This extension provides a GraphQL API for TYPO3 CMS

3.0.0(8mo ago)1980GPL-3.0-or-laterPHPPHP &gt;=8.2CI passing

Since Jul 12Pushed 8mo ago1 watchersCompare

[ Source](https://github.com/itx-informationssysteme/typo3-graphql)[ Packagist](https://packagist.org/packages/itx/typo3-graphql)[ Docs](http://www.itx.de)[ RSS](/packages/itx-typo3-graphql/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (7)Dependencies (8)Versions (10)Used By (0)

GraphQL TYPO3 Extension
=======================

[](#graphql-typo3-extension)

This extension provides a [GraphQL](https://graphql.org/) API for TYPO3. It does that by exposing the TYPO3 data models as a GraphQL schema.

Any table can be configured to be available in the API. The schema is fully configurable. The GraphQL API can be accessed via the `/graphql` endpoint.

> ⚠️ This extension is not fully feature complete yet. Expect things to be broken or not implemented yet.

✨ Features
----------

[](#-features)

- Automatic resolving of relations
- Link generation
- URL generation for images and files
- Filter and facets API
- Pagination
- Basic Languages support

What does not work yet?
-----------------------

[](#what-does-not-work-yet)

- Not every TCA field is supported yet.
- Language overlays don't work yet.
- There are probably other problems: Please create an issue if you find one or create a pull request.

🔨 Installation
--------------

[](#-installation)

`composer require itx/typo3-graphql`

After that, create an empty (but not hidden!) page with the URL `/graphql`

⚙️ Configuration
----------------

[](#️-configuration)

The extension uses two mechanisms to configure the GraphQL schema.

1. To configure the schema, put a `GraphQL.yaml` file into the `Configuration` directory of your extension or site package.
    - This file will be automatically loaded and merged with the configuration file of other extensions.
    - See the [example configuration](Configuration/GraphQL.example.yaml) for more details. It's works by default, which makes it a good starting point.
2. Inside the GraphQL.yaml file, you can define which Domain Model you want to expose, and if you want it to be queryable or not.
    - For each model, you can either use an existing one, or define a new one. You can see this as a "view" on the model.
    - The reason for this is, that you may not want to expose all fields of a model, or you may want to expose a model in a different way.
    - For each field in your custom model, you can define via the `@Expose` annotation, if you want to expose the field.
    - If you build custom models, for the sole purpose of exposing them via GraphQL, you can use the `@ExposeAll` annotation to expose all fields in the model. Use this with caution.
    - Make sure your model is also correctly registered in the Extbase Persistence Configuration. See the [extensions own persistence configuration](Configuration/Extbase/Persistence/Classes.php) for an example on how to do that.
    - Also make sure when overriding ObjectStorages, to include the correct ObjectStorage var Annotation with the correct Type.

> ⚠️ Every field you mark with `@Expose` or `@ExposeAll` will be publicly accessible in the GraphQL API.

💻 Usage
-------

[](#-usage)

The extension provides a `Query` type, which is the entry point for all queries. The `Query` type has a field for each model you configured to be queryable. Each configured model has a field to query multiple instances of the model, and a field to query a single instance of the model.

### 👀 Introspection

[](#-introspection)

GraphQL Introspection is enabled by default in development mode and disabled in production.

### ⚡ Filter API

[](#-filter-api)

The extension also comes with an extensive filter and facet system. Right now, it supports discrete filters and range filters.

There are two ways to configure filters:

- Via the backend in the TYPO3 backend
- Via the yaml configuration file The backend configuration could be useful if you need to assign some logic to the filters and need data to be editable in the backend. The yaml configuration file is static and can be used to configure filters that you know won't change. Both ways will be merged together at runtime.

#### Via the backend

[](#via-the-backend)

You can add filter records anywhere in the page tree. Each filter defines a name, the model it applies to, and the filter path to the field it applies to. The filter path is a dot separated list of field names. This means it is possible to use the Extbase Repository field path syntax to filter on model relations.

#### Via the yaml configuration file

[](#via-the-yaml-configuration-file)

You can also configure filters via the yaml configuration file. See the [example configuration](Configuration/GraphQL.example.yaml) for more details. The fields are the same as in the backend.

When you have configured the filters, you can use it in your GraphQL query like this:

Example query to query filter options without filtering:

```
postings(filters: { discreteFilters: [{ path: "locations.name", options: [] }] }) {
    facets {
        label
        options {
            value
            resultCount
            disabled
        }
        path
    }
    edges {
        node {
            title
        }
    }
}

```

The above query will return the filter options for the `locations.name` field of the Posting model.

If you want to apply one or more filter options you can use the `options` argument of the `discreteFilters` field.

Example querying with filtering:

```
postings(filters: { discreteFilters: [{ path: "locations.name", options: ["Testlocation"] }] }) {
    facets {
        ... on DiscreteFacet {
            label
            options {
                value
                resultCount
            }
            path
        }
    }
    edges {
        node {
            title
        }
    }
}

```

This will return the postings that have a location with the name `Testlocation`. You will also be able to notice that the filter options of other filters are filtered as well in order to be able to disable options that are not available to prevent impossible filter option combinations (e.g combinations that would return no results).

Currently there are three types of filters available:

- `DiscreteFilter` - This filter type allows you to select one or more options from a list of options.
- `RangeFilter` - This filter type allows you to select a range of values.
- `DateFilter` - This filter type allows you to select a range of datetimes in ATOM format

In the query above the filter options will be filtered as well in order to be able to disable options that are not available to prevent impossible filter option combinations. Whether a filter option will still get results or not is shown by the `disabled` field.

> Make sure to always have a filter record for the type of filter you want to use. Otherwise, the filter will not be available in the GraphQL API.

🪩 Events
--------

[](#-events)

### Extend the schema with custom virtual fields

[](#extend-the-schema-with-custom-virtual-fields)

The extension provides a few events to allow extensions to extend the schema. They are standard PSR-14 events, so you can [easily use them inside your own extension](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Events/EventDispatcher/Index.html#implementing-an-event-listener-in-your-extension). The events are:

1. `Itx\Typo3GraphQL\Events\CustomModelFieldEvent` - Allows you to add custom fields to a model.
2. `Itx\Typo3GraphQL\Events\CustomQueryFieldEvent` - Allows you to add custom fields to the `Query` type.
3. `Itx\Typo3GraphQL\Events\CustomQueryArgumentEvent` - Allows you to add custom arguments to a query field.
4. `Itx\Typo3GraphQL\Events\ModifyQueryBuilderForFilteringEvent` - Allows you to modify the query builder used for filtering.

Both work the same way. You can add a field to the schema by adding one or more `FieldBuilder` instances to the event. These provide the schema, as well as the resolver functions. See the [php-graphql docs](https://webonyx.github.io/graphql-php/schema-definition) for more information. For convenience, the extension uses the `simpod/graphql-utils` package, which provides a `FieldBuilder` class instead of configuration arrays.

The `build` method of the root field builders is called by the extension.

###  Health Score

40

—

FairBetter than 88% of packages

Maintenance62

Regular maintenance activity

Popularity19

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 68.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~54 days

Recently: every ~13 days

Total

9

Last Release

242d ago

Major Versions

1.0.2 → v11.x-dev2025-07-29

1.1.0 → 2.0.02025-07-29

2.0.1 → v12.x-dev2025-09-18

### Community

Maintainers

![](https://www.gravatar.com/avatar/ff61ce4c7201994aa438de7df8a257cd9baf181a7496634b19ebbfd0405c2bd3?d=identicon)[itx](/maintainers/itx)

---

Top Contributors

[![benjasper](https://avatars.githubusercontent.com/u/28984253?v=4)](https://github.com/benjasper "benjasper (91 commits)")[![paeddym](https://avatars.githubusercontent.com/u/128425620?v=4)](https://github.com/paeddym "paeddym (28 commits)")[![lstitx](https://avatars.githubusercontent.com/u/126770572?v=4)](https://github.com/lstitx "lstitx (10 commits)")[![itx-ole-mittelstaedt](https://avatars.githubusercontent.com/u/194095736?v=4)](https://github.com/itx-ole-mittelstaedt "itx-ole-mittelstaedt (3 commits)")[![itx-daniel-merkle](https://avatars.githubusercontent.com/u/195290390?v=4)](https://github.com/itx-daniel-merkle "itx-daniel-merkle (1 commits)")

---

Tags

apigraphqltypo3

###  Code Quality

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/itx-typo3-graphql/health.svg)

```
[![Health](https://phpackages.com/badges/itx-typo3-graphql/health.svg)](https://phpackages.com/packages/itx-typo3-graphql)
```

###  Alternatives

[fluidtypo3/vhs

This is a collection of ViewHelpers for performing rendering tasks that are not natively provided by TYPO3's Fluid templating engine.

1954.1M49](/packages/fluidtypo3-vhs)[typo3/testing-framework

The TYPO3 testing framework provides base classes for unit, functional and acceptance testing.

675.0M775](/packages/typo3-testing-framework)[netresearch/rte-ckeditor-image

Image support in CKEditor for the TYPO3 ecosystem - by Netresearch

63991.3k4](/packages/netresearch-rte-ckeditor-image)[worksome/graphlint

A static analysis tool for GraphQL

13189.4k](/packages/worksome-graphlint)[leuchtfeuer/secure-downloads

"Secure Download": Apply TYPO3 access rights to ALL file assets (PDFs, TGZs or JPGs etc. - configurable) - protect them from direct access.

22234.7k1](/packages/leuchtfeuer-secure-downloads)[eliashaeussler/typo3-form-consent

Extension for TYPO3 CMS that adds double opt-in functionality to EXT:form

1481.0k](/packages/eliashaeussler-typo3-form-consent)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
