我的项目中有很多模型。如果我遵循phalcon默认约定,我将不得不为每个模型创建单独的控制器。因此,如果我有30个模型并且我想构建简单的crud页面,那么我将不得不创建30个控制器。我为每个控制器使用相同的crud视图
我将crud路由到:/project/admin/:controller/:action
。该应用程序运行良好,但问题是:
所以我想将它们组合成一个控制器AdminController
。在这里,我列出了每个模型的所有与crud相关的操作。例如,accountListAction
,cityEditAction
等等。确实,页面将变得更长(并且IDE将花费更多时间来检查)但结果是,共享方法和属性在每个之间可重用动作。
现在只有一个控制器。我可以访问' list'模特'帐户'通过/project/admin/accountList
。为了使路由看起来更好,我添加了更多路由到特定操作,所以现在,我可以通过project/admin/account/list
访问它。 (必须为每一个动作定义路线)
问题是:我做错了吗?有没有更好的方法来做到这一点?
我想要实现的是:减少控制器文件,减少冗余
答案 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)
我认为你的方法很好,但你只需要组织它有点不同,让你的生活更轻松。也许是这样的:
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
不是内置功能,它们只是答案的说明性功能。