2015-08-06 15:20:52 6403次浏览 5条回答 0 悬赏 10 金钱

在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) 都不行

  • 回答于 2015-08-06 16:27 举报

    感觉问题有些复杂化了。

    每个model有单独的controller能更方便的作个性化设置。当然gii生成的代码全都一样。

  • 回答于 2015-08-06 17:55 举报

    之前研究过,貌似不是很好实现~
    坐等高手解答~

  • 回答于 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.');
      }
    }
    
  • 回答于 2015-08-07 09:49 举报

    强烈不建议这样处理....

    第一 用controller Id 来指向对应的 Model 很不可靠..非常不可靠

    你Model名是 BlackListController ---> id : black-list 很显然 这是不行的

    另外 你在 urlRules 或者 controllerMap 做配置 也会影响到相对应的 controller Id

    第二 即便可以正确指向相对应的 Model 名称 你还必须有对应的 namespace, 才能 createObject

    并且这样也很不灵活, 不如放在各自控制器,

    2 条回复
    回复于 2015-08-07 09:50 回复

    总想着 all in one 是不行滴 , 我是这么认为

    回复于 2015-08-07 12:18 回复

    谢谢, 可能方法不是最好的, 但是能了解其他的实现方式,也算是种积累啊

  • 回答于 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 条回复
    回复于 2015-08-07 12:19 回复

    谢谢大神,我最近才刚开始用yii, 有另一个没头绪的问题, 如果方便的时候请指点下

    http://segmentfault.com/q/1010000003060735

    回复于 2015-08-07 14:08 回复

    这个没有是因为你没去追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
试用期

belial

注册时间:2015-08-03
最后登录:2015-08-18
在线时长:0小时39分
  • 粉丝0
  • 金钱20
  • 威望0
  • 积分20

热门问题