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

Встроенные команды
Встроенные команды обнаруживаются автоматически. Если инструмент установлен, команда появляется автоматически — настройка не требуется.
Статический анализ
| Команда | Инструмент | Автоопределение |
|---|---|---|
analyse/psalm | Psalm | vimeo/psalm в Composer |
analyse/phpstan | PHPStan | phpstan/phpstan в Composer |
analyse/mago | Mago | carthage-software/mago в Composer или бинарный файл mago в PATH |
Тестирование
| Команда | Инструмент | Автоопределение |
|---|---|---|
test/phpunit | PHPUnit | phpunit/phpunit в Composer |
test/codeception | Codeception | codeception/codeception в Composer |
test/pest | Pest | pestphp/pest в Composer |
test/testo | Testo | testo/testo в Composer |
Прочее
| Команда | Источник | Описание |
|---|---|---|
composer/* | composer.json | Все записи scripts автоматически обнаруживаются как composer/{scriptName} |
Как это работает
Команды обнаруживаются из трёх источников:
- Встроенные команды — Все команды анализа и тестирования из таблицы выше. Каждая команда имеет проверку
isAvailable(); недоступные команды скрываются автоматически. - Пользовательские команды — Дополнительные команды, зарегистрированные через конфигурацию адаптера (
commandMap). - Скрипты Composer — Все записи
scriptsизcomposer.jsonдоступны как командыcomposer/{scriptName}.
Нажмите кнопку команды для выполнения. Вывод отображается в диалоговом окне с индикацией статуса.
Создание пользовательских команд
Реализуйте CommandInterface для создания пользовательской команды:
<?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
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):
return [
'app-dev-panel/yii3' => [
'api' => [
'commandMap' => [
'analyse' => [
'analyse/my-linter' => \App\Debug\Command\MyLinterCommand::class,
],
],
],
],
];Зарегистрируйте зависимости в конфигурации DI, если команде нужна инъекция через конструктор:
\App\Debug\Command\MyLinterCommand::class => static fn(
\AppDevPanel\Api\PathResolverInterface $pathResolver,
) => new \App\Debug\Command\MyLinterCommand($pathResolver),Symfony
В вашем config/packages/app_dev_panel.yaml:
services:
App\Debug\Command\MyLinterCommand:
arguments:
- '@AppDevPanel\Api\PathResolverInterface'Переопределите CommandController для передачи commandMap:
services:
AppDevPanel\Api\Inspector\Controller\CommandController:
arguments:
$commandMap:
analyse:
analyse/my-linter: App\Debug\Command\MyLinterCommandLaravel
В сервис-провайдере:
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):
'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 | Выполнить команду |
Формат ответа:
{
"status": "ok",
"result": "...",
"error": []
}TIP
Команды PHPUnit и Codeception используют пользовательские JSON-репортеры для структурированного вывода в панели. Остальные команды возвращают текстовый вывод.