yii2怎么设置动态model [ 2.0 版本 ]
在Yii2里有很多同样的代码,例如 controller里都有这段
protected function findModel($id){
if(($model = Active::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
所以我先把这段代码放到 公共控制器里AdminController
,
use models\A;
use models\B;
然后根据controller ID来动态加载这给类
$m = ucfirst($this->id);
if(($model = $m::findOne($id)) !== null) {
return $model;
}
请问下这里该怎么实现,
我试过 $m = new self($m)
, $m=new $m($m)
, $m = Yii::createObject($m)
都不行
共 5 个回答
-
word1018808441 回答于 2015-08-07 08:43 举报
不知下面这种可行否,临时想的:
/* * @param string $models 模型名称 */ protected function findModel($models, $id){ if(($model = \common\models\$models::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } }
-
强烈不建议这样处理....
第一 用controller Id 来指向对应的 Model 很不可靠..非常不可靠
你Model名是 BlackListController ---> id : black-list 很显然 这是不行的
另外 你在 urlRules 或者 controllerMap 做配置 也会影响到相对应的 controller Id
第二 即便可以正确指向相对应的 Model 名称 你还必须有对应的 namespace, 才能 createObject
并且这样也很不灵活, 不如放在各自控制器,
共 2 条回复 -
sevenyearsold 回答于 2015-08-07 11:29 举报
使用反射就可以实现你的想要的功能。首先新建一个
beseController
继承自Controller
,然后在beseController
中添加方法findModel
代码如下:protected function findModel($id) { $ns = "\\app\\models\\".ucfirst($this->id); $class=new \ReflectionClass($ns); $instance = $class->newInstance(); if (($model = $instance::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); }
共 2 条回复sevenyearsold 回复于 2015-08-07 14:08 回复@belial 这个没有是因为你没去追YII实现登陆的代码的逻辑,其实这个没有是因为在系统自带的loginForm中的login方法里默认使用Yii::$app->user->login()(使用是配置文件中的user配置,你的admin并没起作用)
public function login() { if ($this->validate()) { return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); } else { return false; } }
belial
注册时间:2015-08-03
最后登录:2015-08-18
在线时长:0小时39分
最后登录:2015-08-18
在线时长:0小时39分
- 粉丝0
- 金钱20
- 威望0
- 积分20