动态地将模型名称传递给CakePHP插件

时间:2012-06-22 10:45:41

标签: cakephp cakephp-2.1 cakephp-appmodel

我在解决问题时遇到了问题,因此很难找到答案。希望你知道如何提供帮助。

我正在创建一个CakePHP 2.1插件,它将与一系列自己的模型进行交互: - 朋友 - 集团 - 用户

Friend and Group是专门为插件创建的模型,它们通常在插件中运行。但是,User模型实际上只是父应用程序中其他表的别名。

所以,如果"我的真棒申请"决定使用" My Awesome Plugin",它必须拥有自己的"用户"表(虽然它可能称为其他东西)。让我们说“我的真棒应用程序”#34;有一个名为MyUser的模型。 "我的真棒插件"想要动态地将其内部用户模型告诉$ useTable =" my_users"。

我的问题是,如何将该数据传递给插件?如何配置" My Awesome Plugin"要明白用户应该$ useTable" my_users&#34 ;;

2 个答案:

答案 0 :(得分:2)

据我了解,您希望PlugIn中的模型使用通常属于您的应用程序中的模型的表 - 按惯例。您是否尝试过静态设置:

public $useTable = "my_users";
插件中的

?所有插件通常在Cake启动时初始化,因此应该加载所有配置。为什么你需要这个 - 它确实限制了你很多?插件模型使用的表是否会改变运行时?

Model课程也有一些你可能会觉得有用的好东西:

$this->User->table;

保存模型的表名 - 当前正在使用的表为**。

您还可以使用以下命令为模型(在Controller内)设置源表:

$这 - >用户 - >的SetSource('表名);

**当您使用Model::setSource()时,我不确定这是否适用。在$this->User->table;来电之后查看Model::setSource()包含的内容会很有趣。

答案 1 :(得分:0)

我已经找到了实现这一目标的方法,但它可能并不适用于所有人的所有场景。

我在插件中创建了一个Component,然后在Controller中调用了Component。我通过组件传递用户Model的名称。这样,我可以获得有关用户模型的信息,我可以将其设置为我的插件的useTable,以便在插件中使用。

当然,这种方法限制我使用Component来使用插件,但这可能是最好的。

以下是我如何做到的一个例子:

// in the AppController
public $components = array(
'MyPlugin.MyPluginComponent' => array('userModel'=>'UserModelName')
);

// in the Plugin's Component
class MyPluginComponent extends Component {

function initialize($controller) {

    //get the base user model
    $this->UserModel = ClassRegistry::init($this->settings['userModel']);

    //set the useTable for our plugin's user model
    $this->PluginUser = ClassRegistry::init('MyPlugin.PluginUser');
    //set the useTable value for this model
    $this->PleaseUser->setSource($this->UserModel->useTable);
}

这似乎对我有用。希望这有助于其他人。