9

我正在尝试将 Silex 与 Doctrine ORM(不仅仅是 DBAL)一起使用,但我无法正确配置。

作曲家.json

{
  "require": {
    "silex/silex": "1.0.*@dev",
    "symfony/monolog-bridge": "~2.1",
    "symfony/twig-bridge": "~2.1",
    "symfony/form": "~2.1",
    "symfony/yaml": "2.2.*",
    "symfony/form": "2.2.*",
    "symfony/translation": "~2.1",
    "symfony/config": "2.2.*",
    "dflydev/doctrine-orm-service-provider": "1.0.*@dev"
  },
  "autoload": {
    "psr-0": {
      "Entities": "src/"
    }  
  }
}

bootstrap.php 位于我的项目根文件夹中

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

require_once __DIR__ ."/vendor/autoload.php";

$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src/Entities"), $isDevMode);

$params = array(
    'driver' => 'pdo_sqlite',
    'path' => __DIR__ . '/development.sqlite',
);

$entityManager = EntityManager::create($params, $config);

cli-config.php 也位于根文件夹内

require_once "bootstrap.php";

$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
    'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($entityManager->getConnection()),
    'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($entityManager)
));

位于 src/Entities 中的 Customer.php 实体

/**
 * @Entity @Table(name="customers")
 **/
class Customer {
    /** @Id @Column(type="integer") @GeneratedValue **/
    protected $id;
    /** @Column(type="string") **/
    protected $name;

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

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

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

我能够运行类似的命令php vendor/bin/doctrine orm:schema-tool:create并让它生成一个名为 custom 的表,就像它应该的那样。但是如何在我的 Silex 应用程序中加载该实体

这是我的 index.php

require_once __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();

use Symfony\Component\Yaml\Yaml;
$app['config'] = function () {
    $config = Yaml::parse(__DIR__ .'/../config.yml');

    return $config;
};

$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
    'dns.options' => $app['config']['database']['development']
));
$app->register(new Dflydev\Silex\Provider\DoctrineOrm\DoctrineOrmServiceProvider, array(
    'orm.em.options' => array(
        'mappings' => array(
            array(
                'type' => 'annotation',
                'path' => __DIR__ .'/src/Entities',
            )
        )
    ),
));
$app->get('/', function () use ($app) {
    $customer = $app['orm.em']->getRepository('Customer');

return '<pre>'. $customer->getName() .'</pre>';
});

在我的浏览器中加载本地主机时的结果

Warning: class_parents() [function.class-parents]: Class Customer does not exist and could not be loaded in /Users/me/Documents/project/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php on line 40

更新 我不确定这是解决此问题的正确方法,但通过使用以下方法问题得到解决,我现在可以在 Silex 中使用我的实体

$app['em'] = function ($app) {
    $config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src/Entities"), true);
    $params = array(
        'driver' => 'pdo_sqlite',
      'path' => __DIR__ . '/../development.sqlite',
    );
    $entityManager = EntityManager::create($params, $config);

    return $entityManager;
};

我使用了依赖方法,因为这样我可以使用 $app['config'] 来存储数据库信息和其他特定于环境的配置。

$customer = new \Entities\Customer();
$customer->setName('Multi Corp '. uniqid());

$app['em']->persist($customer);
$app['em']->flush();
4

1 回答 1

3

我假设您的学说实体映射位于 namespace 中的“/src/Entities”下\Entities。使用您的自动加载器指令,它们应该可以作为\Entities\MyMappingCls.

您的问题似乎是您在获取存储库时没有提供映射类的 fq-name。您需要提供一个可由自动加载器解析的字符串。请试试:

$app['orm.em']->getRepository('Entities\Customer');

您也可以尝试运行orm:generate-proxies它们,因为它们仅在调试模式下动态生成(不太确定这是否相关)。

hth

于 2013-04-30T12:52:13.900 回答