0

UsersControllerとAnalyticsControllerの2つのコントローラーがあります。

私が走るとき:

//UsersController:
function dummyFunction(){
    $this->Analytic->_loadChartFromId($chart_id);
}

出力は次のとおりです。

Query: _loadChartFromId 

警告(512):SQLエラー:1064:SQL構文にエラーがあります。1行目の「_loadChartFromId」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください[CORE \cake \ libs \ model \ datasources \ dbo_source.php、行684]

この_loadChartFromId()関数は引数として$chart_idを取り、出力として配列を返します。なぜQuery: _loadChartFromId現れるのかわかりません。

4

2 に答える 2

0

この質問を、少なくとも5つの他の質問の正確な複製として閉じることを選択できた可能性があります(「cakephpanothercontroller」を検索した場合)。しかし、そこにある答えはひどいものです。実際には、新しいディスパッチャまたはrequestAction()を呼び出そうとします。

したがって、質問が別のコントローラーメソッドに関するものである場合:

簡単な答えは:あなたはしません。

長い答え:あなたはまだいけません。それは典型的な初心者の間違いです。主にビジネスロジックである場合は、機能をコンポーネントに組み込む必要があります。その後、コンポーネントは複数のコントローラーからアクセスできます。

(例のように)モデルデータに似ている場合は、機能を(適切なモデルの)モデルレイヤーに配置します。このようにして、アプリケーションのどこからでもアクセスできます。

また、他のオブジェクトから保護されたメソッドにアクセスすることは決して良い考えではありません。オブジェクトの「外部」から使用する場合は、パブリックメソッドを使用します。

モデルメソッドに関する質問の場合:モデルを使用する前に、コントローラーにモデルを含める必要があります。を使用するか、を使用するかpublic $uses、またはを使用します。loadModel('ModelName')ClassRegistry::init('ModelName')

于 2013-01-04T09:21:28.410 に答える
0

コントローラから他のコントローラメソッドを呼び出さないでください。

ユーザーコントローラーで$this->Analyticは、はAnalyticsControllerではなく、Analyticモデルのインスタンスです。したがって、CakePHPは、Analyticモデルで呼び出されたパブリックメソッドを呼び出そうとしていると見なしますが_loadChartFromId()、ご存知のとおり、これは存在しません。

エラーが発生する理由は、モデルの存在しないメソッドを呼び出そうとすると、CakePHPがそれをMagicFindTypesの1つに変換しようとするためです。もちろん、これも有効なMagic Find Typeではないため、SQLエラーが発生します。

解決

コードの一部しかないため、完全なソリューションを提供することは困難ですが、アプリのコーディング方法でMVCの概念に違反している可能性があります。

次の2つのいずれかを行う必要があります。

  1. _loadChartFromId()ユーザーコントローラーに移動します。これはおそらくユーザーとは何の関係もないので、直感に反するように思えます。

  2. メソッドを分析モデルに移動します。コントローラがアクセスできるように公開する必要があります。また、ユーザーコントローラでは、Analyticモデルがロードされていることを確認する必要があります。

    class Analytic extends AppModel {
    
        public function _loadChartFromId($chart_id) {
           // ...
        }
    }
    

    次に、ユーザーコントローラから、以前と同じようにメソッドを呼び出すことができます。

于 2013-01-04T12:15:44.580 に答える