将附加对象类添加到symfony2控制器文件的最佳方法是什么?

时间:2013-06-29 01:12:55

标签: symfony controller include registry autoloader

我对Symfony2比较陌生,所以我正在边做边学。我的控制器类变得越来越大。我想用函数()或对象 - >方法()来分解它。不幸的是我无法弄清楚代码的放置位置。 (实际上它的功能非常简单......但我可以将它包装在一个对象中......)

- 我无法将其添加到DefaultController.php文件的底部。它错误输出,而不是在{}内部或外部引导的漂亮代码。

- 我不能简单地将新的NewObject.php文件添加到控制器目录中。那错误了。错误:FatalErrorException:...找不到NewObject。

- 我已经玩过手动mod到../app/autoload.php但是对于一个简单的类添加到我的./SRC/包中并没有用。也许我应该构建一个./src/autoload.php文件(类似于./vender/autoload.php),但该文件的内容对我来说根本没有意义。我根本无法弄清楚AnnotationRegistry Loader是如何工作的。

我错过了什么吗?这看起来太难了...我想要的是一个包裹'include'所以我可以在开发和部署后使用该类。

如何在我的代码中包含NewObject.php(以及随附的$ newObject-> function())?

我被告知我可以添加一项服务,但对于这样一个看似简单的任务而言,这似乎是一种无聊的开销(同样,我要做的就是清理我的长控制器php代码...)

提前感谢您的建议。

1 个答案:

答案 0 :(得分:7)

所以你有一个看起来像这样的项目结构,对吗?

project
-- app
-- bin
-- src
   -- SomeName
      -- SomeBundle
          -- Controller
          -- Entity
          -- Resources
          -- ...
-- vendor
-- web

而你只是希望拥有一种在整个捆绑中使用的“助手”类。这是对的吗?

如果是这样,那么你真的可以把它放在src/目录中的任何地方......只要确保类名与文件名匹配,并且文件的路径与命名空间匹配在PHP代码的顶部定义。

有时当我这样做时,我会在我的捆绑下创建一个名为“Helper /”的简单目录。其他时候,当应用程序更复杂时,我可能会更明确一些。但这是第一个案例的样子......

首先,在您的包下添加您的/Helper目录,然后创建类文件:

project
-- app
-- bin
-- src
   -- SomeName
      -- SomeBundle
          -- Controller
          -- Entity
          -- Helper
             -- SomeHelper.php
          -- Resources
          -- ...
-- vendor
-- web

SomeHelper.php的内容可能如下所示:

<?php
namespace SomeName\SomeBundle\Helper;

class SomeHelper
{
    public function doSomething()
    {
        ...
    }
}

由于您的命名空间与文件路径匹配,因此它会自动加载,因此您无需担心包含语句。只要包含use语句:

,您就可以在包中的任何位置实例化该类
<?php
namespace SomeName\SomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use SomeName\SomeBundle\Helper\SomeHelper;

class DefaultController extends Controller
{
    public function indexAction()
    {
        ...
        $helper = new SomeHelper();
        $helper->doSomething();
        ...
    }
}

关于服务的使用......是的,这可能是过度的,取决于你使用它的目的。当类需要知道它周围的应用程序时,创建服务是有帮助的。例如,如果您要创建一个通过电子邮件发送给用户的服务,它可能希望通过Doctrine服务访问您的数据库,或者它可能希望通过Monolog服务记录电子邮件活动。

但是,如果您的类不需要知道应用程序(称为“服务容器”),例如,如果它只是用于传输数据,那么辅助类可能更合适。