php - AppBundle\Utils 中的 symfony 3.4 业务逻辑
问题描述
我是 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 但后来我遇到了另一个问题,因为我已经use AppBundle\Entity\Category
在 CategoryLogic 类中导入,所以不能有两个 Category 类
解决方案
对于您的具体示例,当您可以在控制器中注入 Repository 时,使用 Util 类是没有用的。
public function listCategory(Request $request, CategoryRepository $categoryRepository)
{
$categories = $categoryRepository->findAll();
return $this->render('listCategory.html.twig', ['categories' => $categories]);
}
从 symfony 3.3 开始,它具有依赖注入,这意味着您可以将服务注入到其他服务中。如果你想用一些服务来处理它,比如 Utils,你可以这样。
//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
推荐阅读
- file - 在处理中保存到文件的问题
- sorting - 对包含数字和字符串的字符串列表进行排序
- node.js - 连接到 mailgun 时我一直收到 401
- python - python dataframe 一个Series的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
- r - 使用 ggplot、gtable 和 cowplot 固定图例框的宽度
- python - 一些迭代后matplolib“未能分配位图”
- html - 当有多个文本行时,HTML按钮会自行移动
- java - Flink Table,Create table 数组类型报错“ValidationException”
- php - 在 Laravel 8.x 中使用切换按钮保存表单并将其添加到枚举表中
- node.js - 使用图像在 Firebase 存储上加载预览时出错 [从 Firebase Admin SDK 上传]