0

コードを整理するのに苦労しています。簡単な例を使用して「問題」を共有したいと思います。それは、長方形の面積の計算です。コードを例に挙げましたが、各クラスセクションの最初のイントロを読むと状況が簡単に説明されます。

エンティティの長方形:

エンティティ Rectangle には、2 つの重要なプロパティ$lengthとが含まれています$width

// src/Acme/CalculationBundle/Entity/Rectangle.php

/**
 * @ORM\Entity(repositoryClass="Acme\CalculationBundle\Repository\RectangleRepository")
 * @ORM\Table(name="rectangle")
 */
class Rectangle
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="integer")
     */
    protected $length;

    /**
     * @ORM\Column(type="integer")
     */
    protected $width;

もちろん、ユーザーはフォームを介して長さと幅を設定できます

コントローラ

CreateRectangleAction: GET リクエストでフォームをレンダリングし、POST リクエストでデータを操作します。

ViewRectangleAction:長方形を表示します。

長方形マネージャー

ここで、コントローラーがやりすぎないようにするために、RectangleManager を使用して Rectangle オブジェクトに対する共通操作を実現し、それをサービスとして使用します (適切な要素を挿入します)。

// src/Acme/CalculationBundle/Entity/RectangleManager.php
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
use Acme\EmployerBundle\Entity\Manager;

class rectangleManager
{
    /**
     * Doctrine entity manager
     * @var EntityManager
     */
    protected $em;

    /**
     * @var EntityRepository
     */
    protected $repository;

    /**
     * 
     * @var string
     */
    protected $class;

    public function __construct(EntityManager $em, $class)
    {
        $this->em = $em;
        $this->class = $class;
        $this->repository = $em->getRepository($class);
    }

    /**
     * @param $id
     * @return Rectangle
     */
    public function find($id)
    {
        $rectangle =  $this->repository->find($id);
    }

問題: もしも?

長方形で計算を行う必要がある場合はどうすればよいですか? たとえば、テンプレートで計算 (長さ * 幅) を実行せずにテンプレートで領域を直接レンダリングできるように、領域プロパティを追加する必要がある場合はどうすればよいでしょうか?

これを適切に行う方法がわからないので、私はこのかなり悪い解決策に行きました:

RectangleDisplay クラス (四角形エンティティを挿入する場所) を作成し、コントローラで ViewRectangleAction を呼び出すときに Rectangle エンティティの代わりにそのエンティティを表示します。

// src/Acme/CalculationBundle/Entity/
class RectangleDisplay
{
    /**
     * @var Rectangle $rectangle
     */
    protected $rectangle;

    /**
     * @var Integer 
     */
    protected $area;

    /**
     * @param Rectangle $rectangle
     */
    public function __construct(rectangle $rectangle){

        $this->rectangle = $rectangle;
        //calculate are
        $area = this->calculateArea($this->rectangle->getLength(),$this->rectangle->getWidth());
        $this->area = $area;

    }

    /**
     * @return Integer $area
     */
    public function calculateArea($length,$width)
    {
         return $length * $width;
    }

これで、テンプレートでプロパティ領域に直接アクセスできるようになりました。四角形の場合はそれで問題ありませんが、より複雑な要素 (円錐など) の場合は、計算に夢中になるサービスを使用したい場合があります。RectangleDisplayEntity にコンテナーを挿入するつもりはありませんよね?

4

2 に答える 2

1

これはあなたのエンティティに属しています。

class Rectangle
{
    // ...

    public function getArea()
    {
        return $this->length * $this->width;
    }
}

長方形の面積は、長方形のプロパティです。これは、別のサービスに委任する必要があるクレイジーな計算ではなく、特に表示関連のものではありません (ただし、アプリケーションで表示されることに基づいていると考えるかもしれません)。

ここで、もっと複雑なものを計算していた場合は、おそらくサービス/別のクラスに移動する価値があります。(サービス = 動詞、エンティティ = 名詞とそのプロパティ)。

于 2012-07-27T16:51:14.290 に答える
0

試しましたRectangleDisplay extends rectangleManagerか?これは、extend必要なものを備えたクラスへの通常の方法であり、可能なすべてのプロパティとその関数の可能なプロパティを使用できます (parent詳細については、こちらを参照してください)。どのクラスもではないので、問題にはなりません。作業するときは、クラスを考慮することを忘れないでください。overridefinalnamespace

于 2012-07-27T08:09:44.950 に答える