完全自定义路径与YII?

时间:2013-03-05 06:53:05

标签: yii

我有各种各样的产品,有自己的设定路径。例如:

  1. 电子设备/ mp3播放器/索尼hg122
  2. 健身/装置/ gymboss
  3. 如果希望能够以此格式访问网址。例如:

    http://www.mysite.com/fitness/devices/gymboss
    http://www.mysite.com/electronics/mp3-players/sony-hg122
    

    我的策略是覆盖SiteController的“init”函数,以便捕获路径,然后将其指向我自己的渲染函数实现。但是,这不允许我抓住这条路。

    我是以错误的方式去做的吗?这样做的正确策略是什么?

    **编辑**

    我想我必须使用URL manager。但是,如果路径格式在数据库中都是自定义格式,我该如何动态添加它?

2 个答案:

答案 0 :(得分:2)

对于大多数Yii系统来说,Eskimo的设置是一个很好的方法。但是,对于您的,我建议您创建一个自定义UrlRule来查询您的数据库: http://www.yiiframework.com/doc/guide/1.1/en/topics.url#using-custom-url-rule-classes

注意:每个Yii请求都会解析URL规则,因此请注意。如果效率不高,您可以迅速放慢网站速度。默认情况下,缓存规则(如果您有缓存设置),但我不知道这是否适用于动态数据库规则(我认为不会)。

答案 1 :(得分:1)

在您的网址管理器( protected / config / main.php )中,将urlFormat设置为path(并将showScriptName设置为false (这隐藏了URL的index.php部分))

'urlManager' => array(
    'urlFormat' => 'path',
    'showScriptName'=>false,

接下来,在您的规则中,您可以设置如下内容:

catalogue/<category_url:.+>/<product_url:.+> => product/view,

所以它的作用是将 catalog / electronics / ipods 这样的结构路由和请求到 ProductController actionView 。然后,您可以访问网址的category_urlproduct_url部分,如下所示:

$_GET['category_url'];
$_GET['product_url'];

此规则的工作原理是,任何以单词目录开头的网址(直接在您的域名之后),后跟另一个单词(category_url)和另一个单词(product_url),被引导到那个控制者/行动。

你会注意到,在我的例子中,我在类别和产品之前的单词目录。显然你可以用你喜欢的任何东西来代替它,或者把它全部放在一起。我把它放进去的原因是,请考虑以下网址:

http://mywebsite.com/site/about

如果您遗漏了网址的“目录”部分,并将您的规则定义为:

<category_url:.+>/<product_url:.+> => product/view,

网址管理器会将网址的网站部分视为category_url值,将约会部分视为product_url。为了防止这种情况,您可以拥有URL的目录版本,或者为非目录页面定义规则(即;为 site / about 定义规则)

规则从上到下解释,只匹配第一个规则。显然,您可以根据需要为所需数量的URL结构添加任意数量的规则。

我希望这可以帮助您走上正确的道路,随时对您需要的任何问题或说明进行评论