PHP致命错误:第47行的/var/www/znata.com/app/AppKernel.php中找不到类'Application \ Sonata \ MediaBundle \ ApplicationSonataMediaBundle'

时间:2012-09-05 00:04:32

标签: symfony symfony-2.1 symfony-sonata sonata-admin

我跟着this doc安装了SonataMediaBundle,但是我收到了这个错误:

PHP Fatal error:  Class 'Application\Sonata\MediaBundle\ApplicationSonataMediaBundle' not found in /var/www/znata.com/app/AppKernel.php on line 47

使用sonata命令后,生成应用程序:

php app/console sonata:easy-extends:generate SonataMediaBundle

新目录是在

下生成的
apps/Application/Sonata/MediaBundle

一切都已完成,但是当我在AppKernel.php中注册生成的应用程序时,我收到了该错误。

public function registerbundles()
{
    return array(
        ...
        new Application\Sonata\MediaBundle\ApplicationSonataMediaBundle(),
        ...
    );
}

您知道如何解决此问题吗?

7 个答案:

答案 0 :(得分:9)

默认情况下,项目根目录不在自动加载路径中,只有“src”目录。 你可以使用

php app/console sonata:easy-extends:generate --dest=src SonataMediaBundle

在src中生成bundle或简单地将它复制到src。

答案 1 :(得分:6)

调试此问题后,我发现namspace应用程序未注册。

在SF2.0中,文档说我们应该注册这个名称空间,如:

<?php
$loader->registerNamespaces(array(
    ...
    'Application'   => __DIR__,
    'Imagine'       => __DIR__.'/../vendor/imagine/lib',
    'Gaufrette'     => __DIR__.'/../vendor/gaufrette/src',
    'Buzz'          => __DIR__.'/../vendor/buzz/lib',
    ...
));

但是在SF2.1中他们确实谈过这个。

所以我在autoload.php中注册了名称空间Application,它运行正常。

所以,autoload.php看起来像这样:

<?php

// file: app/autoload.php

use Doctrine\Common\Annotations\AnnotationRegistry;
$loader = require __DIR__.'/../vendor/autoload.php';

//custom for Application
$loader->add("Application", __DIR__);


// intl
if (!function_exists('intl_get_error_code')) {
    require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';

    $loader->add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs');
}

AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

return $loader;

使用这个新配置一切都很好。但在SF2.0中,他们还谈到了“Imagine”,“Guffrette”和“Buzz”命名空间。因此,perhapes在使用它们时,我们应该像Application namespace一样注册它们。

我希望这会对你有所帮助。

答案 2 :(得分:1)

使用作曲家我在composer.json中这样做了: "autoload": { "psr-0": { "": "src/", "Application": "app/" } },

我添加了映射“Application”:“app /”。 然后运行 composer update

这需要额外的自动加载。

答案 3 :(得分:1)

  1. composer.json文件中,有:

    "autoload": {
        "psr-4": {
            "AppBundle\\": "src/AppBundle",
            "Application\\": "src/Application"
        },
    }
    
  2. 做一个简单的事:

    composer dump-autoload
    

    重新生成自动加载文件。

答案 4 :(得分:0)

new Application\Sonata\MediaBundle\MediaBundle(),

new Application\Sonata\MediaBundle\SonataMediaBundle(),

答案 5 :(得分:0)

正如skonsoft所提到的,您需要在autoload.php中加载名称空间。我对FOQ.Elastica有同样的问题,并通过添加以下内容解决了这个问题。

$loader->add('FOQ', __DIR__.'/../vendor/bundles');

答案 6 :(得分:0)

您还可以使用app命名空间前缀,以便包位于命名空间

bin/console sonata:easy-extends:generate --dest=src SonataMediaBundle --namespace_prefix=App