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

13

我按照这个文档安装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(),
        ...
    );
}

您有没有任何想法如何解决这个问题?


你能准确描述一下你的捆绑包路径吗? - DonCallisto
7个回答

9

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

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

在 src 中生成捆绑包或简单地将其复制到 src。


6

在调试这个问题后,我发现命名空间 Application 没有被注册。

在 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”命名空间。因此,当使用它们时,我们也应该像应用程序命名空间一样注册它们。
希望这可以帮助你。

1
  1. inside your composer.json file, have:

    "autoload": {
        "psr-4": {
            "AppBundle\\": "src/AppBundle",
            "Application\\": "src/Application"
        },
    }
    
  2. do a simple:

    composer dump-autoload
    

    to re-generate the autoload files.


谢谢,很完美。但我更喜欢保留bundle的逻辑: "Application\\": "src/Application" --> "Application\\Sonata\\UserBundle\\": "src/Application/Sonata/UserBundle" - William Rossier

1
我使用composer在composer.json中进行了以下操作: "autoload": { "psr-0": { "": "src/", "Application": "app/" } }, 我添加了映射 "Application": "app/"。 然后运行 composer update 这将生成所需的额外自动加载。

0
如skonsoft所提到的,您需要在autoload.php中加载命名空间。我曾经遇到了FOQ.Elastica的同样问题,并通过添加以下内容解决了这个问题。 $loader->add('FOQ', __DIR__.'/../vendor/bundles');

0

您还可以使用您的应用程序命名空间前缀,以便包属于您的命名空间

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


0
new Application\Sonata\MediaBundle\MediaBundle(),

或者

new Application\Sonata\MediaBundle\SonataMediaBundle(),

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接