2015-07-13 3 views
0

Я пытаюсь создать MVC Framework для изучения целей.Вызов класса в другом классе (call_user_func)

Итак, я пытаюсь вызвать класс и действие, прочитав URL. Но у меня проблемы с функцией call_user_func.

Я уже прочитал URL-адрес и установил имена контроллеров и действий, но я не могу его назвать. Когда я запускаю функцию call_user_func, я получаю следующую ошибку: Fatal error: Class 'PageController' not found in...

Очевидно, класс не загружен, и это мой вопрос. Как я могу сделать его вызываемым здесь? У меня есть пространство имён, но я не знаю, полезно ли это для чего-то.

Вот код

namespace Core\Dispatcher; 

use Core\Routing\Router; 

class Dispatch { 

    private $params = []; 

    public function dispatch() 
    { 
     $this->getParams(); 

     /*error occurs here*/ call_user_func(new $this->params['Controller'], $this->params['Action']); 
    } 

    private function getParams() 
    { 
     $this->params = Router::read(); 
    } 
} 
/* 
* Router::read reads url and return an array with Controller and Action names 
*/ 

Да, все это основано на CakePHP Framework, но только название класса, папка и т.д.

Таким образом, любая идея? Я забываю информацию?

Спасибо

Редактировать Вот ссылка на мой репозиторий на Bitbucket. Я думаю, что это разрешить загрузку. Bitbucket

+0

«Отверстие на основе CakePHP Framework, но только имена классов, папок» - используете ли вы основной исходный код cakePHP, чтобы заставить ваш код работать? торт довольно хорош для создания быстрых сайтов MVC, на мой взгляд, – bish

+0

Является ли пространство имен одинаковым в другом классе? – Stefan

+0

Убедитесь, что файл контроллера включен. –

ответ

0

Подписи call_user_func является:

mixed call_user_func (callable $callback [, mixed $parameter [, mixed $... ]]) 

пары 1 является вызываемым

паров 2..n являются параметрами

Так что вы делаете здесь есть, пытаясь позвонить сам объект, с действием в качестве параметра. Это не сработает.

Чтобы вызвать функцию объекта, вызываемая должен быть в формате

array($object, $method) 

Таким образом, в вашем примере:

call_user_func(array(new $this->params['Controller'], $this->params['Action'])); 

Если ваш контроллер находится в пространстве имен App \ Controller, то $ this-> params ['Controller'] должно иметь значение App \ Controller \ ClassName.

Кроме того, вам необходимо включить соответствующий файл php с определением класса, если у вас нет автозагрузки на месте.

+0

Ушел! Спасибо! Просто добавлено пространство имен. –

Смежные вопросы