我正在构建自己的MVC框架(以改进我的PHP),但我不知道如何处理好的做法。
在我的路由器中,我有一个使用路由名称和参数创建链接的方法(该方法返回格式正确的URL),所以在我的控制器中我可以使用类似的东西:
//inside an action of any of my controllers
$router = Router::getInstance(); //the router is a Singleton
$url = $router->createUrl('articleReadOne', array(65, 'matrix')); //$url = "article/read/65-matrix"
$this->redirectTo($url);
或者在我的观点中:
//inside a view
<?php $router = Router::getInstance(); ?>
<a href="<?php echo $router->createUrl('article-read', array(65, 'matrix')); ?>"> Click me </a>
但我可以在网上看到使用Singleton是一种不好的做法(即使是数据库类)。
我真的需要从我的控制器内部和我的视图中访问我的createUrl()方法,但是如果我不使用Singleton Router类,我怎么能将我的路由器“注入”我的控制器并且是能用吗? 在这种情况下使用Singleton真的很糟糕吗?
感谢您的帮助。
答案 0 :(得分:2)
一些事情:
通常,您的路由器位于您的控制器之前。所有它应该关注的是查看URL /请求,并将信息发送到正确的控制器。一旦进入控制器,您就不应该出于任何原因返回路由器。这意味着如果您需要从控制器内部或视图内部访问createUrl()方法,则需要将其移动到其他位置。
通常您的控制器可以访问您的视图,但不是相反。因此,您可以将其添加到视图(可能是其他人扩展的主视图),也可以添加到您调用它的控制器(再次,其他人扩展的主控制器),并将结果传递到视图中实例化视图时的参数。
至于你何时听到注入,所有这意味着将一些东西作为参数传递,就像你通常使用函数调用一样。关于避免单身人士的一般建议是有道理的,因为单身人士指出使用全局变量,这通常是不受欢迎的。相反,您应该将数据库模型的实例作为参数传递给需要使用它的任何类。类似的东西:
class User {
private $dbh;
__construct($dbh) {
$this->dbh = $dbh;
}
}
$user = new User($dbh);
通过这种方式,您可以访问数据库处理程序,而无需在全局范围内打开数据库处理程序,并且可以对所有内容进行过多访问。
希望这有帮助。你的研究到目前为止一直在引导你,所以坚持下去!