【问题标题】:cakephp routing for cushycms preview linkcushycms 预览链接的 cakephp 路由
【发布时间】:2010-01-19 12:53:29
【问题描述】:

我有一组相当静态的页面,我将它们移到了views/pages 文件夹中。我的客户可以通过 CushyCMS 编辑生成的 *.ctp 文件(简单的 cms 非常适合虚拟校样编辑)。然而,CushyCMS 生成的预览链接显然没有考虑到 CakePHP。我想用自定义路由来解决这个小问题,但无法理解细节......

如何动态连接网址http://localhost:8888/cake125/app/views/pages/test.ctphttp://localhost:8888/cake125/pages/test

我在 routes.php 中添加了以下内容:

Router::connect('/pages/test.ctp', array(
  'controller' => 'pages',
  'action' => 'display', 'test'));

这适用于连接:http://localhost:8888/cake125/pages/test.ctphttp://localhost:8888/cake125/pages/test。不知何故,跟随 snibbet 并不能解决问题:

Router::connect('/app/views/pages/test.ctp', array(
  'controller' => 'pages',
  'action' => 'display', 'test'));

理想情况下,我希望有一个 Router::connect 语句,它将所有 /app/views/pages/*.ctp 请求连接到正确的位置。

最后,我还想正确处理旧版网站的谷歌搜索结果。像这样:

Router::connect('/test.html', array(
   'controller' => 'pages',
   'action' => 'display', 'test'));

这没问题,但我宁愿让 anypage.html 连接到 /pages/anypage。有人可以帮忙吗?

提前致谢!

【问题讨论】:

    标签: php cakephp routing


    【解决方案1】:

    首先,由于 Cake 位于子目录 (/cake125) 中,我认为您可能需要连接 /cake125/:controller/:action,而不是如何连接它。但是,不是 100%; Cake 可能足够强大以处理该用例。如果您有奇怪的错误,我会检查一下。

    我的回答是: 我认为您对 Router 类的工作方式有些误解。您使用 Router::connect 连接 URL,而不是相对文件系统路径。默认情况下(你可能已经删除了,但修复起来很简单),Cake 会将请求路由到 /pages/* 到 PagesController::display() 函数,并传递一个参数(http 请求中列出的操作)。

    因此,要让页面控制器将 /pages/one 映射到 app/views/pages/one.ctp 元素,只需确保以下(默认,即 Cake 通常具有此设置)行位于路由配置中(并确保其上方的行与该模式不匹配):

    Router::connect( '/pages/:action', array( 'controller' => 'pages', 'action' => 'display', :action);
    

    这应该确保在请求期间调用 PagesController::display( $action ),这就是(我认为)你所追求的。

    如果您的 CMS 生成了您想要正确重新路由的预览链接,我建议您添加一条新路由。例如,如果您的 CMS 生成像 http://somesite.com/cms/preview/newly_edited_file 这样的链接,您可以像这样路由它:

    Router::connect( '/cms/preview/:action', array( 'controller' => 'pages', 'action' => 'display', :action );
    

    对于您的第二个问题:在您的路线中有一条默认规则(使其成为最后一条规则,并使其匹配 *)。然后将其配置为根据请求将所有未找到的请求路由到您的控制器/操作对。试试这个:

    Router::connect( '/:action', array( 'controller' => 'pages', 'action' => 'display', :action );
    

    主要警告这将破坏您现有的路线。您需要为每个现有控制器手动添加一个条目(Router::connect('/users/:action', ...etc...)。如果您在周围搜索,您可以找到一些巧妙的解决方案,例如在运行时为您生成该列表。但是,一旦您添加了该包罗万象(并确保您的包罗万象位于路由文件的末尾),您将需要解决“正常”路由问题。

    另外,如果您想解析 /test.html 之类的 URL,只需添加对 Router::parseExtensions(...) 的调用,以便 Cake 将 .html 注册为扩展名以供解析。有关更多信息,请查看该功能的手册。

    【讨论】:

    • 如果子目录中有 Cake,则无需更改路线。所有路线都与工作目录相关,您只需要关注应用程序“内部”的部分。其次,..., 'action' => 'display', :action); 会抛出 PHP 语法错误。你所追求的是..., 'action' => 'display'), array('pass' => array('action')));
    • 对了,忘了把 pass 参数放到一个数组里。 WRT 其他路由的东西,我不是说 Cake 是否在子目录中; OP 询问他如何将 CMS 生成的“预览”URL 路由到 Cake 中。但是,是的,我在上面的代码中有点懒惰,感谢您的更正!
    【解决方案2】:

    正如其他人已经指出 CakePHP 路由器是如何工作的,我将不再赘述。

    对于您问题的第二部分(处理旧链接),我建议将其添加到您的路线列表的末尾:

    Router::connect( '/:page', 
        array (
            'controller' => 'pages', 
            'action' => 'display',
        ), 
        array (
            'pass' => array ('page'),    // to pass the page as first arg to action
            'page' => '.+\.html$',       // to verify that it ends with .html
        )
    );
    

    不幸的是,您必须自己解析.html

    【讨论】:

    • 非常聪明和酷的代码片段。非常感谢。上面的答案没有给我任何希望,但是您的代码终于使它起作用了。 :D
    【解决方案3】:

    如何动态连接网址http://localhost:8888/cake125/app/views/pages/test.ctphttp://localhost:8888/cake125/pages/test

    嗯,问题是,你没有。 :-)

    我的意思是,您不会将一个 URL 连接到另一个 URL。你真正要做的是,让某些 URL 触发某些 Controller 函数(或简称为 Actions),这些函数可能(或可能不会)呈现 某些视图。默认情况下,这一切都是通过命名约定直接进行的。 URL /foo/bar 触发 Controller Foo 的 Action bar 并渲染 View /views/foo/bar.ctp

    PagesController 已经是一个特例了。 URL /pages/foo 触发控制器Pages 的动作display,将参数foo 传递给它,从而呈现视图/views/pages/foo.ctp。注意触发动作的区别。

    由于中间有很多步骤,因此不能确定某个 URL 对应于硬盘上的特定文件。 URL /foo/bar 可能会触发 Controller Baz' Action doh 渲染 View /views/narf/glob.ctp

    这使得翻译 http://localhost:8888/cake125/app/views/pages/test.ctp 以呈现文件 /views/pages/test.ctp 介于不确定和痛苦之间。


    编辑:

    话虽如此,您的具体问题是基本 URL 是http://localhost:8888/cake125/app/。您可以从 http://localhost:8888/cake125/http://localhost:8888/cake125/app/http://localhost:8888/cake125/app/webroot 调用 Cake 应用程序。所有三个 URL 都将由同一个文件 cake125/app/webroot/index.php 处理,如果您使用较短的 URL 之一,请求将通过 .htaccess 规则“转发”(重写)。

    所以你尝试连接的路线,Cake 看到的路线,实际上是/views/pages/test.ctp

    其实我的错,这可能不是问题,但这取决于你的.htaccess文件和服务器配置。


    这在 CMS 中似乎没有多大意义,因为每个新创建的页面都需要自己的规则。所以我建议不要尝试这样做,而是使用 Cake HtmlHelper 或 Router::url() 破解 Cushy 来正确构建 URL。如果做不到这一点,请将所有 URL 与一个通用规则连接到某个操作,在那里解析 URL 并 render“手动”正确的视图。

    或者,使用.htaccess 文件和重写规则将URL 实际重写为普通的Cake URL,这样Cake 就不必担心了。如上所述,这可能非常脆弱。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 2015-06-04
      • 2012-09-28
      • 2020-09-03
      • 1970-01-01
      • 2014-12-03
      • 2011-04-12
      • 2018-06-13
      • 2014-07-20
      相关资源
      最近更新 更多