Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 3
Регистрация: 21.09.2015
Сообщений: 135

Работа с GET параметрами через call_user_func_array()

22.10.2016, 12:09. Показов 1269. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, вопрос может и не очень, но никак не пойму, как в через call_user_func_array использовать GET параметры.
Просто была проблема в роутинге и нашел на просторах один хороший, вроде все понятно, кроме этого момента
Класс App
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
Class App extends Singleton{
public $uri = null;
 
public function Start(){
        $this->config = new Registry(include CORE.'Config.php');
        $this->uri = new Registry(Route::gi()->parse($_SERVER['REQUEST_URI']));
        $controller = app::gi($this->uri->controller.'Controller');
        $controller->__call('action'.$this->uri->action, array($this->uri->id, $this->uri->param1,...));
    }


Класс Роутера
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
class Route extends Singleton {
 
    public $controller;
    public $action;
    public $id;
    private $path_elements = array('controller','action','id', 'page', 'alias');
 
public function parse($path){
        $request = $_REQUEST;
 
        $request['controller'] = app::gi()->config->default_controller;
        $request['action'] = app::gi()->config->default_action;
        $request['id'] = 0;
        $parts = parse_url($path);
        if (isset($parts['query']) and !empty($parts['query'])) {
            $path = str_replace('?'.$parts['query'], '', $path);
            parse_str($parts['query'], $req);
            $request = array_merge($request, $req);
        }
        foreach(app::gi()->config->router as $rule=>$keypath) {
            if (preg_match('#'.$rule.'#sui', $path, $list)) {
                for ($i=1; $i<count($list); $i=$i+1) {
                    $keypath = preg_replace('#\$[a-z0-9]+#', $list[$i], $keypath, 1);
                }
                $keypath = explode('/', $keypath);
                foreach($keypath as $i=>$key) {
                    $request[$this->path_elements[$i]] = $key;
                }
            }
        }
 
        return $request;
    }


Класс Controller
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
class Controller extends Singleton {
 
    function __call($methodName, $args=array()){
        if (method_exists($this, $methodName))
            return call_user_func_array(array($this,$methodName),$args);
        else
            throw new Except('In controller '.get_called_class().' method '.$methodName.' not found!');
    }
}


Или там вообще не может быть GET параметров? Потому что есть файл конфигурации, просто до этого ЧПУ делал только в .htaccess представления о работе таким способом маловата...
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
return array(
        'sitename' => 'Тестовая страница',
        'encode' => 'utf-8',
        'cookietime' => 3600, // время жизни куков администратора в секундах
        'version' => '1.0.0 ',
        'default_module' => 'Index',
        'default_controller' => 'Index',
        'default_action' => 'Index',
        'db' => array(),
        'router' => array(
            '([a-z0-9+_\-]+)/([a-z0-9+_\-]+)/([0-9]+)/page/([0-9]+)' => '$controller/$action/$id/$page',
            '([a-z0-9+_\-]+)/([a-z0-9+_\-]+)/([0-9]+)' => '$controller/$action/$id',
            '([a-z0-9+_\-]+)/([a-z0-9+_\-]+)' => '$controller/$action',
            '([a-z0-9+_\-]+)/?' => '$controller',
        ),
    )

Сам конфиг вызывается в классе App
PHP
1
$this->config = new Registry(include CORE.'Config.php');
И далее можно получать как
PHP
1
app::gi()->config->router
Запускаем
PHP
1
App::gi()->Start();
Вопросы чайника конечно, но не понятно...
При этом вот "такое" работает и выводит id после экшена profile (user/profile/15)
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
public function actionProfile($id = null){
        $this->id = $id;
        if ((int)$this->id == 0 || empty($this->id)){
            throw new Except('Invalid identification ID');
        } else {
            echo 'this is Action Profile in User <br>';
            $user = new User();
            echo $user->GetUserId($this->id);
        }
    }


Добавлено через 55 минут
Определенно там нет GET, тупанул, тогда вопрос, как правильно прописать в Config.php пути роутинга, чтобы получить их параметры.
Скажем нужно получить параметры по такому вот пути: news/cars/13 => news/view/$category/$page(id)
и в контроллере news
PHP
1
2
3
4
5
6
Class NewsController{
 
public function actionView($category, $id){
echo $category;
echo $id;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2016, 12:09
Ответы с готовыми решениями:

Работа с параметрами через int argc, char *argv[]
Здрасе. Нужно чтоб через консоль программе передавались некие команды.. В этом я не оч силен, так как никогда не делал такое.. Вот для...

Call_user_func_array php7
При переходе на php7 возникла ошибка Function name must be a string $result = call_user_func_array(array($oModule, $sMethod),...

Call_user_func_array отрабатывает false
не нахожу ошибки , почему отрабатывает false if(is_callable(array(__CLASS__,$call))){ if(call_user_func_array(array(__CLASS__,...

4
5 / 5 / 3
Регистрация: 22.09.2015
Сообщений: 53
22.10.2016, 12:16
Если вопрос только в том, как работать с GET-параметрами, то все просто.
В .htaccess у тебя по идее должна быть вот такая строка
PHP
1
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
, которая делает так, что любая строка приходит в качестве одного параметра. То есть и /index, и /help/contact будут восприниматься строковой переменной (з.ы. эта строка в роутере обрабатывается). А вот за передачу GET-параметров отвечает флаг QSA в htaccess. Если этот флаг есть, то после любой строки передадутся любые ГЕТы, а-ля ?filter=stat&date=2016-10-22

Добавлено через 4 минуты
Цитата Сообщение от ZikWall Посмотреть сообщение
Скажем нужно получить параметры по такому вот пути: news/cars/13 => news/view/$category/$page(id)
и в контроллере news
У тебя где-то должен лежать отдельный файлик с роутами, где прописываются пути для регулярных выражений примерно такого содержания:

PHP
1
2
3
4
5
6
7
return array(
 
    'news/([a-z]+)/([a-z]+)' => 'news/view_one_news/$1/$2',
    'news/([a-z]+)' => 'news/view_category/$1',
    'news' => 'news/index'
 
);
1
0 / 0 / 3
Регистрация: 21.09.2015
Сообщений: 135
22.10.2016, 13:20  [ТС]
Цитата Сообщение от nintendocore Посмотреть сообщение
Если вопрос только в том, как работать с GET-параметрами, то все просто.
В .htaccess у тебя по идее должна быть вот такая строка
Ага, спасибо, но я это уже проходил не раз, поскольку все время работал с mod_rewrite
Цитата Сообщение от nintendocore Посмотреть сообщение
У тебя где-то должен лежать отдельный файлик с роутами, где прописываются пути для регулярных выражений примерно такого содержания:
PHPВыделить код
1
2
3
4
5
6
7
return array(
'news/([a-z]+)/([a-z]+)' => 'news/view_one_news/$1/$2',
* * 'news/([a-z]+)' => 'news/view_category/$1',
* * 'news' => 'news/index'
);
Да , спасибо, это тоже понятно, но теперь есть более тупой вопрос, как использовать их с данным роутером?
как я уже говорил
Цитата Сообщение от ZikWall Посмотреть сообщение
Просто была проблема в роутинге и нашел на просторах один хороший
Добавлено через 29 минут
Голова кругом
Попробовал вот таким способом:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class Route extends Singleton {
/**
     * Свойство для хранения массива роутов
     * @var array
     */
    private $routes;
 
    /**
     * Конструктор
     */
    public function __construct()
    {
        // Путь к файлу с роутами
        $routesPath = CORE . 'Routes.php';
 
        // Получаем роуты из файла
        $this->routes = include($routesPath);
    }
private function getURI()
    {
        if (!empty($_SERVER['REQUEST_URI'])) {
            return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
 
    /**
     * Метод для обработки запроса
     */
    public function parse2()
    {
        // Получаем строку запроса
        $uri = $this->getURI();
 
        // Проверяем наличие такого запроса в массиве маршрутов (routes.php)
        foreach ($this->routes as $uriPattern => $path) {
 
            // Сравниваем $uriPattern и $uri
            if (preg_match("~$uriPattern~", $uri)) {
 
                // Получаем внутренний путь из внешнего согласно правилу.
                $internalRoute = preg_replace("~$uriPattern~", $path, $uri);
 
                // Определить контроллер, action, параметры
 
                $segments = explode('/', $internalRoute);
 
                $controllerName = ucfirst(strtolower(array_shift($segments))) . 'Controller';
 
                $actionName = 'action' .ucfirst(strtolower(array_shift($segments)));
 
                $parameters = $segments;
 
                // Создать объект, вызвать метод (т.е. action)
                $controllerObject = new $controllerName;
 
                /* Вызываем необходимый метод ($actionName) у определенного
                 * класса ($controllerObject) с заданными ($parameters) параметрами
                 */
                $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
                echo $controllerName.'/'.$actionName; print_r($parameters);
                // Если метод контроллера успешно вызван, завершаем работу роутера
                if ($result != null) {
                    break;
                }
            }
        }
    }

Так работает, но на этом:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Route extends Singleton {
public $controller;
    public $action;
    public $id;
    public $param1;
 
    private $path_elements = array('controller','action','category', 'id', 'page');
 
        $request = $_REQUEST;
 
        $request['controller'] = app::gi()->config->default_controller;
        $request['action'] = app::gi()->config->default_action;
        $request['id'] = 0;
        $parts = parse_url($path);
        if (isset($parts['query']) and !empty($parts['query'])) {
            $path = str_replace('?'.$parts['query'], '', $path);
            parse_str($parts['query'], $req);
            $request = array_merge($request, $req);
        }
        foreach(app::gi()->config->router as $rule=>$keypath) {
            if (preg_match('#'.$rule.'#sui', $path, $list)) {
                for ($i=1; $i<count($list); $i=$i+1) {
                    $keypath = preg_replace('#\$[a-z0-9]+#', $list[$i], $keypath, 1);
                }
                $keypath = explode('/', $keypath);
                foreach($keypath as $i=>$key) {
                    $request[$this->path_elements[$i]] = $key;
                }
            }
        }
 
        return $request;
    }

Не могу разобраться...
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
public function Start(){
        $this->config = new Registry(include CORE.'Config.php');
        #echo '<pre>'; print_r(Route::gi()->parse($_SERVER['REQUEST_URI']));
        $this->uri = new Registry(Route::gi()->parse($_SERVER['REQUEST_URI']));
        $controller = app::gi($this->uri->controller.'Controller');
        $controller->__call('action'.$this->uri->action, array($this->uri->param1)); //как сюда передать параметры?
    }
0
5 / 5 / 3
Регистрация: 22.09.2015
Сообщений: 53
22.10.2016, 13:51
Столько у Вас тут роутов и все разные.
Принцип, насколько я знаю, должен быть таким: в урле первый элемент - контроллер, второй - экшн, а остальные (при их наличии) должны складываться в массив (в последнем роуте public $param1 и передаваться в методе Start $controller->__call('action'.$this->uri->action, array($this->uri->param1));, что он и делает.
0
0 / 0 / 3
Регистрация: 21.09.2015
Сообщений: 135
22.10.2016, 15:59  [ТС]
Цитата Сообщение от nintendocore Посмотреть сообщение
в последнем роуте public $param1 и передаваться
вот это я и не понял...как его туда впихнуть...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2016, 15:59
Помогаю со студенческими работами здесь

Непонятное наследование или глюк call_user_func_array
Доброе время суток! Понемногу разбираюсь в ООП и разбирая очередной пример наткнулся на ошибку: Fatal error: Using $this when not in...

Warning: call_user_func_array() expects parameter 1 to be a valid callback
Всем привет выручайте знатоки)), залил сайт на хостинг (Wordpress) все вроде было норм, но после заливки БД (достаточно большой) при начале...

Работа с параметрами в OLEDBConnection
Привет всем! Вроде все сделал по инструкции: OleDbConnection ExcelConnection = new OleDbConnection ...

Работа с параметрами методов
Скажите пожалуйста, почему программа ничего не выдаёт? Пустой экран в консоли. Программа по оличению простых чисел от непростых using...

Работа с параметрами консоли
Предусмотреть ввод входных данных с клавиатуры и из файла (при запуске с параметром –i &lt;filename&gt;). Предусмотреть вывод результатов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru