我的项目中有很多模型。如果我遵循phalcon默认约定,我将不得不为每个模型创建单独的控制器。因此,如果我有30个模型,并且我想构建简单的crud页面,那么我也必须创建30个控制器。我对每个控制器使用相同的crud视图
我将原油路由到:/project/admin/:controller/:action
。应用程序运行良好,但问题是:
- 我必须管理每个单独的控制器
- 大多数控制器共享相同的方法和属性,只是不同的表和很少的验证
所以我想把它们组合成一个单独的控制器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()
您不必为每个模型创建控制器。这两个是不同的应用层,你有控制器,它们告诉在哪个视图中放什么数据它可以同时使用许多模型。模型只是用来处理控制器和数据库之间的数据连接。
我认为你的方法很好,但你只需要稍微改变一下组织方式,让你的生活更轻松。也许像这样:
- 正如您已经做的那样,将您的CRUD操作合并到一个控制器(AdminController)
- 为每个CRUD/Model的组合(如cityEditAction)创建一个操作,而不是为每个CRUD和任何您想要的其他操作(例如
exportToCSVAction
)创建一个操作 - 然后在每个动作中,您收到的第一个参数是模型类型,如
list/city
,如果需要,id作为第二个参数,如list/city/2
。 在此之后,每个动作都可以实现与任何模型类型一起工作。下面是
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
}
}
: modelTypeExists
和getModelById
不是内置函数,它们只是说明答案的函数。