2011-04-27 48 views
0

我尝试连接下一个网址:CakePHP的路由器:连接,我没有得到语法

1)/food/tips
2)/happiness/tips/best_tips

以下对象:
1)controller=tips/action=index/passed_parameters=food
2)controller=tips/action=index/passed_parameters=(happiness,best_tips)

- 编辑 -
这些路线不固定。
含义:我试图做的是将具有tips作为动作的每个url路由到提示控制器,到任何固定的(索引足够好的)动作,并链接原始调用中的其余url 。 喜欢的东西/any_controller/tips/any_param/tips/index/any_params
- 编辑完 -

希望,现在有一些感觉。

应该怎么做? (请 - 也解释)

感谢

回答

1

路由全部通过调用Router :: connect('catch to','where send to');

所以可以简单:

Router::connect('/food/tips', '/tips/index/food'); 

或优选的方法(使用内建在网址构建蛋糕)

Router::connect('/food/tips/*', array('controller' => 'tips', 'action' => 'index', 'food'); 

第一种方法采用一个字符串参数,并把它传递给另一字符串,这将是一个网址,你将不得不赶上你的控制器,并期望通过URL传递参数。

第二种方法使用内置URL前这需要用钥匙控制器和动作的阵列的蛋糕(还有其他选择:http://api.cakephp.org/class/router#method-Routerurl) 第二优选由于正确的格式和未来的灵活性(I相信)。

第二种方法中的任何传递参数都只是作为数组中未命名的项目传递。命名参数仅作为键控元素传递。所以,如果我想创建这样一个URL这个

/职位/索引/查找:所有/页:2

我会写这样的网址:

Router::connect('/url_to_catch', array('controller' => 'posts', 'action' => 'index', 'find' => 'all', 'page' => 2); 

所以只是为了完成,我实际上将通过你的参数通过命名:

Router::connect('/happiness/tips/best_tips', array('controller' => 'tips', 'action' => 'index', 'items' => array('happiness', 'best_tips')); 

这将需要一个有趣的在你的提示控制器中,看起来像这样:

function tips(){ $this->passedArgs['items']; } 
1

这是很容易,只是检查Router configuration in the manual。您必须使用Router类中的connect方法。这接受2个参数。首先您需要的路由(例如food/tips),然后是第二个具有应该遵循的实际路径的阵列。因此,对于你的例子你会做这样的事情:

Router::connect('/food/tips', array('controller' => 'tips', 'action' => 'index', 'food'); 
Router::connect('/happiness/tips/best_tips', array('controller' => 'tips', 'action' => 'index', 'happiness', 'best_tips'); 

这分别相当于调用TipsController->index('food')TipsController('happiness', 'best_tips)

但是,您的路线看起来有点有趣。路由的Cake约定是/controller/action/param1/param2/etc,其中参数param1等是可选的,并且在没有给出其他动作时采取index动作。

您采取了不同的方法,我建议(如果可以的话)将其更改为Cake常规路由,因为这将为您节省大量工作,因为Cake会自动将这些路由连接到所需的方法。

所以我的建议是tips/foodtips/happiness/best_tips而不是你建议的路线。这样,你不必做任何路由器配置。

UPDATE

后你是编辑,我认为这是最好的尝试一些与defining custom routes。我不能在此刻测试这个给你,所以你应该做一些测试自己,但在这种情况下,它会是这样的:

Router::connect('/:section/tips/:param', 
    array('action' => 'index'), 
    array(
     'section' => '[a-z]*', 
     'param' => '[a-z]*' 
    ) 
); 

UPDATE2

对不起,我测试过上面和它似乎没有工作。

+0

啊你打我吧!我想我输入缓慢;) – 2011-04-27 15:26:59

+0

谢谢@ vindia,这不是解决我的问题(我的错,我会编辑原来的问题) 至于约定,我的问题是,我有一个提示控制器,但没有提示部分。 。所以我需要将每个'节/提示'路由到提示控制器... – yossi 2011-04-27 16:06:44

+0

谢谢,我尝试了几个教程和guides.same结果。无法路由基于动作值的控制器..不知道为什么 – yossi 2011-04-28 14:55:45

1

我会推荐阅读关于路由本书的章节,因为它会解释比我更好的东西,而且在这里粘贴它似乎反作用。

http://book.cakephp.org/#!/view/948/Defining-Routes

为了解释起见,我会尝试,

Router::connect('/food/tips', array('controller' => 'tips', 'action' => 'index', 'food')); 
Router::connect('/happiness/tips/best_tips', array('controller' => 'tips', 'action' => 'index', 'happiness','best_tips')); 

这应该让为你工作的事情。你实际上做的是告诉Cake Routing你想要捕获哪个url,因为它会使用Regex来做这件事。然后你想告诉它你想让它运行哪个代码。因此,这需要一个Controller和Action对,作为一组要做的事情。

之后你也想通过你的命名参数。这些将会添加到控制器中的功能,以便您可以对它们进行操作。

+0

感谢@DavidYell,当我写给@ vindia时,我将编辑该问题。 – yossi 2011-04-27 16:07:41

+0

是的,我认为你试图达到的是不好的。从Cake的角度来看非常糟糕。你会发现它很难。我建议为此搜索堆栈。 – 2011-04-27 17:04:42

+0

@DavidYell - “搜索”堆栈?含义? – yossi 2011-04-27 17:16:32

相关问题