symfony-只返回一个参数

ekqde3dh  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(223)

我写了一个代码,应该收到一个参数,数字(字符串)。。
我的控制器。

/**
 * @Route("/activate", name="activate")
 * @return \Symfony\Component\HttpFoundation\JsonResponse
 */
public function getActivate()
{
        $data = array(
            'number' => '123456'
        );
        return $this->success($data);
}

我不知道在我的服务中编写一个查询函数比调用它到我的控制器更好,还是这是正确的方法。如果查询更好,那么我应该如何开始?比如:

public function getNumber($data)
{
    $number = $this->getRepository()
        ->createQueryBuilder('n')
        ->select('n')
        ->where('n.data = :data').....
rkue9o1l

rkue9o1l1#

不,最好还是把你的查询放在服务里面。
一般来说,至少要遵循以下3条规则:
1) 不要在控制器中放置任何业务逻辑和查询。控制器应该只调用服务函数
2) 从第一点开始,服务应该与存储库通信。
3) 查询应该位于存储库中。
so控制器->服务->存储库
请记住,有时从控制器调用某个存储库函数可能很有用(如果您不需要对存储库函数的结果进行额外的工作,您可以直接返回它)
我如何工作的例子。
在下面的例子中实现这一点
1) 使用依赖注入来获取控制器中的服务2)调用它

<?php

namespace AppBundle\Controller;

use AppBundle\Service\MapService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Class MainPageController
 * @package AppBundle\Controller
 */
class MainPageController extends Controller
{
    /**
     * @var EntityManagerInterface
     */
    private $em;

    /**
     * @var MapService
     */
    private $mapService;

    /**
     * MainPageController constructor.
     * @param EntityManagerInterface $em
     * @param MapService $ms
     */
    public function __construct(EntityManagerInterface $em, MapService $ms)
    {
        $this->em = $em;
        $this->mapService = $ms;
    }

    /**
     * @param Request $request
     * @return Response
     */
    public function indexAction(Request $request)
    {
        $mapData = $this->mapService->prepareMapInformation();

        return $this->render('@App/pages/index.html.twig', [
            'mapData' => $mapData,
        ]);
    }
}

第二个例子-服务。
1) 注入所需的存储库或在服务中注入entity manager并通过它获取存储库2)调用所需的rep函数3)使用它做一些工作并返回

public function prepareMapInformation(): array
{
   $result = [];
   $activeCities = $this->cityRepository->getAllActiveCities();
   $companyInformation = $this->companyRepository
   ->getInformationForMap();

foreach ($activeCities as $oneCity) {
    /**@var City $oneCity */
    $push = [];
    $push['latitude'] = $oneCity->getLatitude();
    $push['longitude'] = $oneCity->getLongitude();
    $push['nameLocation'] = $this->determineNameLocation($oneCity- 
    >getNameLocation());
    $push['companies'] = $this->getCompanies($companyInformation, 
    $oneCity);

    if (!empty($push['companies'])) {
        $result[$oneCity->getName()] = $push;
    }
}

return $result;
}

第三个示例—存储库。

<?php

namespace AppBundle\Repository;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;

/**
 * Class CityRepository
 * @package AppBundle\Repository
 */
class CityRepository extends EntityRepository
{
    /**
     * @return array
     */
    public function getAllCitiesAssoc(): array
    {
        return $this->_em->createQueryBuilder()
            ->select('c')
            ->from('AppBundle:City', 'c', 'c.name') // third param is index by (it creates assoc array with keys of city names)
            ->getQuery()
            ->getResult();
    }

    /**
     * @return array
     */
    public function getAllActiveCities(): array
    {
        return $this->findBy(['active' => 1]);
    }
}

在@alister bulman answer之后编辑。
是的,你可以使用paramconverter,如果你不需要实体的附加逻辑,只是不想返回它的数据来查看。但在某些情况下,这并不是很好,您需要对数据执行额外的逻辑,因为这样您就必须在控制器中执行,或者将实体传递给服务。

lndjwyie

lndjwyie2#

@revengence的答案是可靠的,但我还要补充一点,这也将取决于$数字来自何处。如果它是静态的,比如您的示例,那么将它传递到服务中是完全合理的。
但是,如果它来自url参数:

/**
 * @Route("/activate/{id}", name="activate")
 * @return \Symfony\Component\HttpFoundation\JsonResponse
 */

然后可以使用 ParamConverter ,并且已经有几个可以自动完成某些任务(您也可以为其他任务编写自己的任务)。

/**
 * @Route("/activate/{id}", name="activate")
 * @return \Symfony\Component\HttpFoundation\JsonResponse
 */
public function activateAction(Post $post)
{
    // other security checks - do we have permission to activate this?
    // ....  

    return $this->activatePost($post);  // do something to turn on the entity
}

public function activatePost(Post $post)
{
    $post->setActive(true);
    $post->persist(true);

    return $post;
}

在这里,post实体是通过它的主键post.id找到的,并以对象的形式传递给controller操作,在那里可以使用它。如果没有这样的项,框架将为您抛出404notfound错误。

相关问题