在Cakephp中的所有URL中添加子域

kSe*_*udo 0 subdomain cakephp

如果用户会话中存在子域,我希望所有Cakephp网址都使用子域名...因此,如果用户会话中有一个条目"子域名:用户",则所有页面都将以"用户"作为前缀:例如用户.example.com,user.example.com/settings.

是否有捷径可寻?

谢谢,

kSeudo

tig*_*ang 6

您可以使用自定义路由类.在APP/Lib/Route中创建一个名为UserSubdomainRoute.php的文件并将其放入其中.

<?php
App::uses('AuthComponent', 'Controller/Component');
class UserSubdomainRoute extends CakeRoute {

/**
 * @var CakeRequest
 */
    private $Request;

/**
 * Length of domain's TLD
 *
 * @var int
 */
    public static $_tldLength = 1;

    public function __construct($template, $defaults = array(), $options = array()) {
        parent::__construct($template, $defaults, $options);

        $this->Request = new CakeRequest();
        $this->options = array_merge(array('protocol' => 'http'), $options);
    }

/**
 * Sets tld length
 *
 * @param $length
 * @return mixed void|int
 */
    public static function tldLength($length = null) {
        if (is_null($length)) {
            return self::$_tldLength;
        }

        self::$_tldLength = $length;
    }

/**
 * Writes out full url with protocol and subdomain
 *
 * @param $params
 * @return string
 */
    protected function _writeUrl($params) {
        $protocol = $this->options['protocol'];
        $subdomain = AuthComponent::user('subdomain');
        if (empty($subdomain)) {
            $subdomain = 'www';
        }
        $domain = $this->_getDomain();
        $url = parent::_writeUrl($params);

        return "{$protocol}://{$subdomain}.{$domain}{$url}";
    }

/**
 * Get domain name
 *
 * @return string
 */
    protected function _getDomain() {
        return $this->Request->domain(self::$_tldLength);
    }

}
Run Code Online (Sandbox Code Playgroud)

该类的一个改进可能是使$ Request静态.

不幸的是在Cake 2.0中没有办法设置defaultRotueClass,但是,我在2.1+中添加了该功能,我不想告诉你升级所以你将不得不为第三个中的所有路由手动指定它像这样的param:

Router::connect(..., ..., array('routeClass' => 'UserSubdomainRoute');
Run Code Online (Sandbox Code Playgroud)

一定要在routes.php的顶部添加

App::uses('UserSubdomainRoute', 'Lib/Route');
Run Code Online (Sandbox Code Playgroud)

如果你升级到2.1+,你可以在routes.php的顶部添加它

Router::defaultRouteClass('UserSubdomainRoute');
Run Code Online (Sandbox Code Playgroud)

然后,之后指定的任何路径都将使用该路由类.

路由类的主要部分是_writeUrl方法.它会检查subdomain会话中是否有密钥集,否则使用www并构建完整的url以返回.

抬头:没有测试过班级,仍然在学校只想给你一个快速启动.它只是我的SubdomainRoute的一个修改版本,其工作方式略有不同(它只用于匹配某个子域设置时的路由,因为我的应用中的ex匹配clients子域到我的ClientsAdminPanel插件.你可以在这里抓住它:http:// bin .cakephp.org/view/50699397如果你需要UserSubdomainRoute和我的SubdomainRoute(在链接中)的组合,你可以看到它是如何完成的.

希望现在有所帮助.如果有任何问题,请告诉我.

编辑:这是如何强制重定向 - 有些东西告诉我有更好的方法.我会更新,如果我能想到它.

public function beforeFilter() {
     $subdomains = $this->request->subdomains();
     $subdomain = $this->Auth->user('subdomain');
     if (!empty($subdomain) && !in_array($subdomain, $subdomains)) {
        $this->redirect('http://' . $subdomain . '.site.com' . $this->request->here);
     }
}
Run Code Online (Sandbox Code Playgroud)