我很难组织我的代码,我想通过一个简单的例子与你分享我的“问题”:计算矩形的面积。我以代码为例,但阅读每个类部分的第一个介绍很容易解释这种情况。
实体矩形:
实体 Rectangle 包含两个重要的属性$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 中,是吗?