Php Phalcon-路由大量模型的正确方法
我的项目中有很多模型。如果我遵循phalcon默认约定,我必须为每个模型创建单独的控制器。所以,如果我有30个模型,并且我想构建简单的crud页面,那么我还必须创建30个控制器。我对每个控制器使用相同的crud视图 我将crud路由到:Php Phalcon-路由大量模型的正确方法,php,url-routing,phalcon,Php,Url Routing,Phalcon,我的项目中有很多模型。如果我遵循phalcon默认约定,我必须为每个模型创建单独的控制器。所以,如果我有30个模型,并且我想构建简单的crud页面,那么我还必须创建30个控制器。我对每个控制器使用相同的crud视图 我将crud路由到:/project/admin/:controller/:action。应用程序运行良好,但存在以下问题: 我必须管理每一个控制器 大多数控制器共享相同的方法和属性,只是不同的表和很少的验证 所以我想把它们组合成一个控制器AdminController。在这里,我列
/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中的许多控制器()中使用你需要的函数
您不必为每个模型创建控制器。这两个是不同的应用程序层,您有控制器-它们告诉您在什么视图中放置什么数据,并且可以同时使用多个模型。模型只是用来处理控制器和数据库之间的数据连接。我认为你的方法很好,但你只需要将它组织得有点不同,以使你的生活更轻松。也许是这样的:
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
}
}