【问题标题】:Symfony 4 Redirect without a custom controller没有自定义控制器的 Symfony 4 重定向
【发布时间】:2019-07-09 11:10:05
【问题描述】:

所以我面临的问题是,我无法在 routing.yml 中配置的重定向中使用通配符

homepage:
  path: /test/{wildcard}
  controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::urlRedirectAction
  defaults:
    path: /{wildcard}
    permanent: true

在默认路径中,我需要获取通配符路径。所以例如测试/通配符应该重定向到/通配符。 但 Symfony 所做的是,它重定向到 /{wildcard}。 那么如何获取通配符参数呢?

【问题讨论】:

  • 问题是,defaults: 下的path: /{wildcard} 不支持通配符,而是将其读取为 RedirectController 使用的文字值。您可以创建自己的 RedirectController 来读取操作路径中作为参数提供的通配符,并使用它来动态确定目标路径而不是指定它。原来的redirectAction 可以作为参考。
  • 是的,你是对的。所以为了解决这个问题,我自己创建了一个控制器,并将其用作上面配置中控制器参数中的参数。为了在控制器中获取通配符参数,我这样做了:$request->get('wildcard')
  • 您也可以直接将其添加到方法签名中:public function redirect(string $wildcard) { ... } 或使用$request->query->get('wildcard') 使用$request->get() 可能会令人惊讶,因为it looks at different parameter bags in a specific order。这里可能没什么大不了的,但它有助于防止奇怪的副作用并被推荐(参见 docblock)。
  • 嗯,不要认为将通配符添加到函数签名中是可能的,因为 symfony 无法将通配符参数解析为来自 url 的给定路径。如果将 /{wildcard} 添加到签名中,它只是将其作为参数传递,而不是实际值。或者你知道如何在配置中获取给定的通配符路径吗?

标签: php symfony symfony4


【解决方案1】:

所以为了回答我的问题。 解决方案如下: 您需要创建一个自定义的RedirectController,它能够处理 路由中的通配符。

这是控制器的外观:

<?php


namespace Custom\RedirectBundle\Controller;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;

class RedirectController
{

    public function urlRedirectAction(
        Request $request,
        bool $permanent = false,
        string $route = '',
        array $dynamicRoutePath =
        []
    ): RedirectResponse {
        $statusCode = $permanent ? 301 : 302;
        if ('' !== $route) {
            $url = "/".$route;
            if (!empty($dynamicRoutePath)) {
                $url = $this->getPath($request, $dynamicRoutePath, $url);
            }

            return new RedirectResponse($url, $statusCode);
        }
        $route = $this->getPath($request, $dynamicRoutePath);

        return new RedirectResponse($route, $statusCode);
    }

    private function getPath(Request $request, array $path, string $url = ''): string
    {
        foreach ($path as $pathParameter) {
            $pathconfig = $request->get($pathParameter);
            $url        = $url."/".$pathconfig;
        }

        return $url;
    }

}

routing.yml 中的配置:

magazin_category_slug:
  path: /magazin/{category}/{slug}
  controller: CustomRedirectBundle:Redirect:urlRedirect
  defaults:
    permanent: true
    route: newBaseRoute
    dynamicRoutePath:
      - category

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 2017-07-02
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多