2017-06-01 6 views
1

これは本当に奇妙なPHPの動作を経験しています。静的クラスメソッドは、クラスの外部で呼び出されたときにオブジェクトを返しますが、別のクラスの内部で呼び出されると空のオブジェクトを返します。

概要:Doctrineの利点を持ちながら、エンティティとのやりとりを少し容易にするために、私自身の抽象クラスでDoctrine ORMをセットアップしました。私は依存性注入を追加する必要があることを知っていますが、これはスタートです。

エンティティORMの呼び出しは、私がコントローラのスクリプトから作成したテストでうまくいっています。これは、クラス外のプレーンなファイルです。

他のクラスの中でEntity ORM呼び出しをしようとすると、空のオブジェクトが返されます。 DoctrineのためのEntityManagerを構築する静的メソッドに移動しました。それは本当に変です。 inside静的メソッドの私が作成/戻しているオブジェクトをトレースすることができます。実際に静的メソッドを呼び出すと、返される値は空のオブジェクトになります。ここでは簡単な構造です:問題は上記ですerror_logに対

namespace MyApp\Core; 

use MyApp\Core\System; 
use Doctrine\ORM\Tools\Setup; 
use Doctrine\ORM\EntityManager; 

class SystemDBA { 

public static function entityManager() 
{ 
    $paths = array(PLATFORM_ROOT."/classes/entities"); 
    $isDevMode = false; 

    $db_settings = System::getSystemSettings(); 

    $dbParams = array(
     'driver' => 'pdo_mysql', 
     'user'  => $db_settings['username'], 
     'password' => $db_settings['password'], 
     'dbname' => $db_settings['database'], 
    ); 

    $config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode); 

    $em = EntityManager::create($dbParams, $config); 

    // this will always return the right kind of EntityManager object no matter where an entity is called from. 
    error_log(json_encode($em)); 

    // this however is sending back an empty object when an entity is called inside of a class. 
    return $em; 
} 

$emリターンがあります。 error_logからシステムがどこに呼び出されても、常に正しいですが、戻り値は正しくありません。ここではチェーンの残りです:$dbは私が期待してるよう代わりにDoctrineのEntityManagerオブジェクトの空のオブジェクトがどこにある

namespace MyApp\Entities; 

use MyApp\Core\System; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 

use MyApp\Core\SystemDBA; 

class EntityBase 
{ 

    public static function find($id) 
    { 
     $db = SystemDBA::entityManager(); 
     // if it's an array of ids we can try to get multiples 
     $object = $db->getRepository(get_called_class())->findOneBy(['id'=>$id]); 

     if ($object) return $object; 

     return false; 
    } 

方法find()の最初の行です。

EDIT私はget_called_class()は関係なく、私は別のクラスから、またはスタンドアロンのPHPファイルからエンティティを呼び出すかどうかのEntityBaseでMyApp\\Entities\\Peopleを返していることが確認されました。だから、リポジトリクラス名の問題ではないようです。

namespace MyApp\Entities; 

/** 
* @Entity 
* @Table(name="people") 
*/ 

class People extends EntityBase { 
私はこのようなスタンドアロンのコントローラからエンティティを呼び出す場合、だから、最終的には EntityBase

を拡張

シンプルなORM Entityクラス:それは正常に動作します

namespace MyApp\Controllers; 
use MyApp\Entities\People; 

$user = People::find(123); 

SystemDBA::entityManager()は両方の外部に戻し、また、内部的に適切なオブジェクトをトレースします。

しかし、別のクラスの内部からこれを実行しようとすると、SystemDBA::entityManager()は内部的に正しいオブジェクトをトレースしますが、外部で空のオブジェクトを返します。

namespace MyApp\SomeStuff; 

use MyApp\Entities\People; 

class myClass { 
    protected function getUser($user_id) { 
     $user = People::find(123); 
     } 

私は当初、これがDoctrineに関連していると考えていましたが、それは大きくPHPの問題のようです。私は保護されないように最後の例でクラスメソッドを変更しようとしましたが、何の支障もないようです。どんな洞察力も大いにありがとう!

答えて

1

http://php.net/manual/en/function.get-called-class.php

。静的メソッドがで呼び出されたクラスの名前を取得し、それが動作することはできませんので、あなたは、 myClass内の静的メソッドを呼び出します。

ところで、私はそのようなやり方はお勧めしません。しばらくして静的な使用を後悔し、このような依存関係を導入します。 そして、すべての呼び出し(つまり新しい接続)で新しいEntityManagerインスタンスを作成します。これは非効率的で、doctrineの動作を破ります(作業ユニットについて読むことができます)。

コンテナによる依存性注入が適切な方法です。

+0

あなたは100%正解ですが、私は依存性注入を使用する必要があります –

+0

あなたはクラス名のルックアップが行く限り、私はそれが問題かもしれないと考えているエラーログを試みましたが、私はいつも同じEntityクラスそれがどこから呼び出されたかにかかわらず名前。私は依存症の注射とこれを試し、そこから行くでしょう。 –

+0

私は、 'get_called_class()'がEntityBaseの 'MyApp \\ Entities \\ People'を別のクラスかスタンドアロンのPHPファイルかどうかにかかわらず返すことを確認しました。それはここでは直接の問題ではないようです。このポイントを編集として追加する。 –

関連する問題