我有一个功能,我需要一些控制器。我可以用其他方式调用它来扩展函数所在的类吗? 问题:
class CategoryController extends Controller
{
public function getCategoriesAction()
{
$categories = $this->getDoctrine()->getRepository('ModelBundle:Category')->findAll();
return $categories;
}
}
如何在PostController中调用此函数?
答案 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