我有这个控制器:
/**
* {@inheritdoc}
*
* @Route("entity/{domain_host}")
* @ParamConverter("entity", class="AppBundle:Entity", options={
* "repository_method" = "findOneByDomainHost",
* "mapping": {"domain_host": "domainHost"},
* "map_method_signature" = true
* })
*/
class EntityController extends Controller
{
...
}
这样,一个URL如http://example.com/entity/another-example.com
会被匹配并对应的another-example.com
实体会被解析并传递给控制器。
现在,这个实体也有一个ID。
我想拦截一个URL如http://example.com/entity/12345
并将其重定向到http://example.com/entity/another-example.com
。
为了做到这一点,我在EntityController
中创建了另一个方法:
/**
* {@inheritdoc}
*
* @Route("entity/{domain_host}")
* @ParamConverter("store", class="AppBundle:Entity", options={
* "repository_method" = "findOneByDomainHost",
* "mapping": {"domain_host": "domainHost"},
* "map_method_signature" = true
* })
*/
class EntityController extends Controller
{
public function redirectIdToDomainAction(Request $request)
{
die(dump($request));
// Following will be the redirect logic
}
}
在我的 routing.yml
文件的顶部:
entity_id_to_domain:
path: /entity/{id}
defaults: { _controller: AppBundle:Entity:redirectIdToDomain }
requirements:
id: ^[^.]*$
methods: [GET]
实际上,如果占位符不包含句点(句点是区分标志),则调用redirectIdToDomain
操作:如果占位符有句点,传递一个域,如果没有句点,则占位符可能表示一个通过uts ID的实体,我必须进行重定向。
问题在于,控制器类EntityController
使用了@ParamConverter
,因此占位符始终被解释为域,结果是我得到了一个AppBundle:Entity object not found.
的异常。
那么,是否有一种方法只在占位符有句点时应用@ParamConverter
?或者,我可以使用哪些其他方法来使redirectToIdAction
正常工作而不抛出Not found
异常?