PHP MVC:在控制器内部使用路由器?

我正在构建自己的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真的很糟糕吗?

谢谢您的帮助.

最佳答案 几件事:

通常,您的路由器位于控制器之前.所有它应该关注的是查看URL /请求,并将信息发送到正确的控制器.一旦进入控制器,您就不需要出于任何原因返回路由器.这意味着如果您需要从控制器内部或视图内部访问createUrl()方法,则需要将其移动到其他位置.

通常,您的控制器可以访问您的视图,但不是相反.因此,您可以将其添加到视图(可能是其他人扩展的主视图),也可以添加到您调用它的控制器(再次,其他人扩展的主控制器),并将结果传递到视图中实例化视图时的参数.

至于你何时听到注入,所有这意味着将一些东西作为参数传递,就像你通常使用函数调用一样.关于避免单身人士的一般建议是有道理的,因为单身人士指出使用全局变量,这通常是不受欢迎的.相反,您应该将数据库模型的实例作为参数传递给需要使用它的任何类.就像是:

class User {

    private $dbh;

    __construct($dbh) {
        $this->dbh = $dbh;
    }

}

$user = new User($dbh);

通过这种方式,您可以访问数据库处理程序,而无需在全局中打开它并为所有内容提供太多访问权限.

希望这有帮助.你的研究到目前为止一直在引导你,所以坚持下去吧!

点赞