应用程序仅在php mvc项目中加载一个(默认)控制器?

时间:2019-02-14 21:17:29

标签: php namespaces composer-php

我正在从头开始构建自定义mvc框架,当我将某些内容打印到我的PageController中时,应用程序正在运行,但是当我创建其他控制器并尝试打印某些内容时,它只是从PageController中打印数据。

我认为问题出在我将变量保护的$currentController = 'PageController';$this->currentController = new PageController();放在哪里。

现在我尝试放入$this->currentController = new $this->currentController;并收到以下错误消息:

  

'致命错误:未捕获错误:在C:\ xampp \ htdocs \ php \ App \ Libraries \ Core.php中找不到类'PageController':20堆栈跟踪:#0 C:\ xampp \ htdocs \ php \ public \ index.php(7):App \ Libraries \ Core-> __ construct()#1 {main}放在第20行的C:\ xampp \ htdocs \ php \ App \ Libraries \ Core.php中。

我也正在使用composer并使用psr-4和命名空间自动加载。

Core.php

namespace App\Libraries;

use App\Controllers\PageController;

class Core
{
   protected $currentController = 'PageController';
   protected $currentMethod = 'index';
   protected $params = [];

   public function __construct()
   {
      $url = $this->getUrl();
      if (file_exists('../App/Controllers/' . ucwords($url[0]) . '.php')) {
        $this->currentController = ucwords($url[0]);
        unset($url[0]);
      }
      require_once '../App/Controllers/' . $this->currentController . '.php';
      $this->currentController = new PageController();
   }

   public function getUrl()
   {
      if (isset($_GET['url'])) {
        $url = rtrim($_GET['url'], '/');
        $url = filter_var($url, FILTER_SANITIZE_URL);
        $url = explode('/', $url);
        return $url;
      }
   }
}

PageController.php

namespace App\Controllers;

class PageController
{
   public function __construct()
   {
      echo "Page Loaded!!!";
   }
}

PostController.php

namespace App\Controllers;

class PostController
{
   public function __construct()
   {
      echo "Post Controller Loaded!!!";
   }
}

index.php(在公共文件夹中)

use App\Libraries\Core;

require_once '../App/bootstrap.php';

$init = new Core;

bootstrap.php(在App文件夹中)

<?php

require dirname(__DIR__) . '..\vendor\autoload.php';

我希望当我使某些其他控制器能够在其中写一些东西并获得输出而没有错误或与PageController中的数据相同时。

1 个答案:

答案 0 :(得分:0)

我撤下了您的存储库,有些事情我不得不更改。

确保RewriteBase中的.htaccess来自正确的文档根目录。如果不使用虚拟主机,则需要使用从本地主机到项目的路径。

此外,在调用对象之前,您仍在使用require语句。您不需要那个。去掉它。

在顶部,将名称空间添加到$currentController属性。如果设置了$url[0],请按如下所示为命名空间添加前缀:

$this->currentController = '\App\Controllers\\' . ucwords($url[0]);

这使post控制器和页面控制器正常工作。