【问题标题】:Cannot instantiate abstract class ... in appDevDebugProjectContainer.php - Symfony2无法在 appDevDebugProjectContainer.php 中实例化抽象类 ... - Symfony2
【发布时间】:2013-09-11 07:29:06
【问题描述】:

我昨天刚刚安装 apc,现在我收到此错误:

FatalErrorException: Error: Cannot instantiate abstract class
ACME\WebBundle\Menu\MenuBuilder in
/var/www/app/cache/dev/appDevDebugProjectContainer.php line 743

在那一行有:

protected function getEposMain_MenuBuilderService()
{
    return $this->services['epos_main.menu_builder'] = new \ACME\WebBundle\Menu\MenuBuilder($this->get('knp_menu.factory'));
}

有人知道它是什么意思,我能用它做什么吗?

services.yml

services:
    epos_main.menu_builder:
        class: ACME\WebBundle\Menu\MenuBuilder
        arguments: ["@knp_menu.factory"]

    epos_main.menu.main:
        class: Knp\Menu\MenuItem # the service definition requires setting the class
        factory_service: epos_main.menu_builder
        factory_method: createMainMenu
        arguments:
            - @request
            - @twig
            - 'ACMEWebBundle:Menu:menu.html.twig'
        scope: request # needed as we have the request as a dependency here
        tags:
            - { name: knp_menu.menu, alias: main } # The alias is what is used to retrieve the menu

    epos.twig.epos_extension:
        class: ACME\WebBundle\Twig\ePOSTwigExtension
        tags:
            - { name: twig.extension }

一点 MenuBuilder 类代码:

namespace ACME\WebBundle\Menu;

use Knp\Menu\FactoryInterface;
use Symfony\Component\HttpFoundation\Request;

class MenuBuilder
{
    private $factory;

    /**
     * @param FactoryInterface $factory
     */
    public function __construct(FactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public function createMainMenu(Request $request)
    {

        $menu = $this->factory->createItem('root');
        $menu->setChildrenAttribute('class', 'nav');
        ...
        ...
        return $menu;
    }
}

【问题讨论】:

  • 你试过清除缓存吗?
  • 检查你的services.yml 看起来你声明你的服务是非抽象的。您忘记添加工厂了吗?
  • 问题是一切正常,我没有更改 services.yml 和该类中的任何内容。我已经编辑了我的问题,添加了 services.yml 中的代码和 MenuBuilder 类的一些代码。

标签: php symfony apc


【解决方案1】:

这个错误是不言自明的。您不能按照 OOP 规则实例化抽象类!

您的 MenuBuilder 是一个 abstract 类,而您正尝试使用 new 关键字进行实例化,这是不可能的。

【讨论】:

  • 如何判断一个类是否是抽象类?他没有在定义中声明它是抽象的......我目前陷入了类似的问题。
【解决方案2】:

如果您的 MenuBuilder 类在某些时候是抽象类,而您将其更改为具体类,则 APC 可能仍然潜伏着旧版本(在内存中)。

尝试重新启动您的网络服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2017-02-05
    • 2021-06-11
    • 2015-10-06
    • 2012-09-08
    相关资源
    最近更新 更多