2012-04-03 7 views
-4

カスタムクラスでのエンティティ・マネージャ:カスタムクラスでのエンティティ・マネージャを使用する必要がある場合にはSymfony2のアクセス教義UPDATE

は、あなたがこの道を行くことができるが:

あなたのバンドルにこのコードを配置:

use Symfony\Component\DependencyInjection\Container; 
use Symfony\Component\HttpFoundation\Request; 
require_once DIR . '/../../../app/bootstrap.php.cache'; 
require_once DIR . '/../../../app/AppKernel.php'; 

class ApplicationBoot { 
    private static $kernel; 

    public static function getContainer() { 
    if(self::$kernel instanceof \AppKernel) { 
     if(!self::$kernel->getContainer() instanceof Container){ 
     self::$kernel->boot(); 
    }    
    return self::$kernel->getContainer(); 
    } 

    $environment = 'prod'; 
    if (!array_key_exists('REMOTE_ADDR', $_SERVER) || in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1', 'localhost'))) { 
    $environment = 'dev'; 
    } 

    self::$kernel = new \AppKernel($environment, false); 
    self::$kernel->boot(); 
    return self::$kernel->getContainer(); 
    } 

    public static function shutDown() { 
    self::$kernel->shutdown(); 
}} 

だから今は、EntityManagerをアクセスすることができます。

$container = ApplicationBoot::getContainer(); 
$entityManager = $container->get('doctrine')->getEntityManager(); 
+0

「作業する」と言っているときに、サービスコンテナから取り出したり、クラスを新しくしようとしていますか? – Cerad

+0

Cerad、new class – VitalyP

+0

これはうまくいかないでしょう。私は自分の答えを更新しました。 – Cerad

答えて

1

がをロードするにはあなたのバンドルからは、あなたがextension classを提供する必要があります。

// src/Vendor/YourBundle/DedendencyInjection/VendorYourBundleExtension.php 

namespace Vendor\YourBundle\DependencyInjection; 

use Symfony\Component\HttpKernel\DependencyInjection\Extension, 
    Symfony\Component\DependencyInjection\ContainerBuilder, 
    Symfony\Component\DependencyInjection\Loader\YamlFileLoader, 
    Symfony\Component\Config\FileLocator; 

class VendorYourBundleExtension extends Extension 
{ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 
     $loader->load('services.yml'); 
    } 
} 
+0

まあ、多分私は間違った方向に行きます。私はサービスとしてPostJobにアクセスしません、私はちょうどPostJobの新しいオブジェクトを作成し、内部にエンティティマネージャオブジェクトを持っていたいと思います。 – VitalyP

+0

PostJobをインスタンス化するとき、私はまだ "none given"というエラーを受け取ります。 – VitalyP

2

私はこのようなサービスのファイルを見ていない:

arguments: 
    entityManager: "@doctrine.orm.entity_manager" 

は、おそらく次のようになります。

arguments: [@doctrine.orm.entity_manager] 

UPDATE:

いくつかのコメントに基づいて、あなたがやろうとしているようです:

$job = new PostJob(); 

エンティティマネージャが何らかの形で渡されることを期待しています。そして、それは物事の仕方ではありません。あなたは以下を行う必要があります:

$job = $this->get('postjob.service.id'); 

Symfony 2依存性注入を行うためには、サービスに関するマニュアルの章を参照してください。最初はうんざりしているように見えるかもしれませんが、サービスがうまくいくと、それは第二の性質になります。

+0

とても素敵な答えです、ありがとうございます。 私の場合、$ this-> get( 'postjob.service.id')はできません。新しいPostJob()のみです。 この場合、EMへのアクセス方法は? – VitalyP

+0

あなたの質問にいくつかの情報を追加すると、どこからPostJobを呼び出しているかがわかります。私はそれがおそらくDoctrineのライフサイクル機能を使用してリファクタリングする必要があることを意味するエンティティであると推測しています。 – Cerad

関連する問題