2016-03-03 85 views
0

我想动态创建模型的实例。这可能与yii2?Yii2中动态声明模型

我想这样

<?php 

namespace app\components; 

use Yii; 
use yii\base\Component; 
use yii\base\InvalidConfigException; 
use yii\web\NotFoundHttpException; 


use app\models; 


class SintelComponent extends Component 
{ 

public function find($model_name, $id) 
{ 
    $magic = __NAMESPACE__.'\\'.$model_name; //__NAMESPACE__ is a magic constant 
    if (($model = $magic::findOne($id)) !== null) 
    { 
     return $model; 
    } 
    else 
    { 
     throw new NotFoundHttpException('The requested page does not exist.'); 
    } 
} 
} 

$ MODEL_NAME东西是模型的名称。当我尝试这方面,我得到这样

语法错误,意外“$ MODEL_NAME”(T_VARIABLE)的错误,希望 标识符(T_STRING)

+0

请参阅[名称空间常见问题](http://php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.quote) –

回答

1

我不能对此进行测试(我“我的手机上M),但你可以尝试这样做是这样的:

public function find($model_name, $id) 
{ 
    $_model = '\app\\models\\'.$model_name; 
    if (($model = $_model::findOne($id)) !== null) 
    { 
     return $model; 
    } 
    else 
    { 
     throw new NotFoundHttpException('The requested page does not exist.'); 
    } 
} 
+0

我得到了这样的错误调用成员函数findOne ()在一个非对象,当我尝试它。 – Bloodhound

+0

请参阅我的编辑,我认为'模型'应该有两个'''在它之前。 – morcen

+0

我仍然有这个错误。 – Bloodhound

0

你可以试试这个方法:

namespace app\models; 
public function find($model_name, $id) 
{ 
    $magic = __NAMESPACE__.'\\'.$model_name; //__NAMESPACE__ is a magic constant 
    if (($model = $magic::findOne($id)) !== null) 
    { 
     return $model; 
    } 
    else 
    { 
     throw new NotFoundHttpException('The requested page does not exist.'); 
    } 
} 

注意:仅适用于当前命名空间。

+0

我试着当你说,但我得到一个类'应用程序\组件\组织'找不到错误。 – Bloodhound

+0

@血猎犬。你只能访问一个名字空间,如果你在组件中使用它,那么你的名字空间将是'app \ components'。 –

+1

@血猎犬。你还需要'php.net/manual/en/language.namespaces.definitionmultiple.php' –