1

Cake の Auth コンポーネントをアプリに統合しました。ほとんど問題なく動作しているように見えますが、ログインすると次のようなエラーが頻繁に発生します。

エラー: 未定義のメソッドの呼び出し Security::getDataSource()
ファイル: C:\xampp\htdocs\ips-mvc\lib\Cake\Model\Datasource\DboSource.php
行: 1063

これが何を意味するか分かりますか?

記録のために、私のアプリには というモデルがありSecurityます。Cake で予約済みのモデル名を認識していませんでしたが、Securitymdoel が Cake コンポーネントと競合している可能性はありますか? このエラーは、モデルが使用されていない場合でも発生する可能性がありますがSecurity、外観は非常に散発的です。ページを更新すると、すべてが正常に機能することがあります。

何か案は?

4

1 に答える 1

1

このエラーは、モデル インスタンスを期待するメソッドにコンポーネント インスタンスを渡すことによって発生し、使用中のコンポーネントと同じ名前のモデル クラスを作成しないことで簡単に回避できます。

モデルとコンポーネントに同じ名前を付けることはできません

モデルにはクラス名サフィックスがありませんが、コンポーネントにはあるため、この問題はクラス名の重複とは関係ありません。

ただし、たとえば、コントローラーでは次の構文を使用します。

$this->{$alias}

コンポーネント (クラス名)またはモデル (クラス名) の両方にアクセスするために使用されます。{$alias}Component$alias

そのため、コンポーネントと同じ名前のモデルを持つと、どちらかにアクセスできなくなります。

キャッシュポイズニング

しかし、問題はそれだけではありません。オブジェクトは、キーとしてエイリアスを使用してクラス レジストリに格納されます。

たとえば、モデルでは次のようになります。

 ClassRegistry::addObject($this->alias, $this);

同じエイリアスが使用されている場合 (セキュリティ モデルSecurityComponent) - キー "セキュリティ" を占有するオブジェクトは、単にレジストリに追加される最初のオブジェクトです - "セキュリティ" に対する後続のすべての要求は、そのオブジェクトを返します。

キャッシュの有効期限と、モデルとコンポーネントが同じリクエストで使用されているかどうかに応じて、問題のようなエラーが表示される頻度と、それらが「ランダム」または再現可能かどうかが決まります。

于 2013-11-05T11:50:20.170 に答える