No commands defined in the "server" namespace - ошибка в Symfony 3.3, 3.4 при server:start

После обновления symfony на версию 3.3 и выше вы обнаружите, что при старте встроенного веб-сервера:

bin/console server:start

Команда server:start не отрабатывает, так как возникает ошибка "There are no commands defined in the "server" namespace.". См. скриншот:

There are no commands defined in the "server" namespace. В symfony 3.3+

Ошибка связана с тем, что server команды были перемещены из ядра symfony в отдельный WebServerBundle в symfony 3.3. Если вы обновляли symfony с более старой версии, то подключение WebServerBundle бандла будет отсутствовать в файле app/AppKernel.php.

Нужно подключить WebServerBundle файл так же, как подключаются остальные файлы бандлов в функции registerBundles. Достаточно это сделать для dev environment. Файл app/AppKernel.php::registerBundles.

file app/AppKernel.php :

Было:

if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {
    $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
    $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
    $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
    $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
}

Стало:

if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {
    $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
    $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
    $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
    $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();

    if ('dev' === $this->getEnvironment()) {
        $bundles[] = new Symfony\Bundle\WebServerBundle\WebServerBundle();
    }
}

Теперь команды server будут работать в symfony 3.3+.

Выполнив в консоли снова bin/console можно увидеть список всех доступных команд, включая server:

$ bin/console | grep server
 server
  server:log                              Starts a log server that displays logs in real time
  server:run                              Runs a local web server
  server:start                            Starts a local web server in the background
  server:status                           Outputs the status of the local web server for the given address
  server:stop                             Stops the local web server that was started with the server:start command
 
На некоторых ресурсах советуют проверять наличие класса:
if (class_exists('Symfony\Bundle\WebServerBundle\WebServerBundle')) {
    // For symfony below 3.3 the WebServerBundle does not exist and not needed
    $bundles[] = new Symfony\Bundle\WebServerBundle\WebServerBundle();
}

Но смысла в этом мало, ведь версия symfony явно указывается в composer.json.

 
 
 
 

icon Комментарии 0

Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться
НОВЫЕ ПОЛЬЗОВАТЕЛИ