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

Php Phalcon-路由大量模型的正确方法,php,url-routing,phalcon,Php,Url Routing,Phalcon,我的项目中有很多模型。如果我遵循phalcon默认约定,我必须为每个模型创建单独的控制器。所以,如果我有30个模型,并且我想构建简单的crud页面,那么我还必须创建30个控制器。我对每个控制器使用相同的crud视图 我将crud路由到:/project/admin/:controller/:action。应用程序运行良好,但存在以下问题: 我必须管理每一个控制器 大多数控制器共享相同的方法和属性,只是不同的表和很少的验证 所以我想把它们组合成一个控制器AdminController。在这里,我列

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

我将crud路由到:
/project/admin/:controller/:action
。应用程序运行良好,但存在以下问题:

  • 我必须管理每一个控制器
  • 大多数控制器共享相同的方法和属性,只是不同的表和很少的验证
  • 所以我想把它们组合成一个控制器
    AdminController
    。在这里,我列出了每个模型的所有与crud相关的操作。例如,
    accountListAction
    cityEditAction
    ,等等。的确,页面将变得更长(IDE将花费更多时间进行检查),但结果是,共享方法和属性可以在每个操作之间重用

    现在只有一个控制器。我可以通过
    /project/admin/accountList
    访问模型“account”的“list”。为了使路由看起来更好,我在特定操作中添加了更多路由,因此现在,我可以通过
    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中的许多控制器()中使用你需要的函数


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

    我认为你的方法很好,但你只需要将它组织得有点不同,以使你的生活更轻松。也许是这样的:

  • 正如您已经做的那样,将CRUD操作合并到一个 控制器(AdminController)
  • 不要为CRUD/模型的每个组合创建一个操作(如CityEdit操作),而是为每个CRUD和您想要的任何传统操作创建一个操作(
    exportTocsAction
  • 然后,在每次操作中,您都会收到第一个参数,即模型类型,如
    list/city
    ,如果需要,还会收到第二个参数id,如
    list/city/2
  • 在此之后,可以实现每个操作来处理任何模型类型。下面是一个
    deleteAction()
    的示例:


  • 注意
    modelTypeExists
    getModelById
    不是内置函数,它们只是答案的说明性函数。

    谢谢。另外,是否可以从当前url传递“正在使用哪个模型”?例如,所有30个模型都将使用相同的控制器和相同的方法?我将等待其他人的意见,直到我选择一个答案。如果没有其他的,我以后会选择你的:)谢谢你可以使用你需要的任何型号。路由器将url传输到控制器操作,您将在该操作中执行什么操作取决于您。您可以使用模型从sql中获取数据,而不能使用任何模型。如果您的视图需要model user提供的用户信息、Stats model提供的一些统计信息、UserForumPost提供的一些论坛帖子等等,那么您可以在同一个控制器中使用所有这些模型进行向下投票时,很好地注释掉原因。
    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
      }
    }