部署Symfony应用-ClassNotFoundException错误

yev*_*evg 6 php deployment heroku symfony symfony4

我正在学习Symfony框架,并尝试使用Git将我放在一起的简单样板应用程序部署到Heroku。

由于以下致命错误,导致部署失败:

Uncaught Symfony\Component\Debug\Exception\ClassNotFoundException: Attempted to load class "WebServerBundle" from namespace "Symfony\Bundle\WebServerBundle

Did you forget a "use" statement for another namespace? in /tmp/build_cbeb92af6c9ee04b07e1f85618211649/src/Kernel.php:32

内核.php

<?php

namespace App;

use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
use Symfony\Component\Routing\RouteCollectionBuilder;

class Kernel extends BaseKernel {

    use MicroKernelTrait;

    const CONFIG_EXTS = '.{php,xml,yaml,yml}';

    public function getCacheDir(){

        return $this->getProjectDir().'/var/cache/'.$this->environment;
    }

    public function getLogDir(){

        return $this->getProjectDir().'/var/log';
    }

    public function registerBundles(){

        $contents = require $this->getProjectDir().'/config/bundles.php';
        foreach ($contents as $class => $envs) {
            if (isset($envs['all']) || isset($envs[$this->environment])) {
                yield new $class();
            }
        }
    }

    protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader){

        $container->setParameter('container.autowiring.strict_mode', true);
        $container->setParameter('container.dumper.inline_class_loader', true);
        $confDir = $this->getProjectDir().'/config';
        $loader->load($confDir.'/packages/*'.self::CONFIG_EXTS, 'glob');
        if (is_dir($confDir.'/packages/'.$this->environment)) {
            $loader->load($confDir.'/packages/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob');
        }
        $loader->load($confDir.'/services'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/services_'.$this->environment.self::CONFIG_EXTS, 'glob');
    }

    protected function configureRoutes(RouteCollectionBuilder $routes){

        $confDir = $this->getProjectDir().'/config';
        if (is_dir($confDir.'/routes/')) {
            $routes->import($confDir.'/routes/*'.self::CONFIG_EXTS, '/', 'glob');
        }
        if (is_dir($confDir.'/routes/'.$this->environment)) {
            $routes->import($confDir.'/routes/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob');
        }
        $routes->import($confDir.'/routes'.self::CONFIG_EXTS, '/', 'glob');
    }
}
Run Code Online (Sandbox Code Playgroud)

我到目前为止所做的:

  • 安装dotenv套件(composer require symfony/dotenv
  • composer dump-autoload
  • 根据本文heroku config:set SYMFONY_ENV=prod)通过heroku CLI设置生产环境变量

我已经了解/注意到的一些事情:

  • 根据自述文件WebServerBundle

WebServerBundle提供使用PHP内置Web服务器运行应用程序的命令。它简化了本地开发设置,因为您无需配置适当的Web服务器(例如Apache或Nginx)即可运行应用程序。

..也就是说,这WebServerBundle是对开发的依赖-但是​​它已包含在生产中。

  • WebServerBundle也包含在composer.lock自动加载下的文件中

    "autoload": { "psr-4": { "Symfony\\Bundle\\WebServerBundle\\": "" }, ... },

  • 我的bundles.php文件包括WebServerBundle用于dev

    return [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Symfony\Bundle\WebServerBundle\WebServerBundle::class => ['dev' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], ];

  • 我有一个.env文件和一个.env.dist文件-我假设该.env.dist文件用于生产?它们都有相同的内容:

    APP_ENV=dev APP_SECRET=0473d15a4ce2723619d2e8b0405186d3

对于symfony来说,我还很陌生,除了dotenv捆绑包读取.env文件并设置环境变量外,他并没有真正了解如何实例化生产环境。

在所有这些方面的任何帮助和澄清将不胜感激。

编辑:这是我的composer.json文件

{
    "type": "project",
    "license": "proprietary",
    "require": {
        "php": "^7.1.3",
        "ext-iconv": "*",
        "sensio/framework-extra-bundle": "^5.1",
        "symfony/asset": "^4.0",
        "symfony/console": "^4.0",
        "symfony/dotenv": "^4.0",
        "symfony/flex": "^1.0",
        "symfony/framework-bundle": "^4.0",
        "symfony/lts": "^4@dev",
        "symfony/twig-bundle": "^4.0",
        "symfony/yaml": "^4.0"
    },
    "require-dev": {
        "symfony/profiler-pack": "^1.0",
        "symfony/web-server-bundle": "^4.0"
    },
    "config": {
        "preferred-install": {
            "*": "dist"
        },
        "sort-packages": true
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },
    "replace": {
        "symfony/polyfill-apcu": "*",
        "symfony/polyfill-php70": "*",
        "symfony/polyfill-php56": "*"
    },
    "scripts": {
        "auto-scripts": {
            "cache:clear": "symfony-cmd",
            "assets:install --symlink --relative %PUBLIC_DIR%": "symfony-cmd"
        },
        "post-install-cmd": [
            "@auto-scripts"
        ],
        "post-update-cmd": [
            "@auto-scripts"
        ]
    },
    "conflict": {
        "symfony/symfony": "*"
    },
    "extra": {
        "symfony": {
            "id": "01C1BVQJ19BG3WAS3299PDHH9P",
            "allow-contrib": false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Arl*_*Hix 6

我不确定您使用的命令,(我使用git)

heroku config:set SYMFONY_ENV =产品

但是,如果您的.env文件具有

APP_ENV = dev

这是明确地将环境设置为dev,因此它试图加载不会被推送到服务器的dev依赖项(由您的错误证明)(请阅读提供的文章)。

您需要.env服务器上的文件具有APP_ENV=prod .env用于特定的计算机,git会忽略该文件,同时跟踪.env.dist。因此,编辑.env.dist并提交,然后将其重新命名在服务器上,然后将其重命名即可.env运行composer installcomposer update在服务器上运行,这将更新依赖关系并清除缓存。然后刷新浏览器。