【问题标题】:Symfony generate links for twig rendered emails sent with cron tasksSymfony 为使用 cron 任务发送的 twig 渲染电子邮件生成链接
【发布时间】:2014-06-05 21:12:33
【问题描述】:

我在使用 Symfony 上的 twig 呈现的电子邮件中生成路径时遇到了一些问题

这就是我正在做的事情

<a href="{{ domain_parameter ~ path('news_homepage') }}"> My Link </a>

关于parameters.yml

domain_parameter: http://mydomain.com

关于路由

news_homepage:
    pattern:  /news
    defaults: { _controller: newsBundle:News:index }

然后我发送带有 cron 任务的电子邮件

在这样做的同时,我希望得到如下所示的网址:

http://mydomain.com/news

但我明白了:

http://mydomain.com/website.com/web/app.php/news

如果我使用“url”而不是“path”,结果会是:

http://localhost/var/www/website.com/web/app.php/news

您对我如何才能使其按预期工作有任何想法吗?提前谢谢你

【问题讨论】:

  • 您的 .htaccess 文件中有内容吗?您为默认路径定义了什么设置,以便在使用path 命令时获得website.com/...
  • Javad,在我的 apache 虚拟主机中,我将 mydomain.com 的“根”定义为绑定到 Symfony 项目所在的文件夹 /var/www/website.com/
  • 是的,但是如果您将website.com 定义为您的虚拟主机,那么path 命令不应显示website.com/web/app.php/something 它应该只打印/Symfony/web/app.php/something。确保您在config.yml 中对默认路径进行了正确配置
  • 是 Javad,但它在所有情况下都能很好地工作(它会生成您期望的链接,例如“website.com/news”),但使用 CRON 时除外
  • 虽然这听起来你在 crontab 中有问题。您能否提供您在 shell 脚本中的内容或您在 crontab 中调用的内容?

标签: email symfony dns cron


【解决方案1】:

你的链接中不应该有 web/app.php,所以你可能想改变你的 htaccess

如果你想在那里“只拥有正确的域”,你可以尝试 |replace like:

{{ path('news_homepage')|replace({'website.com': domain_parameter}) }}

另外,path() 应该只给你 /news 所以你的配置似乎有问题

【讨论】:

  • 实际上,当我在应用程序内部生成带有请求上下文的链接时,路径效果很好。它不起作用的唯一情况是当我使用带有 CRON 的路径时(所以没有上下文请求),使用替换过滤器的解决方案是正确的谢谢,但我想把它作为最后的机会,我希望有一些“更清洁”的东西使用
  • 您也可以在您执行的命令中设置主机名:Symfony 文档在这里为您提供了解决方案:symfony.com/doc/current/cookbook/console/sending_emails.html 好像没有适当的请求,您必须为上下文提供适当的手动主机名,通过配置或在上下文对象中设置。所以你可以使用: $this->container->get('router')->getContext()->setHost('myhostname');
  • Bartlomiej,它仍然会生成像 mydomain.com/website.com/web/app.php/news 这样的路由,同时按照你的建议手动设置上下文的主机
  • 检查您的配置目录(在 config.yml 或 parameters.yml 或任何一个 .yml 文件中)或 htaccess 文件中是否没有“website.com”
  • 不,除了将链接mydomain.com 重写为mydomain.com/web/app.php/[URL_PARAMS] 的重写之外,我别无他法
【解决方案2】:

Javad 的解决方案是更好的解决方案。

我最终创建了命令类,而不是使用 HTTP 请求调用的控制器。

为了在每个命令中都有一个请求上下文,我指定了这个:

$requestCtx = $container->get('router')->getContext();
$requestCtx->setHost($container->getParameter('app_domain'));
$requestCtx->setBaseUrl('');
$requestCtx->setScheme('http');

我还用“url”替换了所有“路径”函数(来自我用来生成电子邮件的树枝模板),由于指定的上下文,现在可以生成预期的链接。

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 2017-07-25
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2017-11-26
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多