コードを整理するのに苦労しています。簡単な例を使用して「問題」を共有したいと思います。それは、長方形の面積の計算です。コードを例に挙げましたが、各クラスセクションの最初のイントロを読むと状況が簡単に説明されます。
エンティティの長方形:
エンティティ 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 にコンテナーを挿入するつもりはありませんよね?