1

Croogo をメインシステムとして使用しています。そして、そのためのカスタムプラグインを構築しました。これを MyPlugin と呼びましょう。

Croogo と MyPlugin の両方にモデル User があります。

MyPlugin のコントローラーは MyPlugin.User クラスを使用する必要があります (デフォルト)。$uses 配列にも手動で含まれています。

すべてがローカル PC で正常に動作します。しかし、クライアントのサーバーでは、何らかの理由で MyPlugin.User モデルを無視し、Croogo のデフォルトの User.User モデルを使用しています。なぜ、どのように修正するのですか?

4

1 に答える 1

2

同じ名前空間に同じ名前の 2 つのクラスを含めることはできません。

あなたがこれを持っている場合:

<?php

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

この

<?php

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

うまくいきません。

あなたはそれがうまくいくと思うかもしれませんが、何が起こるかというと、どのクラスが最初にロードされるか(そして、「このクラスはそのファイルを意味する」とキャッシュに入力されます)は、ロードしようとするユーザーモデルに関係なく使用されるものです/参照。これは、App/ClassRegistry クラスの動作にも組み込まれています。

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

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

上記は、それらがすべて in のクラスのインスタンスであることを意味するものではありませapp/Model/User.php。アプリケーション コードの残りの実行順序によっては、それらのいずれかの疑似ランダム インスタンスになります。

解決

唯一の解決策は、名前の競合がないように異なるクラス名を使用することです。

<?php

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

これはモデル クラスだけに影響するのではなく、アプリケーション内のすべてのクラスに影響することに注意してください

于 2015-09-09T10:42:20.437 に答える