Phalcon -路由大量模型的正确方法


Phalcon - Proper way to route large number of models

我的项目中有很多模型。如果我遵循phalcon默认约定,我将不得不为每个模型创建单独的控制器。因此,如果我有30个模型,并且我想构建简单的crud页面,那么我也必须创建30个控制器。我对每个控制器使用相同的crud视图

我将原油路由到:/project/admin/:controller/:action。应用程序运行良好,但问题是:

  1. 我必须管理每个单独的控制器
  2. 大多数控制器共享相同的方法和属性,只是不同的表和很少的验证

所以我想把它们组合成一个单独的控制器AdminController。在这里,我列出了每个模型的所有与原油相关的操作。例如:accountListAction, cityEditAction等。好吧,是的,页面确实会变得更长(IDE将花费更多的时间来检查),但结果是,每个操作之间共享的方法和属性是可重用的。

现在只有一个控制器。我可以通过/project/admin/accountList访问模型帐户的"列表"。为了使路由看起来更好,我添加了更多的路由到特定的动作,所以现在,我可以通过project/admin/account/list访问它。(必须为每个动作定义路由)

问题是:我做错了吗?有更好的方法吗?

我想实现的是:更少的控制器文件,更少的冗余

如果你有一些方法,你需要在许多控制器中,你可以创建BaseController

class ControllerBase extends Phalcon'Mvc'Controller
{
    public function something_what_you_need_in_many_controller(){
    }
}

,然后在创建控制器时使用:

class PeopleController extends ControllerBase
{
}

所以你会在PeopleController中有那个函数something_what_you_need_in_many_controller()

您不必为每个模型创建控制器。这两个是不同的应用层,你有控制器,它们告诉在哪个视图中放什么数据它可以同时使用许多模型。模型只是用来处理控制器和数据库之间的数据连接。

我认为你的方法很好,但你只需要稍微改变一下组织方式,让你的生活更轻松。也许像这样:

  1. 正如您已经做的那样,将您的CRUD操作合并到一个控制器(AdminController)
  2. 为每个CRUD/Model的组合(如cityEditAction)创建一个操作,而不是为每个CRUD和任何您想要的其他操作(例如exportToCSVAction)创建一个操作
  3. 然后在每个动作中,您收到的第一个参数是模型类型,如list/city,如果需要,id作为第二个参数,如list/city/2
  4. 在此之后,每个动作都可以实现与任何模型类型一起工作。下面是deleteAction()的一个例子:

public function deleteAction($modelType, $id)
{
  if($this->modelTypeExists($modelType))
  {
    //Check if the user has the required privilegies for this action
    //See http://docs.phalconphp.com/en/latest/reference/acl.html
    if($this->acl->isAllowed($currentUser->accessGroup, $modelType, "delete"))
    {
      //Get the model being manipulated
      $model = $this->getModelById($modelType, $id);
      //Attempt to issue the required action
      if ($model->delete() == false) 
      {
        //Something went wrong with the deletation
      }
      else 
      {
        //Horray!!
      }
    }
    else
    {
      //Denied
    }
  }
  else
  {
    //Error
  }
}

: modelTypeExistsgetModelById不是内置函数,它们只是说明答案的函数。