首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CakePHP子域路由& Misc

CakePHP子域路由& Misc
EN

Stack Overflow用户
提问于 2012-03-20 00:56:11
回答 1查看 4.1K关注 0票数 2

背景:构建一个web应用程序(作为CakePHP的介绍),它允许用户管理休息室。休息室由博客、联系人、日历等组成。每个休息室都与一个子域相关联(所以jcotton.lounger.local会带你去我的休息室)。站点的根,用于创建新的休息室、注册用户等,托管在lounger.local上。我正在使用Cake2.0。

问题:

  1. 我希望能够将与根站点(lounger.local)相关的操作和视图从单独的休息室(lounger.local的子域)中分离出来。经过大量的研究,我决定做以下工作。我设置了一个前缀路由“休闲”,并在routes.php中添加了以下代码。与休息室相关联的操作(和视图)都包含前缀休息室(例如: lounge_index())。你怎么处理这件事? if(preg_match('/^(^.+).lounger.local$/',env(“HTTP_HOST”,$matches)){ $prefix =“休闲”;路由器:连接(‘/’,数组(‘控制器’=> 'loungememberships',动作‘=>’索引,‘前缀’=> $prefix,$prefix =>真));当前不使用插件路由器::/*::/*(“/:plugin/:控制器”、数组(‘action’=> 'index‘、’前缀‘=> $prefix、$prefix => true));*/路由器::连接(“/:controller”,数组(‘action’=> 'index',‘前缀’=> $prefix,$prefix => true‘);路由器::connect(“/:控制器/:action/*”,数组(’前缀‘=> $prefix,$prefix => true));unset($prefix);};
  2. 每当用户在休息室内执行一个操作(例如在博客中发布评论、添加联系人等)时,就必须查找lounge_id (基于子域);这是验证用户被授权执行该操作并将相应数据与正确的休息室关联起来所必需的。我已经通过beforeFilter函数在AppController中实现了这一点。每次收到带有子域的请求时,都执行搜索,并将lounge_id写入会话变量。然后,每个控制器加载CakeSession并读取相应的lounge_id。这比调用ClassRegistry::Init(‘酒廊’)和在每个控制器中进行查找要好吗?有更好的溶胶吗?

提前感谢您的帮助

EN

回答 1

Stack Overflow用户

发布于 2012-08-06 05:24:48

我处理这个问题的方式是使用一个自定义路由,以及一些与您的示例类似的路由配置的诡计。

首先,我有一个“主域”,它被重定向到并用作多租户站点的主域。我还存储了一个我希望他们采取的默认操作。我将这些存储在配置变量中:

代码语言:javascript
复制
Configure::write('Domain.Master', 'mastersite.local');
Configure::write('Domain.DefaultRoute', array('controller' => 'sites', 'action' => 'add'));

接下来,我在DomainRoute中创建了一个/Lib/Route/DomainRoute.php路由类。

代码语言:javascript
复制
<?php
App::uses('CakeRoute', 'Routing/Route');
App::uses('CakeResponse', 'Network');
App::uses('Cause', 'Model');

/**
 * Domain Route class will ensure a domain has been setup before allowing
 * users to continue on routes for that domain. Instead, it redirects them
 * to a default route if the domain name is not in the system, allowing
 * creation of accounts, or whatever.
 *
 * @package default
 * @author Graham Weldon (http://grahamweldon.com)
 */
class DomainRoute extends CakeRoute {

/**
 * A CakeResponse object
 *
 * @var CakeResponse
 */
    public $response = null;

/**
 * Flag for disabling exit() when this route parses a url.
 *
 * @var boolean
 */
    public $stop = true;

/**
 * Parses a string url into an array. Parsed urls will result in an automatic
 * redirection
 *
 * @param string $url The url to parse
 * @return boolean False on failure
 */
    public function parse($url) {
        $params = parent::parse($url);
        if ($params === false) {
            return false;
        }

        $domain = env('HTTP_HOST');
        $masterDomain = Configure::read('Domain.Master');

        if ($domain !== $masterDomain) {
            $defaultRoute = Configure::read('Domain.DefaultRoute');
            $Cause = new Cause();
            if (!($Cause->domainExists($domain)) && $params != $defaultRoute) {
                if (!$this->response) {
                    $this->response = new CakeResponse();
                }

                $status = 307;
                $redirect = $defaultRoute;
                $this->response->header(array('Location' => Router::url($redirect, true)));
                $this->response->statusCode($status);
                $this->response->send();
                $this->_stop();
            }
            $params['domain'] = $domain;
        }

        return $params;
    }

/**
 * Stop execution of the current script.  Wraps exit() making
 * testing easier.
 *
 * @param integer|string $status see http://php.net/exit for values
 * @return void
 */ 
    protected function _stop($code = 0) {
        if ($this->stop) {
            exit($code);
        }
    }

}

此自定义路由类用于在/Config/routes.php文件中设置多租户。

代码语言:javascript
复制
if (env('HTTP_HOST') === Configure::read('Domain.Master')) {
    // Master domain shows the home page.
    $rootRoute = array('controller' => 'pages', 'action' => 'display', 'home');
} else {
    // Subdomains show  the cause view page.
    $rootRoute = array('controller' => 'causes', 'action' => 'view', env('HTTP_HOST'));
}
Router::connect('/', $rootRoute, array('routeClass' => 'DomainRoute'));

在检查自定义路由器时,您将看到我正在提取正在访问的当前域,并将其添加到$params数组中。

虽然这并不能直接实现您所追求的目标,但是轻微的修改将使您按照您的需求走上正确的轨道。关于自定义路由的信息不多,但是这里是定制路由类的CakePHP文档链接

我希望这能帮上忙!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9780065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档