[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как устранить ошибку: «call_user_func_array() expe
Страницы: 1, 2, 3, 4
RomanRomanov
Цитата (casper - gg @ 19.01.2016 - 23:42)
если все делать последовательно, то ошибка обязательно найдется... вопрос времени

да, буду разбираться, но если у вас будет время и не будет его жалко, посмотрите у меня на гитхабе, буду очень признателен)
sergeiss
RomanRomanov, я так и не понял, как именно ты переводишь ошибку. У тебя в тексте ошибки написано "русским по белому" smile.gif, что в классе SiteController нет метода actionIndexcsite.
Класс SiteController находится в файле SiteController.php. ОК, открываем его. Смотрим. Там только один-единственный метод actionIndex. А ты его где-то вызываешь (судя по тексту ошибки!!!) как actionIndexcsite. Разницу между 'actionIndexcsite' и 'actionIndex' видишь?

Вот где ты его вызываешь в таком виде, уж ищи сам. Возможно, что в адресной строке такое пишешь, а оно передается в контроллер??? (твой роутер наводит на такие мысли)

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
RomanRomanov
Цитата (sergeiss @ 20.01.2016 - 00:23)
я так и не понял, как именно ты переводишь ошибку. У тебя в тексте ошибки написано "русским по белому" , что в классе SiteController нет метода actionIndexcsite.
Класс SiteController находится в файле SiteController.php. ОК, открываем его. Смотрим. Там только один-единственный метод actionIndex. А ты его где-то вызываешь (судя по тексту ошибки!!!) как actionIndexcsite. Разницу между 'actionIndexcsite' и 'actionIndex' видишь?

Вот где ты его вызываешь в таком виде, уж ищи сам. Возможно, что в адресной строке такое пишешь, а оно передается в контроллер???

я все вижу, должен вызываться actionIndex(), в роутах прописано category/index, далее из этой строки берется index к нему добавляется action, Первую букву index переводим в верхний регистр - это и есть имя вызываемого метода, переданного в функция call_user_fucn_array(array($controllerObject, $actionName), $parameters), actionName - должен по идее содержать именно этот метод, а не actionIndexcsite();
sergeiss
Цитата (RomanRomanov @ 20.01.2016 - 00:29)
должен по идее содержать именно этот метод, а не actionIndexcsite();

Ну так ищи, где ты добавляешь 'csite'! Чудес на свете не бывает smile.gif Покажи, в частности, какая у тебя при этом адресная строка в браузере, т.е. когда ты получаешь эту ошибку.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
RomanRomanov
Цитата (sergeiss @ 20.01.2016 - 00:33)
Ну так ищи, где ты добавляешь 'csite'! Чудес на свете не бывает  Покажи, в частности, какая у тебя при этом адресная строка в браузере, т.е. когда ты получаешь эту ошибку.

вот такая адресная строка - http://e-shopper.ru/cabinet
в том то и дело, csite нигде не добавляю, остальные методы по этому же роутеру прекрассно отрабатывают, не добавляя к себе всякие csite
VeRTak
RomanRomanov

Поиск по IDE, на csite, откуда то же он появился, не с луны же свалился
RomanRomanov
Цитата (Wind @ 20.01.2016 - 00:55)
Поиск по IDE, на csite, откуда то же он появился, не с луны же свалился

ищу...
Invis1ble
https://github.com/Roman-Romanov97/phpshop/.../router.php#L23
var_dump($uriPattern);
var_dump($path);
var_dump($uri);
$internalRoute = preg_replace("~$uriPattern~", $path, $uri);

вывод в студию

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

sergeiss
RomanRomanov, у меня осталось единственное разумное предположение, что твой код и код на гитхабе отличаются. Я взял твой код роутера, в урезанном виде (из конфига и основного файла) - нет ошибки, всё нормально обрабатывается.

Покажи текущее содержимое (с твоего компа) файлов config/routes.php и app/components/router.php, чтобы сравнить их с гитхабовскими версиями.

PS. Сорри, не совсем получается хорошо с твоим кодом smile.gif Но той ошибки нет.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
sergeiss
RomanRomanov, вот смотри....
Из твоих файлов получил такие:
routes.php
<?php

$routes = array(
// товар
'product/([0-9]+)' => 'product/view/$1',
// каталог
'catalog' => 'catalog/index', //actionIndex in CatalogController
// категория товаров

'category/([0-9]+)/page-([0-9]+)' => 'catalog/category/$1/$2', //actionCategory in CatalogController
'category/([0-9]+)' => 'catalog/category/$1', //actionCategory in CatalogController
//пользователь

'user/register' => 'user/register', //actionRegister in UserController
'cabinet' => 'cabinet/index', //actionIndex in CabinetController
// главная страница

'index.php' => 'site/index',
'' => 'site/index', //actionIndex in SiteController
//actionView in ProductController

);

$uri = 'csite';

foreach($routes as $uriPattern => $path){
// Сравниваем $uriPattern и $uri
if(preg_match("~$uriPattern~", $uri)){

// Получаем внутренний путь из внешнего согласно правилу.
$internalRoute = preg_replace("~$uriPattern~", $path, $uri);
echo $internalRoute.'<br>';
// Определить контроллер, action, параметры
$segments = explode('/', $internalRoute);
// получаем имя контроллера
$controllerName = array_shift($segments).'Controller';
$controllerName = ucfirst($controllerName);
// получаем имя action()
$actionName = 'action'. ucfirst(array_shift($segments));

echo $controllerName.', '.$actionName.', '.print_r($segments,1).'<br>';
// остатки запрос из uri записываем в массив parametrs;
$parameters = $segments;


//
// echo '<pre>';
// print_r($segments);


$controllerFile = $controllerName.'.php'; // ROOT . '/app/controllers/' . $controllerName . '.php';
//// подключаем файл с именем контроллера
if(file_exists($controllerFile)){
include_once($controllerFile);
}
//// создаем объект только что пожключенного класс-контроллера
$controllerObject = new $controllerName;
//// передаем параметры в action этого контроллера с помощью ф-ции call_user_func_array
$result = call_user_func_array(array($controllerObject, $actionName), $parameters);
//
var_dump($result);
//
// if($result != null){
// break;
// }

}
}


и

SiteController.php
<?php
class
SiteController{

public function actionIndex(){
// Список категорий для левого меню
// $categories = Category::getCategoriesList();
// Список последних товаров
// $latestProducts = Product::getLatestProducts(6);

// include_once(ROOT . '/app/views/site/index.php');


return true;
}
}


На выходе получаю ошибку, "до боли тебе знакомую":
Цитата
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'SiteController' does not have a method 'actionIndexcsite' in C:\XXXXXX\test\routes.php on line 63

Я могу точно сказать, что твою обработку я не менял :)

А переменная $internalRoute содержит вот такую, очень странную величину
Цитата
site/indexcsite/indexssite/indexisite/indextsite/indexesite/index


Короче говоря, ищи ошибку в этой строке:
$internalRoute = preg_replace("~$uriPattern~", $path, $uri);


Я думаю, что подобный эффект можно получить и при других каких-то данных в переменной $uri, т.к. производится некорректная работа с регулярками.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.