AppBundle\Utils 中的 symfony 3.4 业务逻辑

symfony 3.4 business logic in AppBundle\Utils

我是 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

我有这个方法来处理逻辑和return类别

use AppBundle\Entity\Category; 

/**
 * @param Registry $doctrine
 * @return array
 */
public function getAllCategory(Registry $doctrine)
{
    $repositoryCategory = $doctrine->getRepository(Category::class);
    $category = $repositoryCategory->findAll();

    return $category;
}

目的是保持控制器清洁。这是最好的方法吗?我有点担心将逻辑 class 命名为 CategoryLogic 相反,我想将其命名为 Category 但后来我遇到了另一个问题,因为我已经在 CategoryLogic class 中导入了 use AppBundle\Entity\Category 所以不能有两个 Category classes

对于您的具体示例,当您可以在控制器中注入 Repository 时,使用 Util class 是没有用的。

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 对象的可迭代(集合)对象。当您稍后尝试调试代码并帮助其他人更好地理解您的代码时,它会让您的生活变得轻松。

附录:

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