2013-04-09 8 views
9

私はDoctrine ORM(DBALだけでなく)と一緒にSilexを使用しようとしていますが、正しい設定を取得できません。また、ルートフォルダSilexとDoctrine 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) 
)); 

カスタマーの内側に

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

CLI-config.phpを。 src/Entities内にある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のようなコマンドを実行することができ、必要に応じてcustomsというテーブルを生成することができます。しかし、どのように私は私が私のブラウザ内

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 をローカルホストをロードするときに、私のサイレックスアプリケーションここ

内部実体が私の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>'; 
}); 

結果であることをロードしますこれがこの問題を解決する正しい方法であるかどうかはわかりませんが、問題が解決され、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; 
}; 

DB情報やその他の環境固有の設定を格納するために$ app ['config']を使うことができるので、私は依存関係アプローチを使用しました。

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

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

答えて

3

私はあなたの教義のエンティティのマッピングが名前空間\Entitiesで「/ SRC /エンティティ」の下に存在すると推定。オートローダー指令では、\Entities\MyMappingClsとしてアクセス可能でなければなりません。

問題は、リポジトリを取得するときにマッピングクラスのfq-nameを指定しないことが原因と思われます。オートローダーで解決できる文字列を指定する必要があります。試してみてください:あなたはまた、彼らは唯一のデバッグモードでオンザフライで生成されているようorm:generate-proxiesを実行しようとすることができます

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

(そうわからないこれが関連しています)。

hth