0

Doctrine 2 で BASIC 継承を達成しようとしていますが、いくつかの大きな問題に直面しています。そのようなタスクはそれほど複雑であってはなりません。ビジネスに取り掛かりましょう...

BaseFoodType、Drink、Snack の 3 つのクラスがあります。私の BaseFoodType には、次のクラス定義があります。

/** @ORM\MappedSuperclass */
class BaseFoodType {

    /**
     * @ORM\Column(type="integer", length=7)
     */
    public $budget = 0;
}

doctrine Web サイトの継承の手順に従います: http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html

エンティティを生成する前のサブクラスは次のようになります。

namespace MySite\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * MySite\MainBundle\Entity\EventDrink
 *
 * @ORM\Table(name="drink")
 * @ORM\Entity
 */
class Drink extends BaseFoodType {

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="integer", length=5, nullable=true)
     */
    public $people_count;
}

Drink と Snack の両方がこの基本クラスを継承していますが、doctrine:generate:entities コマンドを使用してエンティティを構築しようとすると、多くの問題が発生します。まず、Symfony はプライベートな「バジェット」プロパティをゲッターとセッターと共に各サブクラスに挿入します (これは目的の継承を無効にします)。

/**
 * @var integer
 */
private $budget;

/**
 * Set budget
 *
 * @param integer $budget
 */
public function setBudget($budget)
{
    $this->budget = $budget;

    return $this;
}

/**
 * Get budget
 *
 * @return integer 
 */
public function getBudget()
{
    return $this->budget;
}

次に、致命的なエラーが発生します。

致命的なエラー: MySite\MainBundle\Entity\Drink::$budget へのアクセス レベルは、C:\xampp\htdocs\MySite\src\MySite\MainBundle\Entity\ で (クラス MySite\MainBundle\Entity\BaseFoodType のように) パブリックにする必要があります197行目のDrink.php

おそらく、生成されたプロパティを公開して、先に進むこともできますが、これも継承の目的に反します!

洞察をお寄せいただきありがとうございます。

4

2 に答える 2

0

BaseFoodType::budgetパブリックプロパティであり、 BaseFoodType を拡張する Drink / Snack クラスでプライベートdoctrine:generate:entitiesプロパティを作成したため、例外がスローされています (これは正しくありませんが、コマンドが今までに機能する方法です)。

サブクラスのプロパティの可視性は、同じレベルまたはより自由 ( private -> protected -> public ) にのみ設定できますが、それ以上制限されることはありません。

doctrine:generate:entitiesは、パブリック プロパティを使用した実装が非標準であるため、ゲッター/セッターを生成するときにスーパークラスのパブリック プロパティを考慮しませんでした。

したがって、生成されたクラスを手動で調整する必要があります。

ゲッターとセッターと組み合わせてプライベート/保護されたプロパティを使用することをお勧めします。

于 2013-07-01T16:56:26.293 に答える