Phalcon - 适当的方式来路由大量的模型

时间:2014-03-19 10:15:33

标签: php url-routing phalcon

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

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

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

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

    问题是:我做错了吗?有没有更好的方法来做到这一点?

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

2 个答案:

答案 0 :(得分:2)

如果你有一些方法,你需要在许多控制器中,你可以制作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 :(得分:0)

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

  1. 正如您所做的那样,将您的CRUD操作合并为一个 controller(AdminController)
  2. 不是为CRUD / Model的每个组合创建一个动作(如cityEditAction),而是为每个CRUD创建一个动作以及您想要的任何行动(例如exportToCSVAction
  3. 然后,在您收到的每个操作中,您都会收到list/city等模型类型的第一个参数,如果需要,还可以将{id}作为list/city/2等第二个参数。
  4. 在此之后,可以实施每个操作以使用任何模型类型。以下是deleteAction()
  5. 的示例
    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不是内置功能,它们只是答案的说明性功能。