0

This is probably very easy to do, but I can't seem to get my head around it right now. Let's say in a component in a cakephp application, I have a variable my_model, which contains the model of the corresponding controller that is currently using the component like:

function TestComponent extend Object
{
    var $my_model; // can be either User, or Person

    function test()
    {
        $myModelTemp = $this->my_model; 

        $model = $myModelTemp != 'User' ? $myModelTemp.'->User' : 'User';

        $this->$model->find('all'); 
    }
}

As you can see above in my function test() what I'm trying to do is call the correct model based on the value of my_model. So based on the condition, my query will be either:

$this->Person->User->find('all');

Or

$this->User->find('all');

When I do it like I did above, I get an error saying Fatal error: Call to a member function find() on a non-object. In order words, that error means Person->User is not an object (so, it is considered as a string).

4

2 に答える 2

0

一般的に、これについてはすべて間違っているようです。明らかに、モデルを動的にしたいのですが、そもそも動的であることの全体的なポイントを無効にするものをハードコーディングしています。

また、これらすべてをコンポーネントで行うことで、CakePHP と MVC の原則に違反しているようにも見えます。このコンポーネントが実際にモデルを操作したり、現在使用されているモデルを想定したりする必要があるかどうかはわかりません。

ただし、文字列を実際のオブジェクトとして評価したい場合は、ラップすることができます{ ... }(これは有効な標準 PHP 構文であり、Cake 固有のコードではありません)。

これを試して:

$modelName = $this->my_model; 

$model = ($modelName != 'User') ? $this->{$modelName}->User : $this->User;

$model->find('all');

これが機能しない場合、またはモデルが見つからないというエラーが表示される場合は、モデルが実際にロードされ、現在のスコープで初期化されていることを確認する必要があります。

于 2012-11-19T12:31:00.440 に答える
0

あなたが言っていることは真実かもしれませんが、それは通話のどの部分にも言及できます。

したがって、Person または User のいずれかが無効であるか、一緒にエラーが発生する可能性があります。言いにくい。var_dump(); を使用して個々のオブジェクトをダンプしてみてください。

だから試してください:

<?php
    echo "<pre>";
    var_dump(is_object($this->Person));
    var_dump(is_object($this->User));
    echo "</pre>";
?>

コードのどこが間違っているかを判断します。明確にするために、その戻り値がオブジェクトであるためには true である必要があります。

false を返すものが原因である可能性があります。

あなたの質問がオブジェクトを参照する正しい方法に言及している場合、オブジェクトは基本的に配列です。例えば:

<?php 
    $obj = (object) array("this", "my_function");
?>

上記の例では、配列をオブジェクトとしてキャストしています。ただし、複数のレイヤーを使用することは、予想以上に難しい場合があります。

于 2012-11-19T05:45:00.030 に答える