计算矩形的面积

时间:2012-07-27 07:41:56

标签: php doctrine-orm symfony-2.1

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

实体矩形:

实体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;

FORM

当然,用户可以通过表格

设置长度和宽度

CONTROLLER

CreateRectangleAction:在GET请求中呈现表单并处理POST请求中的数据。

ViewRectangleAction:显示矩形。

RECTANGLE MANAGER

现在,为了确保控制器不会做太多的事情,我使用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中注入容器,是吗?

2 个答案:

答案 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