最近,我一直在使用PHP开发自己的MVC内容管理系统,至少在我的脑海中,我对系统设计有一点执着。我相信这也适用于使用现有MVC框架构建内容管理系统。
这将是有点难以解释,很抱歉,提前为漫长的两难处境。
目前,我的路由看起来有点像这样(存储为JSON):
{
"/admin/:controller/:action/:params":"",
"/admin/:controller/:params":"AdminController",
"/admin":"AdminController",
"/:page?/:subpage?":"IndexController"
}路由是键,默认控制器是值。如果没有默认控制器,路由器就会进入下一个规则。我这样做是为了将网站的前端与管理面板分开。
控制器暂时都在一个目录中,尽管这是注定要改变的。它们要么返回一个用各自模型中的数据填充的模板,要么简单地修改使用它们实例化的请求。
我的问题是如何以模块化的方式实现与前端和后端相同模型有关的独立控制器。
例如,我在管理面板中有一个页面,允许管理员输入一些专用信息,这些信息只能在前端使用用户名和密码访问。假设这是由后端的InfoController处理,用于编辑由路由/admin/info匹配的私有信息。
如果我想为前端创建一条用于访问私有信息的路由,其名称与管理面板(/info)中的名称相同呢?
我认为,在我考虑的解决方案中,这个问题更有意义。
我考虑过的
Admin来附加所有与管理相关的控制器--所以AdminInfoController和InfoController --但是我希望最终有一个模块化的系统,其中所有与Info模型相关的路由、控制器和视图(如果需要的话)都在它们自己的目录结构中(比如/modules/info)。/:module/:controller/:action的匹配路由,但这意味着管理面板本身就是一个模块,需要访问前端可以使用的所有模块。这有道理吗?最终,我在寻找最好的方法,任何替代方案,以及我是否完全过度考虑了这一点。
这感觉有点像我疯狂的追求我的理想系统设计,保持MVC模式(这甚至是对这样的系统正确的事情吗?)谢谢你的阅读,我希望这是有意义的。
发布于 2015-07-17 11:05:54
当我开始使用带有依赖注入容器的服务提供者来实现模块系统时,我解决了这个问题。
将模块视为应用程序的服务提供者是最有效的方法,无论它们是提供新服务还是向现有服务(如路由)提供数据。
管理面板本身已经成为一个模块,它只是向容器提供与管理相关的路由和服务。任何其他模块都可以做同样的事情。
配置中的默认路由类似于JSON格式:
{
"/:controller/:action/:params": {
"namespace": "Darya\\Core\\Controllers"
},
"/:controller/:params": {
"namespace": "Darya\\Core\\Controllers"
},
"/:page?/:subpage?": "Darya\\Core\\Controllers\\IndexController"
}当在模块类(服务提供者)中定义模块路由时,模块路由可以是这样的:
// Route path to namespace prefixes:
// "/admin/info" would become "Darya\Module\Admin\Controllers\InfoController"
$router->add(array(
'/admin/:controller/:action/:params' => 'Darya\Module\Admin\Controllers',
'/admin/:controller/:params' => 'Darya\Module\Admin\Controllers',
'/:controller/:action/:params' => 'Darya\Module\Controllers'
'/:controller/:params' => 'Darya\Module\Controllers'
));这样,应用程序的所有URL都是好的和可扩展的。下一个问题是决定路线的优先次序,但这变成了一个离题。
依赖注入是你的朋友。:)
https://softwareengineering.stackexchange.com/questions/246818
复制相似问题