2013-04-09 17 views
9

Próbuję użyć Silex razem z Doctrine ORM (nie tylko DBAL), ale nie mogę uzyskać poprawności konfiguracji.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 się w moim folderze głównym projektu

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 również znajduje się w folderze głównym

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

Klienta. podmiot php znajdujący się wewnątrz src/Entity

/** 
* @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; 
    } 
} 

Jestem w stanie uruchomić polecenia takie jak php vendor/bin/doctrine orm:schema-tool:create i wygenerować tabelę zwaną zwyczajem tak, jak powinna. Ale jak mogę załadować tego podmiotu w mojej aplikacji Silex

Oto moja 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>'; 
}); 

Wynik podczas ładowania localhost wewnątrz mojej przeglądarce

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 jestem nie jestem pewien, czy to jest poprawny sposób rozwiązania tego problemu, ale stosując następujące podejście, problem został rozwiązany i mogę teraz używać moich jednostek w 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; 
}; 

Użyłem metody zależności, ponieważ w ten sposób mogę użyć $ app ['config'] do przechowywania informacji DB i innych konfiguracji specyficznych dla środowiska.

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

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

Odpowiedz

3

Przypuszczam swoją doktrynę mapowania Entity przebywania pod "/ src/podmioty" w przestrzeni nazw \Entities. Dzięki dyrektywie do autoloadera powinny być dostępne jako \Entities\MyMappingCls.

Twój problem polega na tym, że nie podajesz nazwy-klasy klasy odwzorowania podczas pobierania repozytorium. Musisz podać ciąg, który może być rozwiązany przez autoloader. Spróbuj:

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

Można również spróbować uruchomić orm:generate-proxies ponieważ są one generowane tylko w locie w trybie debugowania (nie tak pewien, że to jest istotne).

hth

Powiązane problemy