За последние 24 часа нас посетили 30914 программистов и 1446 роботов. Сейчас ищут 818 программистов ...

namespace... use(Кто нибудь подскажите) ? Не работает подключение классов из переменной!?

Тема в разделе "PHP для новичков", создана пользователем askanim, 2 май 2016.

  1. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: Леонид
    5. * Date: 30.04.2016
    6. * Time: 19:55
    7. */
    8.  
    9. namespace App\Components;
    10.  
    11. use App\Config\Rout As Rout;
    12. use App\Controller\SiteController As SiteController;
    13. class Router extends Rout
    14. {
    15.     private $rout;
    16.  
    17.     public function __construct()
    18.         {
    19.             //Запись маршрутов
    20.             $this->rout = $this->getRout();
    21.         }
    22.  
    23.  
    24.     private function getUrl ()
    25.     {
    26.         if (!empty($_SERVER['REQUEST_URI'])) {
    27.             return $_SERVER['REQUEST_URI'];
    28.         }
    29.     }
    30.     public function rout()
    31.     {
    32.         $uri = $this->getUrl();
    33.         foreach ($this->rout as $uriPattern => $path)
    34.         {
    35.             if (preg_match('~'.$uriPattern.'~',$uri))
    36.             {
    37.                 $internalRoute = preg_replace('~'.$uriPattern.'~', $path, $uri);
    38.                 //Определяем контроллер и action
    39.  
    40.                 $segments = explode('/', $internalRoute);
    41.  
    42.                 $controllerName = array_shift($segments).'Controller';
    43.                 $controllerName = ucfirst($controllerName);
    44.  
    45.                 $actionName = 'action'.ucfirst(array_shift($segments));
    46.  
    47.                 $parameters = $segments;
    48.  
    49.                 /*$controllerFile = ROOT.'/app/controller/'.
    50.                    $controllerName.'.php';
    51.                //Тут надо будет подключить файл контроллера
    52.                if (file_exists($controllerFile)) {
    53.                    include_once($controllerFile);
    54.                };*/ // если я это разкоментирую что странно тоже не работает... Какие то конфликты с namespace?
    55.                 $controllerObject = new $controllerName; // если здесь напишу не имя переменной а просто класс то будет ошибка... Это что за фигня то :( Подскажите плиз как это обойти.
    56.  
    57.                 $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
    58.  
    59.                 if ($result != NULL)
    60.                 {
    61.                     break;
    62.                 }
    63.             }
    64.         }
    65.     }
    66. }
    Жесь какая то $controllerName несёт в себе имя класса если я использую там навзвание класса без переменной то всё будет пучком... А с переменной не хочет... (
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @askanim, что значит напишу имя переменной? Если передаш переменную конструктору?
    --- Добавлено ---
    Ошибки какие-нибудь есть?
    --- Добавлено ---
    Не ясно, пока не покажешь какая ошибка.
    Попробуй включить вывод ошибок.
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Нет не конструктор. Он то тут при чём. Посмотри код. Видишь где
    PHP:
    1. $controllerObject = new $controllerName;
    $controllerName - Несёт название класса. Так вот
    Пишет класс не отвечает. А если сделать вот так то работает.
    PHP:
    1. $controllerObject = new SiteController
    --- Добавлено ---
    Fatal error: Class 'SiteController' not found in D:\local\OpenServer\domains\newmvc.ru\app\components\Router.php on line 55


    Вывод ошибок у меня включен.

    --- Добавлено ---
    Подскажи пожалуйста почему не работает переменная с namespace и как туда подставлять динамическое значение класса.?
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Может ...app/components/.... ?
     
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    У меня файлы классов контроллеров находятся в директории app/controller.... А ROOT это константа объявленая в корне файлы
    define('ROOT', dirname(__FILE__));

    Вот выложит на github файлы. https://gist.github.com/askanim/57c10f8b6ba8eb41843c1dc7b0fcd1b2
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    use App\Controller\SiteController As SiteController; попробуй его удалить
    это раскомментировать
     
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Тоже самое. Всё без namespace до этого работало прекрасно начал под стандарт переделывать пошло поехало... Ппц.
    --- Добавлено ---
    А убрал от туда namespace заработало... Старнно, а почему с namespace не работало то. Имею ввиду убрал из файла контроллера namespace
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Какой namespace стоял там?:
     
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    namespace App\Controller;
     
  10. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Это в SiteController?
    --- Добавлено ---
    Или какой то дочерной класс?
     
  11. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Это в SiteController... НО Я УЖЕ ВСЁ СДЕЛАЛ КАК НАДО УРАААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААА
    --- Добавлено ---
    Ща покажу как.
    --- Добавлено ---
    Код (Text):
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: Леонид
    5. * Date: 30.04.2016
    6. * Time: 19:55
    7. */
    8.  
    9. namespace App\Components;
    10.  
    11. use App\Config\Rout As Rout;
    12. use App\Controller;
    13. class Router extends Rout
    14. {
    15.     private $rout;
    16.  
    17.     public function __construct()
    18.         {
    19.             //Запись маршрутов
    20.             $this->rout = $this->getRout();
    21.         }
    22.  
    23.  
    24.     private function getUrl ()
    25.     {
    26.         if (!empty($_SERVER['REQUEST_URI'])) {
    27.             return trim($_SERVER['REQUEST_URI'], '/');
    28.         }
    29.     }
    30.     public function rout()
    31.     {
    32.         $uri = $this->getUrl();
    33.         echo '<pre>';
    34.         print_r($this->rout);
    35.         echo '</pre>';
    36.         foreach ($this->rout as $uriPattern => $path)
    37.         {
    38.             if (preg_match('~'.$uriPattern.'~', $uri))
    39.             {
    40.                 $internalRoute = preg_replace('~'.$uriPattern.'~', $path, $uri);
    41.                 //Определяем контроллер и action
    42.  
    43.                 $segments = explode('/', $internalRoute);
    44.  
    45.                 $controllerName = array_shift($segments).'Controller';
    46.  
    47.                 $controllerName = ucfirst($controllerName);
    48.                 $actionName = 'action'.ucfirst(array_shift($segments));
    49.  
    50.                 $parameters = $segments;
    51.                 echo $controllerName;
    52.                 echo '<br>';
    53.                /* $controllerFile = ROOT.'/app/controller/'.
    54.                    $controllerName.'.php';
    55.                //Тут надо будет подключить файл контроллера
    56.                if (file_exists($controllerFile)) {
    57.                    include_once($controllerFile);
    58.                };*/
    59.                 $project_name = 'App';
    60.                 $package_name = 'Controller';
    61.                 $fully_qualified_name = $project_name . '\\' . $package_name . '\\' . $controllerName;
    62.  
    63.                 $controllerObject = new $fully_qualified_name();
    64.  
    65.                 $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
    66.  
    67.                 if ($result != NULL)
    68.                 {
    69.                     break;
    70.                 }
    71.             }
    72.         }
    73.     }
    74. }
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Насколько я помню, когда используешь имя класса в переменной, это имя должно содержать полное имя класса с неймспейсом. Никакие фразы namespace и use здесь не влияют!
     
    mahmuzar нравится это.
  13. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ну я так и сделал...
    PHP:
    1.  $project_name = 'App';
    2.                 $package_name = 'Controller';
    3.                 $fully_qualified_name = $project_name . '\\' . $package_name . '\\' . $controllerName;
    4.  
    5.                 $controllerObject = new $fully_qualified_name();
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв