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



我正在从头开始构建自定义MVC框架,当我在pagecontroller中打印一些东西时,应用程序正在工作,但是当我创建其他控制器并尝试打印某些东西时,它只是从PageController打印数据。

我认为问题在于我放置可变保护的$currentController = 'PageController';$this->currentController = new PageController();的位置。

现在我尝试放置$this->currentController = new $this->currentController;,并且得到此错误:

'致命错误:未被发现的错误:c: xampp htdocs htdocs php app libraries core.php:20 stack跟踪:#0 c:xampp xampp htdocs htdocs phpp php php php \ php \ php phpp \ php \ php \ priubl index.php(7):app libraries core-> __ construct()#1 {main}在C: xampp htdocs htdocs htdocs php php app app core.php in 20'。

也我正在使用Composer并使用PSR-4和名称上的自动加载。

core.php

namespace AppLibraries;
use AppControllersPageController;
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 AppControllers;
class PageController
{
   public function __construct()
   {
      echo "Page Loaded!!!";
   }
}

postcontroller.php

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

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

use AppLibrariesCore;
require_once '../App/bootstrap.php';
$init = new Core;

bootstrap.php(在应用程序文件夹中)

<?php
require dirname(__DIR__) . '..vendorautoload.php';

我希望当我制作其他控制器能够在其中写入某些内容并在没有错误或与PageController中相同的数据中获取输出时。

我将您的存储库拉下来,我必须更改一些东西。

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

另外,在调用对象之前,您仍在使用requient语句。您不需要。去掉它。

在顶部,将名称空间添加到$currentController属性。如果设置了$url[0],请前缀像这样的名称空间:

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

让帖子控制器和页面控制器有效。

相关内容

  • 没有找到相关文章

最新更新