Cakephp 和 Croogo 交叉模型

Cakephp and Croogo cross models

我使用 Croogo 作为主要系统。并为其构建了一个自定义插件。我们称它为 MyPlugin。

Croogo 和 MyPlugin 都有模型 User。

MyPlugin 的控制器应该使用 MyPlugin.User class(默认)。它也被手动包含在 $uses 数组中。

在本地 PC 上一切正常。但由于某些原因,在客户端的服务器上它忽略了 MyPlugin.User 模型并使用 Croogo 的默认 User.User 模型。 任何想法为什么以及如何解决?

同一命名空间中不能有两个同名的 class。

如果你有这个:

<?php

// App/Model/User.php
class User extends AppModel

还有这个

<?php

// Plugins/MyPlugin/Model/User.php
class User extends MyPluginAppModel {

不行。

您可能认为它有效,但会发生的是首先加载 class 的那个(然后用“this class 表示该文件”填充缓存)是那个无论您尝试使用哪种用户模型,都将使用 load/reference。这也是 App/ClassRegistry classes 工作方式中内置的:

$x = ClassRegistry::init('User');
$y = ClassRegistry::init('My.User');
$z = ClassRegistry::init('Other.User');

$x === $y === $z

以上 不是 意味着它们都是 app/Model/User.php 中 class 的实例 - 取决于其余应用程序代码的执行顺序它将是其中任何一个的伪随机实例。

解决方案

唯一的解决办法是使用不同的 class 名称,这样就不会有名称冲突,例如:

<?php

// Plugins/MyPlugin/Model/MyPluginUser.php
class MyPluginUser extends MyPluginAppModel {

请注意,这不仅会影响模型 classes,还会影响应用程序中的所有 classes - 例如controllers