CakePHP - 管理路由为/ admin /,但不是所有的其余(设置默认管理员false的方式?)

CakePHP - 管理路由为/ admin /,但不是所有的其余(设置默认管理员false的方式?)

问题描述:

我阅读教程,并发现要使用“管理员”前缀,您可以取消注释:CakePHP - 管理路由为/ admin /,但不是所有的其余(设置默认管理员false的方式?)

Configure::write('Routing.prefixes', array('admin')); 

config/core.php文件。

我做到了,我的管理路由工作得很好 -/admin/users/add在我的users_controller中添加了admin_add()函数。

问题是 - 它也改变了我的正常链接 - 即。我的“注销”按钮现在尝试转到/ admin/users/logout而不是/ users/logout。我意识到我可以添加'admin'=> false,但我宁愿不必为我的网站中的每个链接都这样做。

有没有办法让它只与'admin'=> true或/ admin/...一起转到管理员,而不是所有其他链接?

+0

这是因为Cake在生成视图时使用了相关的url。这有助于在不同的插件/自定义路线中使用,但当您需要静态路线时则是PITA。你需要扩展帮助程序或使用静态字符串(这意味着你必须改变它们) – JohnP 2011-04-08 06:30:34

+0

@JohnP你会推荐哪些?扩展帮助程序或使用静态字符串?我之前在*中提出过这个问题,并且同意使用这个数组更好,所以这就是我所做的 - 但现在听起来像静态可能会更好/更容易?像往常一样,这取决于是否需要 – Dave 2011-04-08 06:43:03

+0

。数组的优点是,因为你发送命名参数,蛋糕会根据路由确切地知道如何制作你的url。如果你使用静态字符串,这取决于你。如果你知道项目的范围,静态字符串是可以的。更容易的是将url帮助器扩展/包装到你自己的帮助器中。这将涵盖所有的基地 - 1)短弦2)易于使用3)可扩展。 – JohnP 2011-04-08 06:46:37

扩大用户阿爸科比的编辑,看看如何烹调手册创建一个帮助:http://book.cakephp.org/view/1097/Creating-Helpers

如果有禁用手动路由上所有的链接是一个烦恼(这将是我的! ),您可以创建一个新的帮助程序MyCustomUrlHelper(名称不必那么长),并让它使用核心UrlHelper为您生成URL。

class MyCustomUrlHelper extends AppHelper { 
    public $helpers = array('Html'); 

    function url($controller, $action, $params ,$routing = false, $plugin = false) { 
     //Example only, the params you send could be anything 
     $opts = array(
      'controller' => $controller, 
      'action'  => $action 
      //.... 
     ); 

    } 

    //another option 

    function url($params) { 
     //Example only, the params you send could be anything 
     $opts = array(
      'controller' => $params['controller'], 
      'action'  => $params['action'] 
      //.... 
     ) 
    } 

    //just fill up $opts array with the parameters that core URL helper 
    //expects. This allows you to specify your own app specific defaults 

    return $this->Html->url($opts); //finally just use the normal url helper 
} 

基本上,你可以使它作为冗长或简洁,只要你想。它只是一个实际的URL助手的包装类,它将从内部完成工作。这使您可以为您的特定应用程序提供默认值。这也可以让你在一个地方做出改变,并让整个应用程序的路由更新。

编辑

你也可以检查通过$是否选择采用阵列是一个字符串。这样你就可以拥有两全其美的了。

+0

太棒了,谢谢!它不会让我给予奖励(22个小时),但这是我正在寻找的答案 - 我非常感谢! – Dave 2011-04-08 07:17:38

+0

@Dave没有问题:) – JohnP 2011-04-08 07:18:18

+0

所以 - 当我创建我的链接时,我会做这样的事情:$ this-> Html-> link('点击这里',$ this-> MyUrls-> url('restaurants ','view')); – Dave 2011-04-08 07:30:44

确保如果您使用您处理它在的HtmlHelper前缀的路由::链接调用像这样

