1

我是 cakePHP 新手,我希望在我的应用程序中重写我的网址。

对于我想要导航的一些控制器。

`controller/action/id/slug`.

为此,我将规则写为,

Router::connect(
        '/products/:id/:slug', array('controller' => 'products', 'action' => 'view'), array('pass' => array('id'), 'id' => '[0-9]+')
);

我正在写链接作为..

echo $this->Html->link($record['Category']['name'], array('controller' => 'categories', 'action' => 'index', 'slug' => $record['Category']['slug']), array('escape' => false)); 

问题

  1. 规则是否仅适用于提到的控制器和操作,即产品和视图。?

  2. 为什么我的网址(悬停时)显示为controller/action/slug:slug_name而不是controller/action/slug_name

  3. 在同一个控制器中,我希望使用不同的 url 重写,例如action/id/slug_name我发送的/action某个地方或我只使用 slug的某个地方action/slug_name。是否只有一条规则适用于所有人?或者我必须为每个控制器和操作定义单独的规则。

  4. 也为所有控制器创建通用规则?

请描述更多。我试图阅读文档,但有点困惑。我的参数如何获得我提到的所有类型的请求。

现在写我只使用简单的方法来获取参数

 controller/action/param1:param_val1/param2:param_val2,
 echo $this->Html->link('Val', array('controller' => 'categories',
 'action' => 'index', 'param1' => param_val1, 'param2' => param_val2,),
 array('escape' => false));

等等。但我希望有非常清晰的漂亮网址以及更好更快的动作。就像传递 slug 我希望直接获取 findBySlug 或某种使它变得更好的方式。

4

1 回答 1

3

1) 是的,当你创建一个Router::connect 规则时只适用于一种情况,即适用于一个url 或group os url。

2)你应该这样做

echo $this->Html->link($record['Category']['name'], array('controller' => 'categories', 'action' => 'index',  $record['Category']['slug']), array('escape' => false));

3)您必须为这些url创建规则,只有当url的结构不同时

根据您的示例,规则如下

# only for action/slug_name case
Router::connect('/products/:slug', array('controller' => 'products', 'action' => 'view'), array('pass' => array('slug'), 'slug'=>'[a-z_]+'));
# for action/id/slug_name case
Router::connect('/products/:id/:slug', array('controller' => 'products', 'action' => 'view'), array('pass' => array('id','slug'), 'id' => '[0-9]+','slug'=>'[a-z_]+'));

4) 我建议你在不使用 CakePHP 的 HTML 组件的情况下编写 url。不是因为它不好,而是因为它更快更容易

而不是这样做

controller/action/param1:param_val1/param2:param_val2,
 echo $this->Html->link('Val', array('controller' => 'categories','action' => 'index', 'param1' => param_val1, 'param2' => param_val2,),array('escape' => false));

这样做要好得多:

controller/action/param_val1/param_val2

 echo 'controller/action/'.$param_val1.DS.$param_val2;

也更适合 SEO,并且对 url 友好

于 2012-10-17T06:51:00.167 回答