【问题标题】:PHP MVC: use router inside controller?PHP MVC:在控制器内使用路由器?
【发布时间】:2015-10-11 14:42:42
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

  • 控制器前面有什么样的路由?一个前端控制器,所有请求都被重定向到索引并从那里手动路由,还是其他方案?
  • 您好,所有请求都被重定向到 index.php,如果 URL 与我的路由之一匹配,我会查看我的路由集合。如果是这种情况,我会调用相应的控制器和相应的操作。
  • 那么您可以在该操作调用中注入路由器.. $controller-&gt;listAction($router, $otherStuff) 或类似

标签: php model-view-controller


【解决方案1】:

几件事:

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

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

至于当你听到注入时,它的意思是传递一些东西作为参数,就像你通常对函数调用所做的那样。关于避免单例的一般建议是有道理的,因为单例指向使用全局变量,这通常是不受欢迎的。相反,您应该将 DB 模型的实例作为参数传递给需要使用它的任何类。比如:

class User {

    private $dbh;

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

}

$user = new User($dbh);

通过这种方式,您可以访问数据库处理程序,而无需在全局范围内打开它,也无需过多地访问它。

希望这会有所帮助。到目前为止,您的研究正在引领您前进,所以坚持下去!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多