0

サブドメインがユーザーセッションに存在する場合、すべてのCakephp URLでサブドメインを使用したい...したがって、ユーザーのセッションに「サブドメイン:ユーザー」というエントリがある場合、すべてのページにプレフィックスとして「ユーザー」が含まれます。例: user .example.com、user.example.com/settings。

これを行う簡単な方法はありますか?

ありがとう、

kSeudo

4

3 に答える 3

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);
    }

}

このクラスの改善点の 1 つは、おそらく $Request を静的にすることです。

残念ながら、Cake 2.0 では defaultRotueClass を設定する方法はありませんが、2.1+ でその機能を追加したので、アップグレードするように言いたくないので、3 番目のすべてのルートに対して手動で指定する必要があります。次のようなパラメータ:

Router::connect(..., ..., array('routeClass' => 'UserSubdomainRoute');

routes.php の先頭に必ず追加してください

App::uses('UserSubdomainRoute', 'Lib/Route');

2.1+ にアップグレードする場合は、routes.php の先頭にこれを追加するだけです。

Router::defaultRouteClass('UserSubdomainRoute');

その後に指定されたルートは、そのルート クラスを使用します。

ルート クラスの主要部分は_writeUrlメソッドです。subdomainセッションにキーが設定されているかどうかを確認します。それ以外の場合はwww、完全な URL を使用して構築して返します。

注意: クラスのテストはまだ行っていません。まだ学校にいるので、すぐに始めたいと思っています。これは私の SubdomainRoute の修正版であり、動作が少し異なります (以前は、特定のサブドメインが設定されている場合にのみルートを一致させていました。たとえば、私のアプリでは、clientsサブドメインをClientsAdminPanelプラグインに一致させます。ここでそれをつかむことができます: http://bin .cakephp.org/view/50699397UserSubdomainRouteしたがって、と myの組み合わせが必要な場合は、それがどのように行われるかを確認できます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);
     }
}
于 2012-05-11T17:40:02.377 に答える
0

すべてのリンクに対してこれを実行したい場合は、おそらく同じ方法でサイトのすべてのURLを表示しますが、$ this-> html-> link('/ blah / asd /'、'blahのようなものを使用しますか? '); ?

于 2012-05-11T16:10:43.320 に答える
0

IN Cake/Routing/Route

class SubdomainRoute extends CakeRoute {
public function match($params) {
    $subdomain = isset($params['subdomain']) ? $params['subdomain'] : null;
    unset($params['subdomain']);
    $path = parent::match($params);
    if ($subdomain) {
        $path = 'http://' . $subdomain . '.localhost' . $path;
    }
    return $path;
}
}

リンクを作成するときは、次のようにして、他のサブドメインを指すリンクを作成できます。

echo $this->Html->link(
    'Other domain',
     array('subdomain' => 'test', 'controller' => 'posts', 'action' => 'add')
);
于 2013-11-12T06:43:51.613 に答える