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 installWe ensure the code works and continues to work as expected with PHPUnit.
Run unit tests:
composer testSome 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 fixTernary 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 stanRegenerate the PHPStan baseline:
composer baselineWhen 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 benchWe document this library by rendering the Markdown files in docs with MkDocs.
You may propose changes to the docs via merge requests against the
masterbranch. Do not edit the generated HTML files in thegh-pagesbranch directly, they are automatically generated.
Generate the class reference docs:
composer docs