使用命名空间时找不到php教程类

时间:2016-09-18 07:35:44

标签: php doctrine-orm namespaces doctrine autoloader

我在学说getting started后被卡住了。

让我先告诉你代码。

/bootstrap.php

namespace MyApp;

require 'vendor/autoload.php';

require 'config/slim.php'; //Some config files it doesn't matter
require 'config/dependencies.php'; //Some config files it doesn't matter

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\Setup;

$doctrineDbConfig = array(
    'driver' => 'pdo_mysql',
    'user' => $config['db']['user'],
    'password' => $config['db']['pass'],
    'dbname' => $config['db']['dbname'],
);

$entityManager = EntityManager::create(
    $doctrineDbConfig,
    Setup::createYAMLMetadataConfiguration(
        array(
            __DIR__ . "/config"
        ),
        $isDevMode = true
    )
);

/cli-config.php

require "bootstrap.php";
return \Doctrine\ORM\Tools\Console\ConsoleRunner::createHelperSet($entityManager);

如您所见,我告诉学说“我的实体配置文件位于/ config目录下”,这是产品实体的配置文件:

/config/Product.dcm.yml

Product:
  type: entity
  table: products
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  fields:
    name:
      type: string

所以我运行这个命令:

$ vendor/bin/doctrine orm:schema-tool:update --force --dump-sql

我得到了这个:

[Doctrine\Common\Persistence\Mapping\MappingException]  
Class 'Product' does not exist         

让我告诉你“产品”类:

/src/Entities/Product.php

namespace MyApp; //If I delete this line, It works

class Product
{
    protected $id;
    protected $name;

    public function getId()
    {
        return $this->id;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }
}

当然我在bootstrap.php文件中使用的是composer autoloader:

/composer.json

"autoload": {
    "psr-4": {
        "MyApp\\": ["src/", "src/Entities/"]
    }
}

我正在映射命名空间“MyApp”。当我通过index.php请求应用程序时,这工作正常,但在使用命令行时它不起作用。

如果我删除了Product.php类中的命名空间行,那么它可以工作,而且doctrine会找到该类。

我已经尝试过使用这种映射:

/composer.json

"autoload": {
    "psr-4": {
        "": ["src/", "src/Entities/"]
    }
}

在阅读此answer

后,我已尝试创建名称空间别名

你能就此提出一些建议吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

好吧,我找到了解决方案......也许是一个新手,我不知道。 如果有人能够验证这一点,我将不胜感激。

我刚刚补充道:

配置文件名中的完全限定名称,如下所示:

MyApp.Product.dcm.yml

我在配置文件中使用完全限定名称,如下所示:

MyApp\Product:
  type: entity
  table: products
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  fields:
    name:
      type: string