gpt4 book ai didi

php - Symfony @ParamConverter : exclude the use if the placeholder does not contain a dot

转载 作者:可可西里 更新时间:2023-10-31 23:37:19 27 4
gpt4 key购买 nike

我有这个 Controller :

/**
* {@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
{
...
}

通过这种方式,像 http://example.com/entity/another-example.com 这样的 URL 与操作和相应的 another-example.com 相匹配实体被水合并传递给 Controller ​​。

现在,这个实体也有一个 ID。

我想拦截像 http://example.com/entity/12345 这样的 URL 并将其重定向到 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 的实体,我必须重定向)。

问题是,当 Controller 类 EntityController 使用 @ParamConverter 时,占位符被解释为一个域,结果是我得到一个 AppBundle:找不到实体对象。

那么,有没有办法只在占位符有一个点时应用@ParamConverter?或者,我可以使用哪些其他方法来使 redirectToIdAction 工作而不会引发 Not found 异常?

最佳答案

自定义的 ParamConverter 可能可以解决问题,但如果您不想制作一个,则必须对 ID 和域名使用不同的路由。

解决方案1

由于您的路由是在整个类上完成的,而不是在操作本身上完成的,恐怕您将不得不将重定向操作移至另一个 Controller 类。

之后可以根据需求选择性匹配ID和域名

/**
*@Route(
"entity/{domain_host}",
name="entity_domain",
requirements={"domain_host": "^(?=.*[\w])(?=.*[.]).+$"}
*)
*@ParamConverter(...)
*/
someActionOnDomainAction()
{
//...
}


/**
*@Route(
"entity/{id}",
name="entity_domain",
requirements={"id": "^[\d]$"}
*)
*/
redirectIdToDomainAction()
{
//...
}

解决方案2

或者,您可以将存储库方法 findOneByDomainHost() 更改为类似 findOneByDomainHostOrID() 的方法,并使其匹配域名和数字 ID。

通过这种方式,您可以解决 Object Not Found 错误,并且您始终可以获取实体的域名,并在同一 Controller 操作中进行重定向。

这是一个例子:

/**
* Class EntityController
*
* @Route("/entity/{domain_host}", name="domain_host")
* @ParamConverter("domain_host", class="AppBundle:Entity", options={
* "repository_method" = "findOneByHostOrID"
* })
*/
class EntityController extends Controller
{
/**
* @Route("/", name="show_domain_host")
* @param Entity $domain_host
*/
public function domain_hostAction(Entity $domain_host, Request $request)
{
$id = $domain_host->getId();
$host = $domain_host->getHost();

// Get the unconverted route parameter.
$parameter = $request->attributes->get('_route_params')['domain_host'];

if ($parameter == $domain_host->getId()){
// If the route parameter matches the ID,
// redirect to the same route using the domain host.
$url = $this->generateUrl('show_mail', ['mail' => $lib]);
return $this->redirect($url, 301);
}

return new Response("<html><body>$id $host</body></html>");
}
}

和存储库类:

class EntityRepository extends EntityRepository
{
public function findOneByHostOrID($domain_host)
{
if (preg_match("[\\d]",$domain_host)) {
return $this->findOneById($domain_host);
} else {
return $this->findOneByHost($domain_host);
}
}
}

关于php - Symfony @ParamConverter : exclude the use if the placeholder does not contain a dot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40845380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com