0

我将开始说我正在使用 Symfony 4.3.4 和Api Platform(从现在开始称为 AP)。话虽如此,我的自定义控制器(用于 AP)如下所示:

declare(strict_types=1);

namespace App\Controller\CaseWork\Pend;

use App\Request\PendCaseRequest;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\Routing\Annotation\Route;

class PendCaseController
{
    /**
     * @Route("/myroute/{id}/pend", name="routeName")
     * @ParamConverter("case", class="App\Entity\Cases")
     */
    public function __invoke(PendCaseRequest $request, int $id)
    {
        // do something with the $request
    }
}

您可能会注意到,我还有一个请求数据转换器对象,下面是它的代码片段:

declare(strict_types=1);

namespace App\Request;

use App\Interfaces\RequestDTOInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\Constraints as Assert;

class PendCaseRequest implements RequestDTOInterface
{
    /**
     * @var int
     *
     * @Assert\NotBlank()
     * @Assert\NotNull()
     * @Assert\Type("integer")
     */
    private $param;

    public function __construct(Request $request)
    {
        $data = json_decode($request->getContent(), true);
        $this->param = (int) $data['param'];
        // ...
    }
}

假设(根据此处的文档)当请求进来并找到id匹配的 a时,应该将App\Entity\Cases一个名为的新属性附加到我的对象,但在我的场景中没有发生,我不确定为什么或我错过了什么。case$request

在我的 DTO的这一行调试和设置断点时$this->param = (int) $data['param'];,如果我打印出来,$this->attributes我会得到以下输出:

‌Symfony\Component\HttpFoundation\ParameterBag::__set_state(array(
   'parameters' => 
  array (
  ),
))

我在这里缺少什么?我的方法有什么问题?

4

1 回答 1

0

我在这里找到了“解决方案” 。我最终使用了Decorator该帖子中答案所建议的 a 。

我的主控制器变成了这个:

declare(strict_types=1);

namespace App\Controller\CaseWork\Pend;

use App\Request\PendCaseRequest;
use App\Entity\Cases;

class PendCaseController
{
    public function __invoke(PendCaseRequest $request, Cases $case)
    {
        // do something with the $request
    }
}

创建了一个装饰器:

declare(strict_types=1);

namespace App\Decorator;

use App\Controller\CaseWork\Pend\PendCaseController;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Cases;
use App\Request\PendCaseRequest;

class PendCaseDecorator
{
    /** @var PendCaseController */
    protected $decoratedController;

    /** @var EntityManagerInterface */
    protected $entityManager;

    public function __construct(PendCaseController $controller, EntityManagerInterface $entityManager)
    {
        $this->decoratedController = $controller;
        $this->entityManager = $entityManager;
    }

    public function __invoke(PendCaseRequest $request, int $id)
    {
        $object = $this->entityManager->getRepository(Cases::class)->find($id);
        if (!$object instanceof Cases) {
            throw new NotFoundHttpException('Entity with '.$id.' not found');
        }

        return $this->decoratedController($request, $object);
    }
}

我已经在以下位置注册了它services.yml

services:
    App\Controller\CaseWork\Pend\PendCaseController: ~
    App\Decorator\PendCaseDecorator:
        decorates: App\Controller\CaseWork\Pend\PendCaseController

这样我就可以继续使用我的 DTO 并传回一个Cases实体对象。

于 2019-09-23T18:13:07.630 回答