我很难组织我的代码,我想通过一个简单的例子与你分享我的“问题”:计算矩形区域。我把代码作为例子,但是阅读每个课程部分的第一个介绍很容易解释这种情况。
实体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中注入容器,是吗?
答案 0 :(得分:1)
这属于您的实体。
class Rectangle
{
// ...
public function getArea()
{
return $this->length * $this->width;
}
}
矩形区域是矩形的属性。应该委托给另一个服务并不是一些疯狂的计算,特别是与显示相关的东西(尽管你可能认为它基于它在应用程序中显示)。
现在,如果你计算的东西要复杂得多,那么它可能值得转移到服务/另一个类。 (服务=动词,实体=名词及其属性)。
答案 1 :(得分:0)
你试过RectangleDisplay extends rectangleManager
吗?
这是extend
一个具有您需要的类的正常方法,它具有parent
的所有可能属性以及它的函数here you can read more about it可能override
。这些类都不是final
,所以它应该不是问题。当您要开展工作时,不要忘记考虑课程namespace
。