Cakephp中每个子域的不同数据集?

时间:2011-09-04 14:39:54

标签: cakephp

我正在编写个人书签应用程序,并且正在寻找一种在子域之间具有完全不同内容的方法。

我编写了应用程序并且工作正常,但还没有实现多个集合。我有以下型号:

  • 标签(目前尚未使用)
  • 书签
  • 主题

书签按主题分类,我打算将来允许标记,看看是否有助于我更轻松地管理书签。

我当前遇到的问题是我想将书签整体分开。我想使用像webdevelopment.bookmarks.locallanguages.bookmarks.locallinux.bookmarks.local这样的子域,它们可以使用一整套域和书签。

我正在考虑添加一个名为Set的新模型(“书签集”的缩写),并根据子域定义集。

根据该计划,我必须在整个App中重写所有$this->...->find - 查询以包含条件"set_id" = $SubdomainBasedSetid"

虽然它不会那么多工作,但我想知道它是否可以更聪明地完成,也许Cake只会看到每个子域的相关书签集。

2 个答案:

答案 0 :(得分:1)

好吧,你的解决方案是正确的。但是,您可以使用前缀,而不是使用子域,因此您无需自行检查和设置。由于您使用子域,我假设这些集是固定的或很少更改。所以你真的不需要一个集合表,只需在书签记录中直接使用集合名称,这样你就不必在名称和id之间进行转换。

答案 1 :(得分:0)

  

根据该计划,我必须在整个应用程序中重写所有$this->...->find - 查询以包含条件"set_id" = $SubdomainBasedSetid"

由于所有模型都扩展了AppModel,因此可以在它们发生之前编辑所有查询(即DRY)。 :)

// app/app_model.php
class AppModel extends Model {

    public function beforeFind($queryData) { // old query
        // make changes
        return $queryData; // new query
    }

但是,如果您不希望所有型号都使用此功能(或者即使您现在都这样做),更好的地方可能是一种行为,因为这允许您选择加载的位置和时间:

// app/models/behaviors/subdomain.php
class SubdomainBehavior extends ModelBehavior {

    protected $_defaults = array('field' => 'Site.subdomain');

    public function setup(&$model, $config = array()) {
        $this->settings[$model->alias] = array_merge($this->_defaults, $config);
    }

    public function beforeFind(&$model, $queryData) {
        $domain = $_SERVER['SERVER_NAME'];
        $subdomain = substr($domain, 0, strpos($domain, "."));
        $queryData['conditions'][$this->settings['field']] = $subdomain;
        return $queryData;
    }

}

// app/app_model.php
class AppModel extends Model {

    $actsAs = array('Subdomain' => array('field' => 'Set.slug'));

}
  
      
  • 标签(目前尚未使用)
  •   

为了节省重新发明的轮子,您可能需要查看CakeDC的tagsutils插件(后者包含SluggableBehavior,这有助于生成友好的网址部分,例如子域)。