2017-01-18 2 views
-1

Одна из функций, которые у меня есть в моем классе App.php, который находится в папке App в корневом каталоге. Эта функция должна создать экземпляр класса контроллера, который, очевидно, находится внутри папки App/Controllers с другим пространством имен.Создание динамического класса с пространством имен из другого класса

Я получаю следующую ошибку при вызове нового класса по имени контроллера: Я не понимаю, почему он ищет класс PagesController.php внутри класса App.php.

(!) Fatal error: Uncaught Error: Class 'PagesController.php' not found in D:\wamp64\www\app\App.php on line 36

public function renderPage($page, $route) { 
    $this->page = $page; 
    if(file_exists(CONTROLLERS . '/' . $route['controller'] . '.php')) { 
     $controllerFile = $route['controller'] . '.php'; 
     $controller = new $controllerFile(); 
     echo 'YES CONTROLLER!'; 
    } else { 
     echo 'no :<'; 
    } 
    echo $this->plates->render("pages::$page"); 
} 
+2

Вы должны 'classname', а не' 'filename' для new' оператора –

+1

А что пространство имен следует использовать? Где 'require' или' include' файла? –

ответ

1

Прежде всего проверить, если файл существует, но не включать этот файл в дальнейшем использовать это файл.

Позже у вас есть имя файла контроллера $route['controller'] . '.php' и попробуйте назвать его new $route['controller'] . '.php'; - вот ошибка.

Вам необходимо включить его:

$controllerFile = CONTROLLERS . '/' . $route['controller'] . '.php'; 

if(file_exists($controllerFile)) { 
    require_once($controllerFile); 
    $controller = new $route['controller'](); 
    echo 'YES CONTROLLER!'; 
} 

I don't understand why it's looking for the class PagesController.php inside the App.php class

Поскольку $route['controller'] содержит PageController строку.

+0

Все еще получаю сообщение об ошибке: (!) Неустранимая ошибка: Не удалось получить ошибку: Class 'PagesController' не найден в D: \ wamp64 \ www \ app \ App.php в строке 39 ........... The PagesController class находится в папке D: \ wamp64 \ www \ app \ controllers, поэтому я не знаю, почему она выглядит в самом файле App.php. Может быть, из-за пространства имен? –

+0

@PaulDiamant Это не выглядит * внутри класса *, просто говорит вам, где ваша ошибка. Скажи мне, что «КОНТРОЛЛЕРЫ». '/'. $ route ['controller']. '.php''. Также убедитесь, что в этом файле есть класс PageController и он не находится под пространством имен. – Justinas

+0

Теперь он работает после того, как я удалил свое пространство имен из PagesController ... однако я хочу использовать пространство имен, есть ли способ добавить приложение \ controllers пространства имен в метод динамического вызова? –

0

Я пришел с окончательным решением;

Вы должны добавить пространство имен, используя \ slash и вырвав его. Итак, теперь он работает с использованием пространства имен.

public function renderPage($page, $route) { 
     $this->page = $page; 
     $controllerFile = CONTROLLERS . '/' . $route['controller'] . '.php'; 
     if(file_exists($controllerFile)) { 
      require (CONTROLLERS . '/' . $route['controller'] . '.php'); 
      $class = __NAMESPACE__ . '\\controllers\\' . $route['controller']; 
      $controller = new $class(); 
     } 

     echo $this->plates->render("pages::$page"); 
    } 
Смежные вопросы