Приложение загружает только один (по умолчанию) контроллер в проекте php mvc? - PullRequest
0 голосов
/ 15 февраля 2019

Я создаю собственную инфраструктуру mvc с нуля, и когда я помещаю что-то для печати в мой PageController, приложение работает, но когда я создаю какой-то другой контроллер и пытаюсь что-то напечатать, оно просто печатает данные из PageController.

Я думаю, что проблема в том, куда я помещаю защищенные переменные $currentController = 'PageController'; и $this->currentController = new PageController();.

Теперь я попытался поставить $this->currentController = new $this->currentController;, и я получил эту ошибку:

'Неустранимая ошибка: ошибка Uncaught: класс' PageController 'не найден в C: \ xampp \ htdocs \ php\ App \ Libraries \ Core.php: 20 Трассировка стека: # 0 C: \ xampp \ htdocs \ php \ public \ index.php (7): App \ Libraries \ Core -> __ construct () # 1 {main}, брошенный вC: \ xampp \ htdocs \ php \ App \ Libraries \ Core.php в строке 20 '.

Также я использую 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 (в папке приложения)

<?php

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

Я ожидаю, что когда я сделаю какой-то другой контроллер, сможет что-то записать в него и получить вывод без ошибок или тех же данных, что и в PageController.

1 Ответ

0 голосов
/ 19 февраля 2019

Я вытащил ваш репозиторий, и я кое-что изменил.

Убедитесь, что ваш RewriteBase в вашем .htaccess идет от правильного корня документа.Если вы не используете виртуальные хосты, то вам нужно использовать путь от локального хоста до проекта.

Кроме того, вы все еще используете оператор require перед вызовом объекта.Вам это не нужно.Убери это.

Вверху добавьте пространство имен к свойству $currentController.Если установлено $url[0], добавьте префикс к пространству имен следующим образом:

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

Это заставило работать контроллер сообщений и контроллеры страниц.

...