我正在构建自己的 MVC 框架(以改进我的 PHP),但我不知道如何处理好的做法。
在我的路由器中,我有一个使用路由名称和参数创建链接的方法(该方法返回格式正确的 url),因此在我的 Controller 中,我可以使用如下内容:
//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 是一种不好的做法(即使对于数据库类也是如此)。
我确实需要从我的 Controller 内部和我的 View 内部访问我的 createUrl() 方法,但是如果我不使用单例路由器类,我如何才能将我的路由器“注入(inject)”到我的 Controller 并成为能用吗? 在这种情况下使用 Singleton 真的很糟糕吗?
感谢您的帮助。
最佳答案
几件事:
通常您的路由器位于您的 Controller 之前。它应该关心的只是查看 URL/请求,并将信息发送到正确的 Controller 。进入 Controller 后,您无需出于任何原因返回路由器。这意味着如果您需要从 Controller 内部或 View 内部访问 createUrl() 方法,则需要将其移动到其他地方。
通常您的 Controller 可以访问您的 View ,但反之则不行。因此,您可以将它添加到您调用它的 View (可能是其他人扩展的主视图)或 Controller (同样,其他人扩展的主 Controller ),并将结果传递到 View 中实例化 View 时的参数。
至于当您听到注入(inject)时,它的意思是将某些东西作为参数传递,就像您通常对函数调用所做的一样。关于避免单例的一般建议是有道理的,因为单例指向使用全局变量,这通常是不受欢迎的。相反,您应该将数据库模型的实例作为参数传递给任何需要使用它的类。像这样的东西:
class User {
private $dbh;
__construct($dbh) {
$this->dbh = $dbh;
}
}
$user = new User($dbh);
这样,您就可以访问数据库处理程序,而无需在全局范围内打开它并为所有内容提供过多的访问权限。
希望这对您有所帮助。到目前为止,您的研究引领您前进,所以请坚持下去!
关于PHP MVC : use router inside controller?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33066256/