Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony1 symfony:没有用户的统一url';文化_Symfony1_Routing_Symfony 1.4 - Fatal编程技术网

Symfony1 symfony:没有用户的统一url';文化

Symfony1 symfony:没有用户的统一url';文化,symfony1,routing,symfony-1.4,Symfony1,Routing,Symfony 1.4,我正在考虑与我所在地区提供支付网关服务的商户合作的可能性。 特定商户使用“支付页面”概念,即我的网站的特定uri,例如http://www.mysite.com/culture1/cart/index将获得商户方的授权,以便继续进行用户付款 我的网站是用symfony 1.4构建的,支持i18n,因此我的所有路线都在url中嵌入了文化(/:sf_culture/…) i、 e对于文化1(默认值): 对于文化2: http://www.mysite.com/culture2/cart/index

我正在考虑与我所在地区提供支付网关服务的商户合作的可能性。 特定商户使用“支付页面”概念,即我的网站的特定uri,例如
http://www.mysite.com/culture1/cart/index
将获得商户方的授权,以便继续进行用户付款

我的网站是用symfony 1.4构建的,支持
i18n
,因此我的所有路线都在url中嵌入了文化(/:sf_culture/…)

i、 e对于
文化1
(默认值):

对于
文化2

http://www.mysite.com/culture2/cart/index
但是,如果支付从第二个url开始,它将无法从商户网站获得授权

那么,在symfony中,有没有办法通过同时保留用户的区域性,为特定模块中的特定操作创建一个统一的url(使用路由),而无需嵌入区域性信息

在这种情况下,目标是使用以下url进行授权:

http://www.mysite.com/cart/index

当然。您只需将其添加到您的
routing.yml
,而不需要
:sf\u文化。区域性保留在用户的属性上。因此,只有在您更改语言和SEO时才需要使用
:sf_文化。例如:

contacts:  
  url:   /:sf_culture/contacts
  param: { module: static, action: contacts }
  requirements: { sf_culture: (?:uk) } 
没有文化的相同路线:

contacts:  
  url:   /contacts
  param: { module: static, action: contacts }
仅在以下情况下为每个用户设置默认区域性:

    homepage:
      url: /
      param: { module: static, action: about}
      requirements: { sf_culture: (?:uk }

    localized_homepage:
      url: /:sf_culture
      param: { module: static, action: about}
      requirements: { sf_culture: (?:uk) }

apps/frontend/modules/static/action.class.php

    public function executeAbout(sfWebRequest $request)
  {


   if (!$request->getParameter('sf_culture'))
        {
        if ($this->getUser()->isFirstRequest())
            {
            $culture = $request->getPreferredCulture(array('uk'));
            $this->getUser()->setCulture($culture);
            $this->getUser()->isFirstRequest(false);
            }
        else
            {
            $culture = $this->getUser()->getCulture();
            }

            $this->redirect('localized_homepage');
        }
  }
//apps/frontend/lib/myUser.class.php

public function isFirstRequest($boolean = null)
{
  if (is_null($boolean))
  {
    return $this->getAttribute('first_request', true);
  }

  $this->setAttribute('first_request', $boolean);
}
如果用户输入了不包含区域性的链接,重要的是,它是先前确定的。(试一试)

您还可以在操作中设置区域性:

$this->getUser()->setCulture('uk');
更新:

如果请求中不存在sf_区域性变量,则表示用户已到达/URL。如果是这种情况,并且会话是新的,则首选区域性将用作用户区域性。否则将使用用户的当前区域性


它来自Jobeet教程。(

是。这就行了。非常感谢。顺便说一句,我不明白
executeAbout
方法中
else
语句的用途。请你详细说明一下好吗?也许我不够清楚:在我第一次评论中提到的地方,有一个
$culture
变量被设置并且从未读取过……这有什么原因吗?
$culture=$this->getUser()->getCulture()这不一定,除非您希望获取当前用户区域设置并以某种方式使用它,例如在某个查询中,或者在视图中的某个位置。您也可以只做:
$This->getUser()->setCulture($request->getPreferredCulture(array('uk'))没关系。是的,你是对的。我还没有意识到在用户的会话属性中存在这个变量。您和调试工具栏对此进行了说明。然而,我认为丹尼斯281的回答是可以接受的,因为他更彻底、更详细。尽管如此,我还是投了你一票;)
$this->getUser()->setCulture('uk');