【问题标题】:Yii, Is it good MVC practice to echo in the controller?Yii,在控制器中回显是良好的 MVC 做法吗?
【发布时间】:2015-12-11 18:32:25
【问题描述】:

似乎我没有遵循 MVC 设计结构。

我正在从我的视图对控制器函数进行 ajax 调用

控制器

public function actionGetClient()
 {
  $user =  Client::model()->findByAttributes(array('email'=>$_POST['email'], 'password'=>$_POST['pass']));
  echo $user->fullname;
 }

查看(调用 ajax)

       CHtml::ajaxLink(
            $text = 'get user',  
            $url = Yii::app()->createUrl('[my controller]/getClient'), 
            $ajax=array (        
            'type'=>'POST', 
             'data' => array('email'=>email, 'pass'=>pass),
            'beforeSend' => "function( request )
                      {
                           $(\".result\").html(\"fetching...\")
                      }", 
            'success'=>"function(data){  
                     $(\".result\").html(\"user is :\"+data)
                            }            
                      "        
            )); 

在控制器内“回显”$user->fullname 以便 ajax 成功函数显示它是否很好?当我在控制器中打印东西时,我的老板不喜欢它,我该如何解决这个问题

因为当我改用 return 时,ajax 成功得到一个空值

return $user->fullname; 

【问题讨论】:

  • 你可以创建一个只输出 $user->fullname 的视图,并返回 $this->partialRender('fullnameview.php') 而不是 echo 语句;

标签: php model-view-controller yii


【解决方案1】:

不,

这不是一个好习惯。

您需要创建一个视图才能使用 echo。

您可以使用return $this->renderPartial('VIEW_NAME'); 来渲染没有布局的视图。

【讨论】:

    【解决方案2】:

    没有。控制器应该将其结果传递给视图进行渲染。

    【讨论】:

      【解决方案3】:

      我会避免在控制器中回显我们通常做的是有一个 ajax 视图文件夹和一个 json 视图并使用它进行渲染:

      public function actionGetClient()
      {
        $user =  Client::model()->findByAttributes(array(
              'email'=>$_POST['email'],
              'password'=>$_POST['pass']
         ));
      
         $this->render("json",array("outputData"=>$user));
       }
      

      然后将它也添加到控制器中:

      public function getViewPath(){
          if(Yii::app()->request->isAjaxRequest){
              if(($module=$this->getModule())===null)
                  $module=Yii::app();
              return $module->getViewPath().DIRECTORY_SEPARATOR."ajax";
          }
          return parent::getViewPath();
      }
      

      并在 ajax 视图文件夹中添加一个 json.php 文件,如下所示

      header('Content-Type: application/json');
      // output data
      echo json_encode($outputData);
      

      请在我徒手编写代码时对代码进行调试。您也可以在控制器中设置一个标记,如 $viewPath 并在渲染之前设置它

      【讨论】:

      • 这是一个非常有趣的答案。你能解释一下第二个代码块吗,我们需要它做什么。
      • 每个控制器默认搜索具有相同名称的视图文件夹,因此对于 FooController,如果您呈现 bar 视图,它将为这个文件 kook:views/foo/bar.php,但我们只拥有json 布局一次,所以我覆盖了 getView 函数,这样我就可以渲染这个文件:views/ajax/json.php 形成我喜欢的任何控制器。在实践中,我使用标记来决定视图路径而不是 isAjaxRequest
      • 你也必须选择使用的控制器布局
      • 谢谢。这不是更容易实现吗,因为它认为它做同样的 $this.renderPartial('application.views.ajax.json')
      【解决方案4】:

      你应该写“return”而不是“echo”。 'echo' 不是 ajax 响应的好习惯。您无需创建新视图,只需在您的案例中返回一个名称。

      public function actionGetClient()
      {
         $user =  Client::model()->findByAttributes(array('email'=>$_POST['email'],'password'=>$_POST['pass']));
         return $user->fullname;
      }
      

      【讨论】:

      • 这仍然是一个捷径,你没有渲染视图,因此消除了你可以使用的各种调试功能
      • 我已经在我的问题中提到了这一点,如果我使用 return,ajax 调用上没有任何显示
      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多