Skip to content

Команды ​

Запуск команд приложения прямо из панели отладки — тесты, статический анализ и скрипты Composer.

Команды

Встроенные команды ​

Встроенные команды обнаруживаются автоматически. Если инструмент установлен, команда появляется автоматически — настройка не требуется.

Статический анализ ​

КомандаИнструментАвтоопределение
analyse/psalmPsalmvimeo/psalm в Composer
analyse/phpstanPHPStanphpstan/phpstan в Composer
analyse/magoMagocarthage-software/mago в Composer или бинарный файл mago в PATH

Тестирование ​

КомандаИнструментАвтоопределение
test/phpunitPHPUnitphpunit/phpunit в Composer
test/codeceptionCodeceptioncodeception/codeception в Composer
test/pestPestpestphp/pest в Composer
test/testoTestotesto/testo в Composer

Прочее ​

КомандаИсточникОписание
composer/*composer.jsonВсе записи scripts автоматически обнаруживаются как composer/{scriptName}

Как это работает ​

Команды обнаруживаются из трёх источников:

  1. Встроенные команды — Все команды анализа и тестирования из таблицы выше. Каждая команда имеет проверку isAvailable(); недоступные команды скрываются автоматически.
  2. Пользовательские команды — Дополнительные команды, зарегистрированные через конфигурацию адаптера (commandMap).
  3. Скрипты Composer — Все записи scripts из composer.json доступны как команды composer/{scriptName}.

Нажмите кнопку команды для выполнения. Вывод отображается в диалоговом окне с индикацией статуса.

Создание пользовательских команд ​

Реализуйте CommandInterface для создания пользовательской команды:

php
<?php

declare(strict_types=1);

namespace App\Debug\Command;

use AppDevPanel\Api\Inspector\CommandInterface;
use AppDevPanel\Api\Inspector\CommandResponse;
use AppDevPanel\Api\PathResolverInterface;
use Symfony\Component\Process\Process;

class MyLinterCommand implements CommandInterface
{
    public const COMMAND_NAME = 'analyse/my-linter';

    public function __construct(
        private readonly PathResolverInterface $pathResolver,
    ) {}

    public static function isAvailable(): bool
    {
        return \Composer\InstalledVersions::isInstalled('vendor/my-linter');
    }

    public static function getTitle(): string
    {
        return 'My Linter';
    }

    public static function getDescription(): string
    {
        return 'Run custom linter on the project';
    }

    public function run(): CommandResponse
    {
        $process = new Process(['vendor/bin/my-linter', 'check']);
        $process->setWorkingDirectory($this->pathResolver->getRootPath())
            ->setTimeout(null)
            ->run();

        $output = rtrim($process->getOutput());

        if ($process->getExitCode() > 1) {
            return new CommandResponse(
                status: CommandResponse::STATUS_FAIL,
                result: null,
                errors: array_filter([$output, $process->getErrorOutput()]),
            );
        }

        return new CommandResponse(
            status: $process->isSuccessful()
                ? CommandResponse::STATUS_OK
                : CommandResponse::STATUS_ERROR,
            result: $output,
        );
    }
}

CommandInterface ​

php
interface CommandInterface
{
    public static function isAvailable(): bool; // Return false to hide the command
    public static function getTitle(): string;  // Display name in the panel
    public static function getDescription(): string;
    public function run(): CommandResponse;
}

CommandResponse ​

СтатусЗначение
okКоманда выполнена успешно
errorКоманда выполнилась, но обнаружила проблемы (например, найдены ошибки линтера)
failКоманда не смогла выполниться (например, бинарный файл не найден, сбой)

Регистрация пользовательских команд ​

Пользовательские команды регистрируются через параметр commandMap. Встроенные команды всегда включены — commandMap только добавляет дополнительные.

Yii 3 ​

В параметрах приложения (config/params.php):

php
return [
    'app-dev-panel/yii3' => [
        'api' => [
            'commandMap' => [
                'analyse' => [
                    'analyse/my-linter' => \App\Debug\Command\MyLinterCommand::class,
                ],
            ],
        ],
    ],
];

Зарегистрируйте зависимости в конфигурации DI, если команде нужна инъекция через конструктор:

php
\App\Debug\Command\MyLinterCommand::class => static fn(
    \AppDevPanel\Api\PathResolverInterface $pathResolver,
) => new \App\Debug\Command\MyLinterCommand($pathResolver),

Symfony ​

В вашем config/packages/app_dev_panel.yaml:

yaml
services:
    App\Debug\Command\MyLinterCommand:
        arguments:
            - '@AppDevPanel\Api\PathResolverInterface'

Переопределите CommandController для передачи commandMap:

yaml
services:
    AppDevPanel\Api\Inspector\Controller\CommandController:
        arguments:
            $commandMap:
                analyse:
                    analyse/my-linter: App\Debug\Command\MyLinterCommand

Laravel ​

В сервис-провайдере:

php
use AppDevPanel\Api\Inspector\Controller\CommandController;
use AppDevPanel\Api\PathResolverInterface;

$this->app->singleton(MyLinterCommand::class, fn() => new MyLinterCommand(
    $this->app->make(PathResolverInterface::class),
));

$this->app->extend(CommandController::class, function (CommandController $controller) {
    // Built-in commands are already included.
    // Use the commandMap constructor parameter for custom commands.
    return new CommandController(
        $this->app->make(\AppDevPanel\Api\Http\JsonResponseFactoryInterface::class),
        $this->app->make(PathResolverInterface::class),
        $this->app,
        [
            'analyse' => [
                'analyse/my-linter' => MyLinterCommand::class,
            ],
        ],
    );
});

Yii 2 ​

В конфигурации приложения (config/web.php):

php
'modules' => [
    'debug' => [
        'class' => \AppDevPanel\Adapter\Yii2\Module::class,
        'commandMap' => [
            'analyse' => [
                'analyse/my-linter' => \App\Debug\Command\MyLinterCommand::class,
            ],
        ],
    ],
],

Эндпоинты API ​

МетодПутьОписание
GET/inspect/api/commandСписок доступных команд
POST/inspect/api/command?command=analyse/psalmВыполнить команду

Формат ответа:

json
{
    "status": "ok",
    "result": "...",
    "error": []
}

TIP

Команды PHPUnit и Codeception используют пользовательские JSON-репортеры для структурированного вывода в панели. Остальные команды возвращают текстовый вывод.

Выпущено под лицензией MIT.