Installation

Require PHPat with Composer:

composer require --dev phpat/phpat

Activate the extension using one of the following methods:

Automatic activation
composer require --dev phpstan/extension-installer
Manual activation
# phpstan.neon
includes:
    - vendor/phpat/phpat/extension.neon

Configuration

You will need to register your test classes in your PHPStan configuration:

# phpstan.neon
services:
    -
        class: Tests\Architecture\MyFirstTest
        tags:
            - phpat.test

⚠️ Your architecture tests folder should be included in the PHPStan analysed paths.

You can configure some PHPat options as follows:

# phpstan.neon
parameters:
    phpat:
        ignore_built_in_classes: true

See the complete list of options in the Configuration section.

Test definition

There are different Selectors available to select the classes involved in a rule, and a wide set of Assertions.

Here's an example test with a rule:

<?php

use PHPat\Selector\Selector;
use PHPat\Test\Builder\Rule;
use PHPat\Test\PHPat;
use App\Domain\SuperForbiddenClass;

final class MyFirstTest
{
    public function test_domain_does_not_depend_on_other_layers(): Rule
    {
        return PHPat::rule()
            ->classes(Selector::namespace('App\Domain'))
            ->shouldNotDependOn()
            ->classes(
                Selector::namespace('App\Application'),
                Selector::namespace('App\Infrastructure'),
                Selector::classname(SuperForbiddenClass::class),
                Selector::classname('/^SomeVendor\\\.*\\\ForbiddenSubfolder\\\.*/', true)
            )
            ->because('this will break our architecture, implement it another way! see /docs/howto.md');
    }
}

Usage

Run PHPStan as usual:

php vendor/bin/phpstan analyse -c phpstan.neon