如何通过 yaml 将自定义路由绑定到控制器的方法而不触发来自 api-platform 和 symfony 的自动查询?
How to bind a custom route to a method of a controller via yaml without triggering an automatic query from api-platform and symfony?
- 我有一个基于 api-平台的简单 symfony 项目。
- 我有一个名为“MyEntity”的实体。
- 我有一个资源 yaml 配置文件来告诉 api-平台如何通过 api 调用查询我的实体。
- 在 yaml 中,我添加了一个名为
exportcsv
的路由,暴露为 export
,它会被我的前台调用 url : http://127.0.0.1:8000/api/myentitys/export
.
- 此路由映射为从 MyEntity 控制器调用导出方法。
- 在 MyEntity 控制器中,我有一个名为
export
的方法,除了倾倒一句话然后死掉(dd('why?!');
),我什么都不做。
预期行为:
- 调用导出 url
- 在 server/database 上什么都不应该做,前面只会收到字符串
why?!
的转储
实际行为:
- 调用导出 url
- 在名为 myentity
的 table'db 上执行查询
- 然后接收字符串的转储
why?!
我在向 table 添加数据时发现了查询。
随着我在 table 上添加更多数据,性能变得越来越长。
我永远不会在某个时候达到 Why?!
。
我检查了我的数据库,发现 myentity table 上的 select 都处于活动状态。
我在文档上搜索了一下,唯一能找到的是:
pagination_partial: true
在 yaml 中将此添加到 export
路由时,它仍会执行查询,但由于现在已分页,因此花费的时间会少很多。
我的问题是:
如何完全删除此查询?
在Controller/MyEntityController.php中:
namespace App\Controller;
use App\Entity\MyEntity;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
// use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelInterface;
class MyEntityController// extends AbstractController
{
private ParameterBagInterface $params;
private EntityManagerInterface $entityManager;
public function __construct(ParameterBagInterface $params, EntityManagerInterface $entityManager)
{
$this->params = $params;
$this->entityManager = $entityManager;
}
public function export(KernelInterface $kernel): array
{
dd("why?!");
}
// ...
}
在 ressource/entity.yaml 中:
resources:
App\Entity\MyEntity:
shortName: ~
description: ~
attributes:
order:
referenceCafHuissier: asc
montantEcheance: asc
# security: 'is_granted("ROLE_USER")'
normalization_context:
groups: ['myentity:read']
denormalization_context:
groups: ['myentity:write']
properties:
...
collectionOperations:
...
exportcsv:
security: 'is_granted("ROLE_MYENTITY_ADMIN")'
# pagination_partial: true
method: 'GET'
path: '/myentity/export'
controller: 'App\Controller\MyEntityController::export'
openapi_context:
summary: Export CSV
parameters: []
responses:
'200':
description: Génération réussi de l'export CSV
content:
application/json:
schema:
type: object
properties:
type:
type: string
description: mime-type du fichier.
content:
type: string
description: Base64 du contenu du fichier.
您所说的查询很可能是由 ReadListener
提出的。
要禁用它,请将 read
属性 设置为 false
,如 here 所述:
collectionOperations:
exportcsv:
method: get
path: /pensions/export
# ...
read: false
- 我有一个基于 api-平台的简单 symfony 项目。
- 我有一个名为“MyEntity”的实体。
- 我有一个资源 yaml 配置文件来告诉 api-平台如何通过 api 调用查询我的实体。
- 在 yaml 中,我添加了一个名为
exportcsv
的路由,暴露为export
,它会被我的前台调用 url :http://127.0.0.1:8000/api/myentitys/export
. - 此路由映射为从 MyEntity 控制器调用导出方法。
- 在 MyEntity 控制器中,我有一个名为
export
的方法,除了倾倒一句话然后死掉(dd('why?!');
),我什么都不做。
预期行为:
- 调用导出 url
- 在 server/database 上什么都不应该做,前面只会收到字符串
why?!
的转储
实际行为:
- 调用导出 url
- 在名为 myentity 的 table'db 上执行查询
- 然后接收字符串的转储
why?!
我在向 table 添加数据时发现了查询。
随着我在 table 上添加更多数据,性能变得越来越长。
我永远不会在某个时候达到 Why?!
。
我检查了我的数据库,发现 myentity table 上的 select 都处于活动状态。
我在文档上搜索了一下,唯一能找到的是:
pagination_partial: true
在 yaml 中将此添加到 export
路由时,它仍会执行查询,但由于现在已分页,因此花费的时间会少很多。
我的问题是:
如何完全删除此查询?
在Controller/MyEntityController.php中:
namespace App\Controller;
use App\Entity\MyEntity;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
// use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelInterface;
class MyEntityController// extends AbstractController
{
private ParameterBagInterface $params;
private EntityManagerInterface $entityManager;
public function __construct(ParameterBagInterface $params, EntityManagerInterface $entityManager)
{
$this->params = $params;
$this->entityManager = $entityManager;
}
public function export(KernelInterface $kernel): array
{
dd("why?!");
}
// ...
}
在 ressource/entity.yaml 中:
resources:
App\Entity\MyEntity:
shortName: ~
description: ~
attributes:
order:
referenceCafHuissier: asc
montantEcheance: asc
# security: 'is_granted("ROLE_USER")'
normalization_context:
groups: ['myentity:read']
denormalization_context:
groups: ['myentity:write']
properties:
...
collectionOperations:
...
exportcsv:
security: 'is_granted("ROLE_MYENTITY_ADMIN")'
# pagination_partial: true
method: 'GET'
path: '/myentity/export'
controller: 'App\Controller\MyEntityController::export'
openapi_context:
summary: Export CSV
parameters: []
responses:
'200':
description: Génération réussi de l'export CSV
content:
application/json:
schema:
type: object
properties:
type:
type: string
description: mime-type du fichier.
content:
type: string
description: Base64 du contenu du fichier.
您所说的查询很可能是由 ReadListener
提出的。
要禁用它,请将 read
属性 设置为 false
,如 here 所述:
collectionOperations:
exportcsv:
method: get
path: /pensions/export
# ...
read: false