【问题标题】:Use a different table prefix for cakephp session database为 cakephp 会话数据库使用不同的表前缀
【发布时间】:2012-08-14 19:21:45
【问题描述】:

我想为我的会话数据库使用不同的表前缀。所以,在我的配置文件中,我的表前缀设置为“pre1_”,但我希望我的会话使用前缀为“pre2_”的表——这可能吗?

谢谢。

【问题讨论】:

    标签: php database session cakephp


    【解决方案1】:

    我在我的模型中注释了这条线,所以它不会被执行;

    //    public $tablePrefix = 'cc_';
    

    然后,在我的 AppController.php beforeFilter 中添加了

    $this->modelname->tablePrefix=$this->Auth->user('company_prefix').'_';
    

    在我的授权用户表中,我有一个名为 company_prefix 的字段,该字段被添加到该用户独有的某些表中。

    我希望看到更多关于这个主题的信息。

    我收到了很多'Indirect modification of overloaded property DifferentController::$Modelname has no effect'

    所以我正在寻找一种仅在添加模型或默认控制器时执行此操作的方法。我不希望每个控制器都有一个beforeFilter(),所以我想我必须做一些isset()

    【讨论】:

    • 到目前为止,我唯一想到的就是在新模型中实现会话处理程序接口,然后更改其中的前缀。我可能一直走在正确的轨道上,但我没有成功。
    【解决方案2】:

    对于 Cakephp 2.1 中的“公司”前缀 - 模型中的公共 $tablePrefix 并在控制器中设置 tablePrefix,这就是我正在做的事情,它的代码行太多(每个表一行代码每个用户一个前缀)但这是我现在能做的。

    Modela.php:

    public $tablePrefix = 'anything_';
    

    模型b.php:

    public $tablePrefix = 'anything_';
    

    Modelc.php:

    public $tablePrefix = 'anything_';
    

    然后在AppController的公共函数beforeFilter()中

    if (isset($this->Modela->tablePrefix)) {$this->Modela->tablePrefix = $this->Auth->user('company_code').'_'; }
    if (isset($this->Modelb->tablePrefix)) {$this->Modelb->tablePrefix = $this->Auth->user('company_code').'_'; }
    if (isset($this->Modelc->tablePrefix)) {$this->Modelc->tablePrefix = $this->Auth->user('company_code').'_'; }
    

    我没有以这种方式收到“属性重载”错误,但在我的架构中,我的所有用户都有一个有效的公司代码。例如,我还为所有用户共享了“用户”表(尽管只有管理员可以访问登录用户以外的用户记录)

    但是,我发现这相当麻烦,并且我对一种方法感兴趣,这种方法不需要将要由模型的 $tablePrefix company_code 设置隔离的每个模型都定义为 AppController 中的一行代码。我真正想为模型设置 tablePrefix 的点是我引用的那一刻

    $this->loadModel("Modelb"); 
    

    但是我花了 45 分钟在 Model 目录中使用 modelb.php 并且无法使用 $tablePrefix 属性做很多事情。当模型被实例化或引用时,我应该知道,对于那些需要 $tablePrefix 属性的表,所需的前缀,但我当时无法动态设置属性。 (动态静态属性?听起来是错误的方法)

    所以,即使这可行,我也不喜欢它。感觉就像我在 Lisp 程序中使用 Fortran 方法。

    【讨论】:

      【解决方案3】:

      在 ModelasController.php 中:

      $this->loadModel("Modelb");
      $this->Modelb->tablePrefix = $this->Auth->user('company_code');
      

      是使用第二个公司编码模型的正确方法,我不需要 beforeFind 逻辑。

      所以只有AppController对beforeFilter中的每一个可能的模型都有一行来设置tablePrefix,就像上面一样,使用php函数isset来检测模型。

      但是,当我使用 loadModel 将辅助模型拉入控制器时,我现在立即将 tablePrefix 设置为公司代码,我可以在控制器中访问它。这会进入模型对象并覆盖 tablePrefix 静态属性。

      【讨论】:

        【解决方案4】:

        我最终将 database.php 配置文件中的前缀更改为我希望会话表具有的前缀,然后在每个模型中将 $table_prefix 属性设置为所需的前缀。看起来有点奇怪,但它完成了工作。

        【讨论】:

          猜你喜欢
          • 2017-06-07
          • 1970-01-01
          • 1970-01-01
          • 2014-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多