在MVC中放置逻辑的适当位置

时间:2011-04-21 15:00:43

标签: model-view-controller yii

我正在用yii框架编写一个mvc web应用程序。我有一个业务逻辑,我不确定在哪里放置它。 $usernameid=$model->random_id_gen('5');是我正在谈论的功能。

SiteController:

<!-- snip -->
      public function actionIndex()
       {
         $model = new Users();

         if (isset($_POST['Users'])) {
            //call the active record table model
            $model = new Users();

            //massively assign attributes
            $model->attributes=$_POST['Users'];

            //generate random userid
            $usernameid=$model->random_id_gen('5');


<!-- snip -->

用户活动记录类:

 <!-- snip -->
  public function random_id_gen($length)
    {
        $characters = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
        $max = strlen($characters) - 1;
        $string = '';

        for ($i = 0; $i < $length; $i++) {
            $string .= $characters[mt_rand(0, $max)];
        }

        return $string;
    }

我的问题:这个id生成器函数是否属于Active记录模型?它应该在控制器中吗?它应该是一个单独的模型,因为它是“业务逻辑”,但与数据库没什么关系?

我正在努力改善我的MVC课程“膨胀”。提前谢谢你们。

更新 我正在寻找一个特定的解决方案。如果存在这样的约定,似乎问题已经发展成“如何将库放在yii中”。

4 个答案:

答案 0 :(得分:5)

应将MVC重命名为MVCL ..即Model-View-Controller-Library。这些函数应该进入一个独立的库系统。

控制器应该在TOP上。它有两个主要功能:接受用户输入和协调其他元素(控制器/库/视图)以进行输出。传统上,Controller从模型中询问数据。但是数据操作(最常见)应该由库中的函数完成。

可能有两个级别的库,一个可能是复杂的(基于对象),而另一个可能是简单的(基于全局函数),用于最常见的操作。类似于剥离标签,或使数据XML准备就绪,清理URL等等。整个系统可以访问简单的函数库,而无需对特定库对象进行任何实例化。

有道理吗?

答案 1 :(得分:2)

我用来放库:

  • 在通用库的扩展名(/ protected / extensions)中
  • in protected / components如果库是项目的通用库
  • in protected / modules / xxx / component for module specific libraries
  • 在供应商目录中,如果库很大,我不想对其进行版本化

通常导入protected / components(Yii :: import('application.components。*')目录,以便按需提供这些库。

这对我来说很好。

答案 2 :(得分:0)

我知道这很苛刻。但由于此特定功能与数据库或操作员逻辑(控制器)无关,并且既不与它们交互,也不属于任何一个对象。此外,它是一个简单的实用工具function

所以这就应该去了。 (除非你故意做CCP。)

答案 3 :(得分:0)

据我所知,我自己一直在使用它,Yii有一个帮助文件夹,这就是我用来放置你问到的帮助函数的地方。我没有使用它,因为yii有很多功能,但是我必须添加一个时间函数来显示事件的时间直到/前,这就像帮助文件夹中的魅力一样,最好的部分是Yii确切知道的我在哪里看Yii :: import ...希望有帮助