PHP: <?php /** * Created by PhpStorm. * User: Леонид * Date: 30.04.2016 * Time: 19:55 */ namespace App\Components; use App\Config\Rout As Rout; use App\Controller\SiteController As SiteController; class Router extends Rout { private $rout; public function __construct() { //Запись маршрутов $this->rout = $this->getRout(); } private function getUrl () { if (!empty($_SERVER['REQUEST_URI'])) { return $_SERVER['REQUEST_URI']; } } public function rout() { $uri = $this->getUrl(); foreach ($this->rout as $uriPattern => $path) { if (preg_match('~'.$uriPattern.'~',$uri)) { $internalRoute = preg_replace('~'.$uriPattern.'~', $path, $uri); //Определяем контроллер и action $segments = explode('/', $internalRoute); $controllerName = array_shift($segments).'Controller'; $controllerName = ucfirst($controllerName); $actionName = 'action'.ucfirst(array_shift($segments)); $parameters = $segments; /*$controllerFile = ROOT.'/app/controller/'. $controllerName.'.php'; //Тут надо будет подключить файл контроллера if (file_exists($controllerFile)) { include_once($controllerFile); };*/ // если я это разкоментирую что странно тоже не работает... Какие то конфликты с namespace? $controllerObject = new $controllerName; // если здесь напишу не имя переменной а просто класс то будет ошибка... Это что за фигня то :( Подскажите плиз как это обойти. $result = call_user_func_array(array($controllerObject, $actionName), $parameters); if ($result != NULL) { break; } } } } } Жесь какая то $controllerName несёт в себе имя класса если я использую там навзвание класса без переменной то всё будет пучком... А с переменной не хочет... (
@askanim, что значит напишу имя переменной? Если передаш переменную конструктору? --- Добавлено --- Ошибки какие-нибудь есть? --- Добавлено --- Не ясно, пока не покажешь какая ошибка. Попробуй включить вывод ошибок.
Нет не конструктор. Он то тут при чём. Посмотри код. Видишь где PHP: $controllerObject = new $controllerName; $controllerName - Несёт название класса. Так вот Пишет класс не отвечает. А если сделать вот так то работает. PHP: $controllerObject = new SiteController --- Добавлено --- Fatal error: Class 'SiteController' not found in D:\local\OpenServer\domains\newmvc.ru\app\components\Router.php on line 55 Вывод ошибок у меня включен. --- Добавлено --- Подскажи пожалуйста почему не работает переменная с namespace и как туда подставлять динамическое значение класса.?
У меня файлы классов контроллеров находятся в директории app/controller.... А ROOT это константа объявленая в корне файлы define('ROOT', dirname(__FILE__)); Вот выложит на github файлы. https://gist.github.com/askanim/57c10f8b6ba8eb41843c1dc7b0fcd1b2
Тоже самое. Всё без namespace до этого работало прекрасно начал под стандарт переделывать пошло поехало... Ппц. --- Добавлено --- А убрал от туда namespace заработало... Старнно, а почему с namespace не работало то. Имею ввиду убрал из файла контроллера namespace
Это в SiteController... НО Я УЖЕ ВСЁ СДЕЛАЛ КАК НАДО УРАААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААА --- Добавлено --- Ща покажу как. --- Добавлено --- Код (Text): <?php /** * Created by PhpStorm. * User: Леонид * Date: 30.04.2016 * Time: 19:55 */ namespace App\Components; use App\Config\Rout As Rout; use App\Controller; class Router extends Rout { private $rout; public function __construct() { //Запись маршрутов $this->rout = $this->getRout(); } private function getUrl () { if (!empty($_SERVER['REQUEST_URI'])) { return trim($_SERVER['REQUEST_URI'], '/'); } } public function rout() { $uri = $this->getUrl(); echo '<pre>'; print_r($this->rout); echo '</pre>'; foreach ($this->rout as $uriPattern => $path) { if (preg_match('~'.$uriPattern.'~', $uri)) { $internalRoute = preg_replace('~'.$uriPattern.'~', $path, $uri); //Определяем контроллер и action $segments = explode('/', $internalRoute); $controllerName = array_shift($segments).'Controller'; $controllerName = ucfirst($controllerName); $actionName = 'action'.ucfirst(array_shift($segments)); $parameters = $segments; echo $controllerName; echo '<br>'; /* $controllerFile = ROOT.'/app/controller/'. $controllerName.'.php'; //Тут надо будет подключить файл контроллера if (file_exists($controllerFile)) { include_once($controllerFile); };*/ $project_name = 'App'; $package_name = 'Controller'; $fully_qualified_name = $project_name . '\\' . $package_name . '\\' . $controllerName; $controllerObject = new $fully_qualified_name(); $result = call_user_func_array(array($controllerObject, $actionName), $parameters); if ($result != NULL) { break; } } } } }
Насколько я помню, когда используешь имя класса в переменной, это имя должно содержать полное имя класса с неймспейсом. Никакие фразы namespace и use здесь не влияют!
Ну я так и сделал... PHP: $project_name = 'App'; $package_name = 'Controller'; $fully_qualified_name = $project_name . '\\' . $package_name . '\\' . $controllerName; $controllerObject = new $fully_qualified_name();