在另一个类Symfony2中调用函数

时间:2015-05-21 15:31:27

标签: symfony

我有一个功能,我需要一些控制器。我可以用其他方式调用它来扩展函数所在的类吗? 问题:

class CategoryController extends Controller
{
    public function getCategoriesAction()
    {
        $categories = $this->getDoctrine()->getRepository('ModelBundle:Category')->findAll();
        return $categories;
    }
}

如何在PostController中调用此函数?

4 个答案:

答案 0 :(得分:1)

您可以在其中定义服务并注入实体管理器,以便检索数据:

dummy.manager:
    class: AppBundle\Model\DummyManager
    arguments:
        entityManager: "@doctrine.orm.entity_manager"

在您的服务中,调用findAll()方法:

class DummyManager {

   /** @var EntityManager */
   protected $entityManager;

   public function __construct($entityManager) {
       $this->entityManager = $entityManager;
   }

   public function getCategories(){ 
      return $this->entityManager->getRepository('ModelBundle:Category')->findAll();
   }
}

最后一步,在你的控制器中:

class CategoryController extends Controller
{
    public function getCategoriesAction()
    {
        $categories = $this->container->get('dummy.manager')->getCategories();
        //...
    }
}

我希望这会有所帮助。

答案 1 :(得分:1)

您还可以使用具有特征的纯PHP

trait CategoryProvider {
   public function getCategoriesAction() {
    $categories = $this->container->get('dummy.manager')>getCategories();
    //...
   }
}

之后,您可以在控制器中使用此特征

class Controller1 {

   use CategoryProvider;

   public function indexAction(){
      //...
      $this->getCategoriesAction();
      //...
   }
}

class Controller2 {

   use CategoryProvider;

   public function anotherAction(){
      //...
      $this->getCategoriesAction();
      //...
   }
}

答案 2 :(得分:0)

您不应该在控制器上定义模型样的getter。控制器的“getCategoriesAction”方法的概念应该从你的大脑中撤出。

您要做的是在模型层中定义此提取行为。这可以通过一堆不同的方式来完成。克里斯蒂安只是张贴了一条路,所以我会提供另一条路。

您可以将实体存储库本身定义为服务。

应用/配置/ services.yml

services:
    model.repository.category:
        class:   ModelBundle\Entity\CategoryRepository
        factory: ["@doctrine.orm.entity_manager", getRepository]
        arguments: ['ModelBundle:Category']

然后在你的控制器中(假设它是一个容器感知控制器)你可以这样做

$categories = $this->get('model.repository.category')->findAll();

答案 3 :(得分:0)

@Med提到的另一种方法是将控制器声明为服务:

services:
    categoryController:
        class: AppBundle\Controller\CategoryController
        arguments:
            entityManager: @entityManager