2013-04-09 17 views
9

Ich versuche, Silex zusammen mit Doctrine ORM (nicht nur DBAL) zu verwenden, aber ich bin nicht in der Lage, die Konfiguration richtig zu bekommen. Silex und Lehre ORM

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

Kunden

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 in meinem Projekt Stammordner befindet

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 auch innerhalb der Stammordner

befindet. php entity befindet sich innerhalb von src/Entities

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

Ich bin in der Lage, Befehle wie php vendor/bin/doctrine orm:schema-tool:create auszuführen und es eine Tabelle namens Zoll genau so zu generieren, wie es sollte. Aber wie lade ich das betreffende Unternehmen in meinem Silex Anwendung

Hier ist meine 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>'; 
}); 

Das Ergebnis beim Laden des localhost in meinem Browser

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 Ich bin nicht sicher, das ist der richtige Weg, um dieses Problem zu lösen, aber mit dem folgenden Ansatz wurde das Problem gelöst und ich kann jetzt meine Entitäten in Silex verwenden

Ich habe den Abhängigkeitsansatz verwendet, weil ich auf diese Weise $ app ['config'] verwenden kann, um DB-Informationen und andere umgebungsspezifische Konfigurationen zu speichern.

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

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

Antwort

3

Ich nehme Ihre Lehre Entitätszuordnungen unter residieren "/ src/Entities" im Namensraum \Entities. Mit Ihrer Autoloader-Direktive sollten sie als \Entities\MyMappingCls erreichbar sein.

Ihr Problem scheint zu sein, dass Sie den fq-Namen der Mapping-Klasse nicht angeben, wenn Sie das Repository abrufen. Sie müssen eine Zeichenfolge eingeben, die vom Autoloader aufgelöst werden kann. Bitte versuchen Sie es:

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

Sie auch orm:generate-proxies laufen versuchen können, da sie nur im laufenden Betrieb im Debug-Modus erzeugt wird (nicht so sicher, dass dies relevant ist).

hth