jjzjj

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

coder 2024-04-19 原文

我有这个 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/

有关php - Symfony @ParamConverter : exclude the use if the placeholder does not contain a dot的更多相关文章

  1. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  2. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  3. ruby - 通过 node-sass 的 Symfony assetic sass 过滤器? - 2

    我在让asseticsass过滤器与node-sass而不是ruby​​替代品一起工作时遇到了一些困难。我的config.yml文件中有以下配置:assetic:debug:"%kernel.debug%"use_controller:falsebundles:[]write-to:"%kernel.root_dir%/../web/assets"read_from:"%kernel.root_dir%/../web/assets"node:"%%PROGRAMFILES%%\nodejs\\node.exe"node_paths:["%%USERPROFILE%%\\AppData\

  4. ruby-on-rails - PHP 魔术方法 __call、__get 和 __set 的 Ruby 等价物 - 2

    我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob

  5. ruby - Lisp - 是否适合网络编程/应用程序(交互式)? ruby 的方式是? php的方式是? - 2

    Lisp是否适合Web编程/应用程序(交互式),就像ruby​​和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common

  6. 软件工程毕业设计课题(81)微信小程序毕业设计PHP校园跑腿小程序系统设计与实现 - 2

        项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHP+MySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。意义:手机网络时代,大学生通过手机网购日常用品、外卖外卖、代取快递等已不再是稀奇的事情。此外,不少高校还流行着校园有偿工作,校园跑腿就成了大学生创业服务项目。        因为你在校园里,所以不会有进入的限制。并不是所有的外卖平台都可以随意进入校园,比如小黄和小蓝的双打外卖平台。许多大学禁止送餐进入学校,更不用说送餐进入宿舍了。这一措施使得校园服务市场的竞争相对不

  7. K8s部署PHP项目 - 2

    前言    前端时间PHP项目部署升级需要,需要把Laravel开发的项目部署K8s上,下面以laravel项目为例,讲解采用yaml文件方式部署项目。一、部署步骤1.创建Dockerfile文件Dockerfile是一个用来构建镜像的文本文件,在容器运行时,需要把项目文件和项目运行所必须的组件安装其中。#基础镜像FROMphp:7.4-fpm#时区ARGTZ=Asia/Shanghai#更换容器时区RUNcp"/usr/share/zoneinfo/$TZ"/etc/localtime&&echo"$TZ">/etc/timezone#替换成阿里apt-get源RUNsed-i"s@http

  8. ruby-on-rails - PHP 开发人员学习 Ruby 和 Ruby on Rails - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我对学习Rails很感兴趣已经有一段时间了,我觉得现在正是浸入其中并实际动手实践的好时机。在过去的一周里,我阅读了所有我能找到的关于Ruby和RubyonRails的免费电子书。我刚刚读完RubyEssentials。我也一直在玩htt

  9. ruby-on-rails - Ruby 相当于 PHP 的 ucfirst() 函数 - 2

    在Ruby中(使用Rails,如果相关)将字符串首字母大写的最佳方法是什么?请注意String#capitalize不是我想要的,因为除了将字符串的首字母大写外,此函数还使所有其他字符变为小写(这是我不想要的——我想让它们保持原样):>>"aA".capitalize=>"Aa" 最佳答案 在Rails中你有String#titleize方法:"测试字符串标题化方法".titleize#=>"测试字符串标题化方法" 关于ruby-on-rails-Ruby相当于PHP的ucfirst()

  10. php - Ruby 和 PHP HMAC 不一致 - 2

    我尝试在Ruby中创建一个HMAC,然后在PHP中验证它。ruby:require'openssl'message="A522EBF2-5083-484D-99D9-AA97CE49FC6C,1234567890,/api/comic/aWh62,GET"key="3D2143BD-6F86-449F-992C-65ADC97B968B"hash=OpenSSL::HMAC.hexdigest('sha256',message,key)phashPHP:对于Ruby,我得到:20e3f261b762e8371decdf6f42a5892b530254e666508e885c708c5b

随机推荐