【问题标题】:Yii2 component function in viewYii2 组件功能在视图中
【发布时间】:2018-02-26 13:35:08
【问题描述】:

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

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

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

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

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

我的组件.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;
  }
 }
?>

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

【问题讨论】:

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


    【解决方案1】:

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

    所以你可以添加(或扩展)你的模型广告添加功能

    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 时间来支持事件和行为功能的有效解决方案是使用帮助类 .. 用于管理与单个模型不正确相关的重复代码功能的类

    【讨论】:

    • 感谢您的回复。我对这两个模型都没有任何关系,同时我只希望在该应用程序中的几个地方使用此功能,例如主布局。那么组件好吗?
    • 是的,你可以使用组件 .. 也可以使用一个 ìn 辅助类 .. 该组件具有三个主要功能属性、事件、行为 .. 如果你需要这个,你需要组件 .. 如果没有,你可以如果函数与模型无关,则构建一个助手类
    • 非常感谢 scaisEdge :)
    【解决方案2】:

    或者您可以提供这样的计数。

    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 一样访问您的视图。 *有很多方法可以做。但是你必须遵循最佳实践..

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 2020-12-18
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 2014-10-29
      • 1970-01-01
      相关资源
      最近更新 更多