dos8244
2010-03-01 02:15
浏览 47
已采纳

CakePHP Router :: connect()别名?

Is it possible in CakePHP to have URL aliases in routes.php? Or by what other means can achieve something equivalent:

Lets assume I have some paginated views. Among the possible orderings there are particular ones I want to bind to a simple URL. E.g.:

How do I add parameters to a Router::connect()? Pseudo code:

Router::connect('/'.__('headlines',true),
        array(
        'controller' => 'posts',
        'action' => 'listView'
        'params' => 'page:1/sort:Post.created/direction:desc',
        )
);
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • drm30963 2010-03-01 02:40
    已采纳

    Note that the Router "translates" a URL into Controllers, Actions and Params, it doesn't "forward" URLs to other URLs. As such, write it like this:

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

    I don't think '/'.__('headlines', true) would work, since the app is not sufficiently set up at this point to translate anything, so you'd only always get the word in your default language back. Also, you couldn't switch the language anymore after this point, the first use of __() locks the language.

    You would need to connect all URLs explictly. To save you some typing, you could do this:

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

    That will create a $this->param['named']['lang'] variable, which you should use in the URL anyway.

    点赞 打赏 评论
  • douyo770657 2012-12-19 20:35

    Yes, it is possible... Bootstrap.php loads before routes so if you set there something like:

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

    ...and in your app controller in beforeFilter:

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

    So initial page render you prompt for language, redirect to xy.site.com or www.site.com/xy whatever you prefer. Now second render will change $language and on page links and set $_SESSION['lang']...

    All router links like:

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

    will become:

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

    or:

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

    100% tested, works in CakePHP 2.2. Also further improvement is possible if you put subdomain/language url parser in the bootstrap itself...

    点赞 打赏 评论

相关推荐