【问题标题】:CakePHP pages without controller in urlurl 中没有控制器的 CakePHP 页面
【发布时间】:2013-06-02 10:18:28
【问题描述】:

是否可以在 URL 中没有控制器的情况下进行页面路由,但其他控制器仍然可以工作?示例:

执行以下操作可以使 URL 中没有 /pages/ 的页面,但如果我尝试访问任何其他控制器,它就不起作用:

  • 发件人:Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
  • 收件人:Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'index'));

有没有办法设置路由器,以便它运行控制器/动作(如果存在)。如果没有,它会运行页面控制器/动作?

【问题讨论】:

  • 我正在思考您的问题,但仍然无法完全理解。您想将 2 个不同的控制器 /w 操作与一个 URL 匹配吗?顺便说一句,您应该知道您可以使用哪些操作并相应地创建路线。从您问题的最后一行,我想您有包含控制器和操作的 URL,对吗?如果它不存在,您想从页面控制器运行一些操作吗?好吧,你看,我真的无法理解这一点,所以如果你以某种方式向我解释,我也许可以帮助你。
  • @luboss 感谢您的参与,对于我的表述不够清晰,我深表歉意。基本上我希望可以在domain.com/pagename 访问页面,但为此创建路由意味着如果我尝试访问控制器,它将无法工作,因为它认为控制器是一个页面。示例:对于domain.com/users/edit/1,Cake 会认为用户是一个页面而不是一个控制器......现在我选择了 Dave 的答案。我认为没有真正的“解决方案”。唯一的方法是明确告诉 Cake 哪些路由是页面。
  • 好的,我现在明白了。我认为通过正则表达式匹配参数的能力是你能得到的最好的,所以是的,你做对了。但是,如果您像 Router::connect('/:pagename', array('controller' => 'Pages', 'action' => 'display')); 这样定义路由并在显示操作中获取像这样 $pagename = $this->params->pagename; 这样的参数,则另一个 url (domain.com/users/edit/1) 将保持不受影响,因为它有额外的位,而不仅仅是以这种方式定义路由(/edit/1),只要您没有冲突的 url 匹配项,您就不必枚举页面名称。
  • 当然,当尝试访问某些控制器(如 domain.com/users 而不是 domain.com/users/index)的索引功能时,它会影响 URL,但您可以通过在您定义的中添加一些独特的东西来解决这个问题页面通过给该 url 一个 .html 扩展名来路由或区分它。

标签: php cakephp cakephp-2.1


【解决方案1】:

实际上,我通过为每个控制器而不是每个页面添加路由,以与 Dave 上面的回答相反的方式解决了这个问题。 (我不会经常添加新控制器,但我会定期添加新内容。)

// define an array of all controllers that I want to be able to view the index page of
$indexControllers = array('posts','events','users');

//create a route for each controller's index view
foreach ($indexControllers as $controller) {
    Router::connect(
        '/' . $controller,
        array(
            'controller' => $controller,
            'action' => 'index'
        )
    );
}

//create a route to remove 'view' from all page URLs
Router::connect(
    '/:title',
    array(
        'controller' => 'contents',
        'action' => 'view'
    ),
    array(
        'pass' => array('title'),
        'title' => '[a-z0-9_\-]*'
    )
);

【讨论】:

    【解决方案2】:

    我知道我迟到了,但这是我给正在寻找这个的人的提示。

    routes.php

    foreach(scandir('../View/Pages') as $path){
      if(pathinfo($path, PATHINFO_EXTENSION) == "ctp"){
        $name = pathinfo($path, PATHINFO_FILENAME);
        Router::connect('/'.$name, array('controller' => 'pages', 'action' => 'display', $name));
      }
    }
    

    这将为 View/Pages 文件夹中的每个 ctp 文件创建一个路由。

    【讨论】:

    • 如果您使用主题,不起作用。那些:book.cakephp.org/2.0/en/views/themes.html.
    【解决方案3】:

    我认为简短的回答是,不 - 这不可能以您希望的方式*。路由并不是真正的“逻辑”驱动,所以除非你能想出一种方法来匹配你想要的东西在这两个方面你不能做“如果控制器存在,那么_,否则_ “那种东西。

    *但是,您可以将每个“页面”作为一行添加到您的路线文件中。这将允许直接访问“about”、“contact” ...等,而与它们不完全匹配的内容将由其余路由处理。

    【讨论】:

    • 我想知道这是不是真的,afaik,默认路由是由 CakePHP 编译的,以匹配所有可用的控制器/动作路由,所以如果自定义路由是在 之后定义的默认路由,它应该“通过”并由自定义路由处理?
    • 谢谢戴夫。我明确定义了我拥有的页面。 @thaJeztah我认为问题在于蛋糕认为控制器是页面名称而不是忽略页面规则。有关更多详细信息,请参阅我对问题的评论。
    • @thaJeztah - 我认为问题是,它将“匹配”为控制器/动作(字符串/字符串),然后它会查找该控制器并在找不到时出错。
    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多