If your contribution requires significant or breaking changes, or if you plan to propose a major new feature, we recommend you to create an issue with a brief proposal and discuss it with us first.
For smaller contributions just use this workflow:
- Fork the project.
- Add your features and or bug fixes.
- Add tests to ensure your changes work and will continue working.
- Check your changes using
composer check
. - Add an entry to the Changelog's Unreleased section.
- Send a pull request.
git clone <your-fork-url>
cd graphql-php
composer install
We ensure the code works and continues to work as expected with PHPUnit.
Run unit tests:
composer test
Some tests have an annotation such as @see it('<description>')
.
It references a matching test in the graphql-js implementation.
When porting tests that utilize the dedent()
test utility from graphql-js
,
we instead use the PHP native nowdoc
syntax.
If the string contents are in a specific grammar, use an appropriate tag such as GRAPHQL
, PHP
or JSON
:
self::assertSomePrintedOutputExactlyMatches(
<<<'GRAPHQL'
type Foo {
bar: Baz
}
GRAPHQL,
$output
);
We format the code automatically with php-cs-fixer.
Apply automatic code style fixes:
composer fix
Ternary expressions must be spread across multiple lines.
$foo = $cond
? 1
: 2;
We cannot foresee every possible use case in advance, extending the code should remain possible.
Always use class member visibility protected
over private
.
Always use static::
over self::
for method calls to enable overriding of static class methods.
Prefer final
classes in tests, but never use them in src.
We validate code correctness with PHPStan.
Run static analysis:
composer stan
Regenerate the PHPStan baseline:
composer baseline
When control flow or native types are insufficient to convince the IDE or PHPStan that a value
is of a certain type, but you know it must be due to some invariant, you may assert its type.
Prefer assert()
for simple types and only use @var
for complex types:
function identity($value) { return $value; }
$mustBeInt = identity(1);
assert(is_int($mustBeInt));
/** @var array<string, int> $mustBeArrayOfStrings */
$mustBeArrayOfStringsToInts = identity(['foo' => 42]);
We benchmark performance critical code with PHPBench.
Check performance:
composer bench
We document this library by rendering the Markdown files in docs with MkDocs.
You may propose changes to the docs via merge requests against the
master
branch. Do not edit the generated HTML files in thegh-pages
branch directly, they are automatically generated.
Generate the class reference docs:
composer docs