我是symfony的新手,我在这里阅读了最佳做法指南https://symfony.com/doc/3.4/best_practices/business-logic.html
我有一个名为Category的控制器,并且我有此操作方法可以列出类别。
public function listCategory(Request $request, CategoryLogic $categoryLogic)
{
$categories = $categoryLogic->getAllCategory($this->getDoctrine());
return $this->render('listCategory.html.twig', ['categories' => $categories]);
}
如您所见,我对控制器的所有业务逻辑都转到-> AppBundle \ Utils \ CategoryLogic
我有这种方法来处理逻辑并返回类别
use AppBundle\Entity\Category;
/**
* @param Registry $doctrine
* @return array
*/
public function getAllCategory(Registry $doctrine)
{
$repositoryCategory = $doctrine->getRepository(Category::class);
$category = $repositoryCategory->findAll();
return $category;
}
目的是保持控制器清洁。这是最好的方法吗?我有点担心将逻辑类命名为CategoryLogic
相反,我想将其命名为Category,但是然后又遇到另一个问题,因为我已经在CategoryLogic类中导入了use AppBundle\Entity\Category
,所以不能有两个Category类
答案 0 :(得分:2)
对于您的特定示例,当您可以在控制器中注入存储库时,使用Util类是没有用的。
public function listCategory(Request $request, CategoryRepository $categoryRepository)
{
$categories = $categoryRepository->findAll();
return $this->render('listCategory.html.twig', ['categories' => $categories]);
}
自symfony 3.3起,它具有依赖项注入功能,这意味着您可以将服务注入其他服务。如果您想通过一些服务来处理它,例如实用工具,您可以像这样制作。
//CategoryController.php
public function listCategory(Request $request, CategoryService $categoryService)
{
$categories = $categoryService->getAllCategories();
return $this->render('listCategory.html.twig', ['categories' => $categories]);
}
//CategoryService.php
namespace App\Service;
use App\Repository\CategoryRepository ;
class CategoryService
{
private $categoryRepository;
// We need to inject these variables for later use.
public function __construct(CategoryRepository $categoryRepository)
{
$this->categoryRepository = $categoryRepository;
}
public function getAllCategories()
{
$categories = $this->categoryRepository->findAll();
return $categories;
}
}
始终使用单数和复数名称来排除混淆,例如$ category将具有Category对象,而$ categories将是Category对象的数组,或者至少是Category对象的Iteratable(Collection)对象。当您以后尝试调试代码时,它将使您的生活变得轻松,并帮助其他人更好地理解您的代码。
附录:
https://symfony.com/doc/current/doctrine.html#querying-for-objects-the-repository https://symfony.com/doc/current/service_container/3.3-di-changes.html https://symfony.com/doc/current/service_container/injection_types.html