Yii2组件功能在视图中

时间:2017-09-18 05:22:25

标签: php yii yii2 components yii2-advanced-app

我有一个视图,在该视图中我需要一些直接查询,如下所示,

$count = Student::find()->where(['user_id'=>yii::$app->user->identity->id])->count();

但在yii2文档中,不推荐使用this.

所以我为此创建组件类,然后在视图中调用组件函数,如下所示

$count = Yii::$app->mycomponent->sCount();

MyComponent.php

<?php

 namespace app\components;

 use Yii;
 use yii\base\Component;
 use app\models\Student;

 class MyComponent extends Component
 {
  public function sCount()
  {
   $count =      Student::find()->where(['user_id'=>yii::$app->user->identity->id])->count();
   return $count;
  }
 }
?>

这里一切正常,我想知道这个逻辑是正确的,或者这也像第一种情况一样。请建议正确的方法。

2 个答案:

答案 0 :(得分:2)

如果代码我主要在多个应用程序中使用并将一组与指定逻辑区域相关的常见功能分组,则可以使用组件 但对于与应用相关的功能性 在MVC中,正确的方法是在controllerAction中执行主程序代码和db请求 并且对于功能模型的实现,正确的位置应该是模型本身或扩展模型,例如:modelSearch用于与mdels相关的serach函数 在渲染调用中将所需的值传递给视图,例如:

因此您可以添加(或扩展)模型广告添加功能

public function sCount()
{
  $count =      Student::find()->where(['user_id'=>yii::$app->user->identity->id])->count();
  return $count;
}

并参考此功能是您的控制器,例如:

class MyController  extends Controller
{

  ......
    public function actionMyView($id)
    {

        $count = $model->sCount();
        return $this->render('view', [
            'model' => $this->findModel($id),
            'count' => $count,
        ]);
    }

然后在视图中你可以参考$ count

  echo $count;

另一个有效的解决方案,用于避免额外的内存和CPU时间来支持事件和行为功能是使用帮助程序类...一个用于管理重复代码函数的类与单个模型没有正确关联

答案 1 :(得分:0)

或者你可以提供这个计数。

public function actionIndex()
{
    $query = Student::find();
    $cloneQuery = clone $query;
    $count = $cloneQuery->where(['user_id' => Yii::$app->user->identity->id])->count();
    $models = $query->all();
    return $this->render('index', [
        'models' => $models,
        'count' => $count
    ]);
}

访问您的视图如$count。 *有很多方法可以做。但你必须遵循最佳实践..