2013-04-09 6 views
9

Я пытаюсь использовать Silex вместе с Doctrine ORM (а не только DBAL), но я не могу правильно настроить конфигурацию.Silex and Doctrine ORM

composer.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); 

кли-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) 
)); 

клиентов. php, находящийся внутри src/Объекты

/** 
* @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 и генерировать таблицу, называемую таможней так, как должна. Но как я могу загрузить объект внутри моего приложения 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 

UPDATE Я не уверен, что это правильный способ решить эту проблему, но, используя следующий подход, проблема была решена, и теперь я могу использовать свои объекты в 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(); 

ответ

3

Я полагаю, ваше учение Entity отображения находиться под "/ SRC/Entities" в пространстве имен \Entities. С вашей директивой автозагрузчика они должны быть доступны как \Entities\MyMappingCls.

Ваша проблема заключается в том, что при получении репозитория вы не указываете имя класса отображения fq. Вам нужно указать строку, которая может быть разрешена автозагрузчиком. Пожалуйста, попробуйте:

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

Вы также можете попробовать запустить orm:generate-proxies, поскольку они генерируются только на лету в режиме отладки (не уверен, что это уместно).

hth

Смежные вопросы