2013-04-09 31 views
9

Tôi đang cố gắng sử dụng Silex cùng với Doctrine ORM (không chỉ DBAL) nhưng tôi không thể có được cấu hình đúng.Silex và 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 nằm trong thư mục gốc của dự án của tôi

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 cũng nằm bên trong thư mục gốc

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

khách hàng. thực thể php nằm bên trong 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; 
    } 
} 

Tôi có thể chạy các lệnh như php vendor/bin/doctrine orm:schema-tool:create và yêu cầu tạo bảng có tên là hải quan. Nhưng làm thế nào để tải thực thể bên trong ứng dụng silex tôi

Đây là index.php tôi

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

Kết quả khi tải localhost bên trong trình duyệt của tôi

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 

CẬP NHẬT Tôi không chắc chắn đây là cách chính xác để giải quyết vấn đề này, nhưng bằng cách sử dụng cách tiếp cận sau vấn đề đã được giải quyết và bây giờ tôi có thể sử dụng các thực thể của tôi trong 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; 
}; 

Tôi đã sử dụng phương pháp phụ thuộc vì cách đó tôi có thể sử dụng $ app ['config'] để lưu trữ thông tin DB và các cấu hình môi trường cụ thể khác.

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

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

Trả lời

3

Tôi đoán học thuyết của bạn Entity ánh xạ cư trú dưới "/ src/Đối tượng" trong không gian tên \Entities. Với chỉ thị nạp tự động của bạn, chúng có thể truy cập được như \Entities\MyMappingCls.

Vấn đề của bạn dường như là bạn không cung cấp tên fq của lớp ánh xạ khi nhận được kho lưu trữ. Bạn cần phải cung cấp cho một chuỗi có thể được giải quyết bởi các autoloader. Vui lòng thử:

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

Bạn cũng có thể cố gắng chạy orm:generate-proxies như họ chỉ tạo ra khi đang bay ở chế độ gỡ lỗi (không như vậy chắc chắn đây là có liên quan).

hth