【问题标题】:CakePHP Router::connect() aliases?CakePHP Router::connect() 别名?
【发布时间】:2010-03-01 02:15:36
【问题描述】:

CakePHP 中是否可以在 routes.php 中使用 URL 别名?或者通过什么其他方式可以达到同等的效果:

假设我有一些分页视图。在可能的排序中,有一些我想绑定到一个简单的 URL。例如:

如何向 Router::connect() 添加参数?伪代码:

Router::connect('/'.__('headlines',true),
        array(
        'controller' => 'posts',
        'action' => 'listView'
        'params' => 'page:1/sort:Post.created/direction:desc',
        )
);

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    请注意,路由器将 URL“翻译”为控制器、操作和参数,它不会将 URL“转发”到其他 URL。因此,这样写:

    Router::connect('/headlines',
        array(
            'controller' => 'posts',
            'action' => 'listView'
            'page' => 1,
            'sort' => 'Post.created',
            'direction' => 'desc'
        )
    );
    

    我不认为'/'.__('headlines', true) 会起作用,因为此时该应用程序尚未充分设置以翻译任何内容,因此您只能始终以默认语言获取单词。另外,在这之后你不能再切换语言了,第一次使用__()锁定语言。

    您需要明确连接所有 URL。为了节省您的打字时间,您可以这样做:

    $headlines = array('en' => 'headlines', 'de' => 'schlagzeilen', ...);
    foreach ($headlines as $lang => $headline) {
        Router::connect("/$headline", array('controller' => ..., 'lang' => $lang));
    }
    

    这将创建一个 $this->param['named']['lang'] 变量,您应该在 URL 中使用它。

    【讨论】:

    • 您不必在匹配的 URL 中包含使用的参数吗?/headlines/:page/:sort 等。如果我不能在这里使用 __ 就不再重要了 :( 谢谢指出这一点!
    • @sibidiba URL 与将调用的控制器操作以及将传递给它的参数之间没有 1:1 的关系。只是默认情况下匹配是直截了当的。路由器是 URL -> 调用转换发生的地方,它是你可以极大影响它的地方。查看更新的答案...
    • @sibidiba 你的意思是'/'.__() 有效吗?有不同的语言吗?
    【解决方案2】:

    是的,有可能...... Bootstrap.php 在路由之前加载,所以如果你设置如下:

    session_start();
    if(isset($_SESSION['lng'])){
        Configure::write('Config.language', $_SESSION['lng']);
    }
    

    ...在你的应用控制器中的 beforeFilter:

    $language = 'xy';
    Configure::write('Config.language', $language);
    $_SESSION['lng'] = $language;
    

    因此,初始页面会提示您输入语言,重定向到 xy.site.com 或 www.site.com/xy,无论您喜欢什么。现在第二个渲染将更改$language 和页面链接并设置$_SESSION['lang']...

    所有路由器链接如:

    Router::connect(__('/:gender/search/:looking_for/*'), array('controller' => 'users', 'action' => 'search'));
    

    会变成:

    Router::connect(__('/:gender/trazi/:looking_for/*'), array('controller' => 'users', 'action' => 'search'));
    

    或:

    Router::connect(__('/:gender/suche/:looking_for/*'), array('controller' => 'users', 'action' => 'search'));
    

    100% 测试,适用于 CakePHP 2.2。如果您将子域/语言 url 解析器放在引导程序本身中,也可以进一步改进......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 2020-07-05
      • 2012-08-09
      • 1970-01-01
      相关资源
      最近更新 更多