0

我很难组织我的代码,我想通过一个简单的例子与你分享我的“问题”:计算矩形的面积。我以代码为例,但阅读每个类部分的第一个介绍很容易解释这种情况。

实体矩形:

实体 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 中,是吗?

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和可能override的​​功能(在这里您可以阅读有关它的更多信息)。没有一个类是final,所以它不应该是一个问题。namespace不要忘记在你工作的时候考虑到类。

于 2012-07-27T08:09:44.950 回答