2016-03-03 2 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

я не в состоянии проверить это (I нахожусь на моем телефоне), но вы можете попробовать сделать это так:

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

см. Мое редактирование, я думаю, что 'models' должно иметь два' '' перед этим. – 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

@Bloodhound. вы можете получить доступ только к одному пространству имен, если вы используете его внутри компонента, тогда ваше пространство имен будет 'app \ components'. –

+1

@Bloodhound. Вам также нужен 'php.net/manual/en/language.namespaces.definitionmultiple.php' –

Смежные вопросы