<?php 
    ... 
    echo $html->link(array(
     'controller' => 'users', 
     'action' => 'logout', 
     'plugin' => false, 
     'admin' => false, 
    )); 
    ... 
?> 

**编辑** 你可以在你的AppHelper视察延长URL功能传递数组并将Routing.prefixes键设置为false,如果它们尚未在url调用中设置。

然后,您需要每次在管理链接中指定前缀。

+0

请在回答之前阅读完整的问题。 “我意识到我可以添加'admin'=> false,但我宁愿不必为我的网站中的每个链接都这样做。” (谢谢你的回答,但它不回答我的问题) – Dave 2011-04-05 16:40:05

+0

你的编辑听起来像我可能想要做的 - 你能带我走向正确的方向吗?如果我能使它起作用,并且编辑你的原始答案,我可能会将它标记为“已回答”! – Dave 2011-04-07 14:16:44

+0

我已经为这个问题添加了50个信誉奖励 - 如果你能够更好地解释我将如何扩展url函数(也许有w /一个例子?),我很乐意将它标记为答案,并给你代表去瓦特/它。 – Dave 2011-04-08 06:16:11

HtmlHelper接受两种给定URL的方式:它可以是一个Cake相对URL或一组URL参数。

如果您使用URL参数,默认情况下如果您未指定'admin'=> false参数,则HtmlHelper会自动以“admin”为前缀添加动作前缀。

恕我直言,摆脱此参数最简单的方法是使用Cake相对URL作为字符串。

<?php 
//instead of using 
//echo $this->Html->link(__('logout', true), array('controller' => 'users', 'action' => 'logout')); 

//use 
echo $this->Html->link(__('logout', true), '/users/logout'); 

亲切的问候,

尼科

+0

相对URL是否阻止我稍后改变路由? – Dave 2011-04-05 20:21:03

+0

我不确定明白你的意思。 '/ users/logout'将始终指向控制器'用户'的操作'logout()'(而不是admin_logout()或whatever_prefix_logout())。 (当然,如果你没有在routes.php中为这个URL配置一个特定的路由) – nIcO 2011-04-05 20:41:36

+0

顺便说一句,当我开始使用Cake时,我曾经写过带有参数数组的链接,但我很快意识到它是恕我直言使用字符串参数更稳定(更少冗长) – nIcO 2011-04-05 20:47:25

这一周,我遇到了这个问题,这似乎代码来修复它。让我知道,如果它不适合你,我可以尝试找出我做了什么来让它工作。

$this->Auth->autoRedirect = false; 
$this->Auth->loginAction = array(Configure::read('Routing.admin') => false, 'controller' => 'users', 'action' => 'login'); 
$this->Auth->logoutRedirect = array(Configure::read('Routing.admin') => false, 'controller' => 'users', 'action' => 'logout');  
$this->Auth->loginRedirect = array(Configure::read('Routing.admin') => false, 'controller' => 'users', 'action' => 'welcome'); 

这真令人沮丧,所以我很乐意帮忙。

+0

好吧,我也加入到我的用户控制器,这不是最好的,但可能做到了。 'function admin_login(){ \t $ this-> redirect(array('action'=>'login')); }' – Nick 2011-04-05 20:18:11

+0

问题是,它将前缀admin /添加到页面上的每个链接上,而不仅仅是注销按钮。我的意思是......即使我的导航试图去/ admin /饭店的餐厅页面。 – Dave 2011-04-05 20:25:04

,我迟到了,但我有一个很好的答案:

您可以通过创建一个AppHelper类覆盖缺省行为。除非它被指定当你调用链接()或URL(),管理员将被设置为false

<?php 
class AppHelper extends Helper{ 

    function url($url = null, $full = false) { 
     if(is_array($url) && !isset($url['admin'])){ 
      $url['admin'] = false; 
     } 
     return parent::url($url, $full); 
    } 
} 
?> 

:创建应用程序/ app_helper.php并粘贴以下。

+1

我喜欢这个答案,但问题是1.3 - 你可以在CakePHP 1.3中做到这一点吗? – Dave 2012-03-27 02:52:16