当前位置:  开发笔记 > 编程语言 > 正文

为CakePHP中的每个URL添加前缀

如何解决《为CakePHP中的每个URL添加前缀》经验,为你挑选了2个好方法。

在CakePHP中为每个URL添加前缀的最简洁方法是什么,比如语言参数?

http://example.com/en/controller/action
http://example.com/ru/admin/controller/action

它需要使用"真实"前缀admin,并且理想情况下/controller/action可以将裸URL 重定向到/DEFAULT-LANGUAGE/controller/action.

它现在正在为我提供一个改装的应用程序,但它有点像黑客,我需要在大多数链接中手动包含语言参数,这是不好的.

所以问题是双重的:

构造路由的最佳方法是什么,因此默认情况下隐式包含语言参数,而不必为每个新定义的路由指定?

Router::connect('/:controller/:action/*', ...) 应该隐含地包含前缀.

该参数应该在$this->params['lang']或类似于要评估的地方可用AppController::beforeFilter().

Router::url()如果没有明确指定,如何自动在URL中包含前缀?

Router::url(array('controller' => 'foo', 'action' => 'bar')) 应该回来 /en/foo/bar

由于Controller::redirect(),Form::create()甚至Router::url()直接需要具有相同的行为,因此覆盖每个单独的功能实际上并不是一种选择.Html::image()例如,应该生成一个无前缀的URL.


似乎可以调用以下方法Router::url.

Controller::redirect

Controller::flash

Dispatcher::__extractParams 通过 Object::requestAction

Helper::url

JsHelper::load_

JsHelper::redirect_

View::uuid,但仅适用于哈希生成

在那些看起来似乎需要覆盖控制器和助手方法,我可以没有JsHelper.我的想法是编写一个通用函数,AppController或者只是在bootstrap.php处理参数插入.重写的Controller和Helper方法将使用此功能,如果我想手动调用,则会使用此功能Router::url.这还够吗?



1> deceze..:

这基本上是我为解决这个问题而实现的所有代码(至少我认为是全部;-)):

/config/bootstrap.php

define('DEFAULT_LANGUAGE', 'jpn');

if (!function_exists('router_url_language')) {
    function router_url_language($url) {
        if ($lang = Configure::read('Config.language')) {
            if (is_array($url)) {
                if (!isset($url['language'])) {
                    $url['language'] = $lang;
                }
                if ($url['language'] == DEFAULT_LANGUAGE) {
                    unset($url['language']);
                }
            } else if ($url == '/' && $lang !== DEFAULT_LANGUAGE) {
                $url.= $lang;
            }
        }

        return $url;
    }
}

/config/core.php

Configure::write('Config.language', 'jpn');

/app_helper.php

class AppHelper extends Helper {

    public function url($url = null, $full = false) {
        return parent::url(router_url_language($url), $full);
    }

}

/app_controller.php

class AppController extends Controller {

    public function beforeFilter() {
        if (isset($this->params['language'])) {
            Configure::write('Config.language', $this->params['language']);
        }
    }

    public function redirect($url, $status = null, $exit = true) {
        parent::redirect(router_url_language($url), $status, $exit);
    }

    public function flash($message, $url, $pause = 1) {
        parent::flash($message, router_url_language($url), $pause);
    }

}

/config/routes.php

Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
Router::connect('/:language/', array('controller' => 'pages', 'action' => 'display', 'home'), array('language' => '[a-z]{3}'));
Router::connect('/:language/pages/*', array('controller' => 'pages', 'action' => 'display'), array('language' => '[a-z]{3}'));
Router::connect('/:language/:controller/:action/*', array(), array('language' => '[a-z]{3}'));

这允许默认URL /controller/action使用默认语言(在我的情况下为JPN),URL /eng/controller/action使用替代语言.这个逻辑可以在router_url_language()函数中很容易地改变.

为此,我还需要为每个路由定义两个路由,一个包含/:language/参数,另一个不包含.至少我无法弄清楚如何以另一种方式做到这一点.


@gacrux请注意,这在Cake 1.3中应该不那么复杂,它包括可自定义的前缀.以上适用于Cake 1.2,它只知道*one*前缀.:)

2> Joe Phillips..:

来自IRC的rchavik建议这个链接:用于i18n和l10n国际化和本地化的基于CakePHP URL的语言切换

总的来说,似乎压倒一切Helper::url可能就是解决方案.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有