草庐IT

PHP MVC : use router inside controller?

coder 2024-04-18 原文

我正在构建自己的 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/

有关PHP MVC : use router inside controller?的更多相关文章

随机推荐