我想问的一些技巧,就如何解决这个问题。我试图建立自己的MVC的网站。我学到的URL的基础。
http://example.com/blog/cosplay/cosplayer-expo-today
博客 - >控制器角色扮演 - >在控制器中的方法 COSPLAYER,世博会今天 - >的方法变
如果我动态地扩展类在我的博客控制器?我需要创建的方法,还是有一些技巧,自动做到这一点?我的意思是......我有这几类现在:角色扮演,游戏,电影,系列。所以,我需要建立在控制这些方法,但他们都做同样的事情,即选择从数据库中其他类别。
在功能角色扮演()= example.com/blog/cosplay / 在功能的游戏()= example.com/blog/game / 在功能的电影()= example.com/blog/movie / 在功能系列()= example.com/blog/series /有我如何能写我的控制器自动执行,任何好的建议吗?我的意思是,如果我上传一个新的类别在我的数据库,但我不希望修改控制器。可能吗?感谢您的帮助!
更新
下面是我的网址雷管类
类自动加载
{
变量$网址;
变量$控制器;
功能__construct()
{
$这个 - > URL = $ _GET ['URL'];
// HNEM URES AZ网址
如果($这个 - >!URL =''和;&安培;!空($这个 - > URL))
{
需要应用程序/配置/ routes.php文件;
// URLVIZSGÁLATA
$这个 - > rewrite_url($这个 - > URL);
// URLSZÉTBONTÁSA
$这个 - > URL =爆炸('/',$这个 - > URL);
$文件='应用程序/控制器/'.$这 - >网址[0]。PHP。
//LÉTEZIK控制器?
如果(file_exists($文件))
{
需要$文件;
$这个 - >控制器=新的$这个 - >网址[0];
//KÉRELEMALATT VAN AZ ALOLDAL?
如果(使用isset($这 - >网址[1]))
{
//LÉTEZIK一个METÓDUS? ENGEDÉLYEZVEVAN?
如果(method_exists($这 - &分解控制器,$这 - >网址[1])及&安培; in_array($这 - >网址[1],$路线[$这 - >网址[0]] ))
{
如果(使用isset($这 - >网址[2]))
{
$这 - >控权> {$这 - >网址[1]}($这 - >网址[2]);
}
其他
{
$这个 - >控制器 - > {$这个 - >网址[1]}();
}
}
其他
{
标题(位置:SITE $这个 - >网址[0]);
死();
}
}
}
其他
{
标题(位置:网站);
死();
}
}
其他
{
头('位置:'。SITE.'blog');
死();
}
}
/ **
* ELSOlépésbenmegvizsgáljuk,hogy一个kapottszövegtartalmaz-Enagybetűt。 Amennyiben IGENátalakítjukkisbetűsre< BR />
*Másodiklépésbenmegnézzük,hogy一个kapottszöveg/ - 重新végződik-E。 Amennyiben IGENlevágjukAZT< BR />
* HarmadiklépésbenújratöltjükAZ oldalt一个formázottszöveggel。
*
* @参数字符串$网址Korábbanbeolvasott URL。
* /
私有函数rewrite_url($网址)
{
// HANAGYBETŰVAN AZ URL-BEN VAGY/ - REVÉGZŐDIK
如果(preg_match('/ [AZ] /',$网址)|| SUBSTR($网址,-1)=='/')
{
//NAGYBETŰSAZ网址KICSIREALAKÍTJUK
如果(preg_match('/ [A-Z] /',$网址))
{
$ URL =用strtolower($网址);
}
// HA'/' - REVÉGZŐDIKLEVÁGJUK
如果(SUBSTR($网址,-1)=='/')
{
$ URL = SUBSTR($网址,0,strlen的($ URL)-1);
}
头('位置:'SITE $网址);
死();
}
}
}
和这里是我的.htacces
选项+了FollowSymLinks
RewriteEngine叙述上
的RewriteCond%{} REQUEST_FILENAME!-d
的RewriteCond%{} REQUEST_FILENAME!-f
的RewriteCond%{} REQUEST_FILENAME!-l
重写规则^(。+)$的index.php?URL = $ 1 [QSA,L]
解决方案
供参考:还有,你做错了几件事情。我会尝试去通过他们每个人,并说明问题,误解和可能的解决方案(S)。
从你的外观贴code,很明显,你有一个类,它负责以下工作:
路由:它将该URL中对于应用程序的其他部分有一定意义的部分 自动加载:类需要分离的网址片段,并尝试以包括与code 在工厂,新的实例初始化,一些方法被称为他们 响应:在某些情况下,该类发送给用户的响应中的HTTP标头的形式在OOP有这个东西,叫做:单一职责原则 [here
注意: 如果您使用 (?P<名称> ...)
符号,比赛将返回数组的
作为一个关键。有用的技巧为更多然后路由。
您可能会想一些更可读的符号生成正规前pressions的匹配。例如,在配置文件中,这前pression:
'#^/(?P<id>[0-9]+)(?:/(?P<resource>[^/\\.,;?n]+)(?:/(?P<action>[^/\\.,;?n]+))?)?$#'
..或许应该看起来像
/:ID [[/:资源] /:行动]
凡:参数
会显示一个URL段和 [...]
将意味着的可选部分网址。
在此基础上,你应该能够充实自己的路由系统。上面的code片段是简化的核心功能只是例子。要获得关于如何它可能看起来全面实施一些观点,你可以看看code在这个答案。它应该给你为自己的API版本的一些想法。
这是很常见的错误埋葬控制器执行某处深在路由类(或类)。这引发了两个问题:
困惑:它使更难找到这里的真正的工作,在应用程序开始 联轴器:你的路由器最终链接到特定跨$ P $ MVC式的建筑风格的ptation路由是即便在定制编写的应用程序自然会朝着codeBase包括框架十岁上下的部分吸引的任务。
的(真的)简化版本看起来像:
$匹配= $路由器 - &GT;解析($网址);
$控制器=新{'\控制器\'$匹配['控制']};
$控制器 - &GT; {$匹配['行动'($匹配);
这样没有什么需要你的路由结果在一些MVC式的建筑风格中使用。也许你只需要提供静态的HTML文件,一个荣耀的下载控制机制。
您正在寻找了错误的方式。 有没有需要动态地添加方法控制器在你的榜样其实是有一个控制器方法......沿着线的东西:
公共职能的getCategory($要求){
$类别= $请求 - &GT;的getParameter('类');
// ...你的控制器方法的code休息
}
其中, $类别
最终将包含角色扮演
,游戏
,电影
,系列
或自己添加任何其他类别。它是什么,您的控制器将传递到模型层,过滤掉的文章。
如果您想了解更多关于MVC架构模式,我强烈建议你去,虽然都在 这个帖子 。把它看成是强制性的阅读/看清单。你也可能会发现一些好处矿上的MVC相关学科的这些老帖子:这里,的