Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Unhandled Exception
Message:
Class 'Admin_Controller' not found
Выдает мне после попытки выполнения Login контроллера
Вот такой год и структура папок http://grab()by/iU76
Если напрямую к Admin_Controller общащаюсь все ок, если убираю extends, то тоже все ок, а вот наследовать не хочет.
В роутах такое написано
Route::filter('pattern: admin/*', 'auth');
Route::any('/', 'main_page@index');
Route::controller(Controller::detect());
Не в сети
Вопрос решен добавлением в start.php
Autoloader::map(array(
'Base_Controller' => path('app').'controllers/base.php',
'Admin_Controller' => path('app').'controllers/admin.php',
));
Не в сети
Теперь другая проблема, локально все отлично работает. А на сервере 404 ошибка по адресу /admin/login/ а если в роуты добавляю
Route::controller('admin.login');
То все ок, но я не хочу для каждого контроллера роут писать
Не в сети
Это странно, потому что PHPController::detect()
проходит по папке рекурсивно и должен найти вложенные контроллеры. Посмотри, что он возвращает через PHPvar_dump()
.
Как ещё вариант можешь добавить в login.php PHPrequire_once __DIR__.DS.'..'.DS.'admin.php';
— тогда базовый класс будет подключаться сам без автозагрузчика Laravel. Алиасы не нужны.
Не в сети
Он находит.
Вывел мне
string(5) "admin"
[5]=>
string(12) "admin.photos"
[6]=>
string(11) "admin.login"
[7]=>
string(10) "admin.text"
Поле этого меня смутил их порядок, сначала идет admin, а потом то что в папочке, т.к. в CodeIgniter(мой прошлый фреймворк), было указано, что сначала прописываются роуты которые дальше всего ведут.
Это по ходу нужно для того чтоб не получилось они не перекрывались. Т.е. если сейчас смотреть на их порядок то получится что обращаясь к /admin/login запрос идет в контроллер admin и ищат там метод login который не находит и выдает 404.
В качестве решения написал так.
$controllers = Controller::detect();
usort($controllers, function ($a, $b) {if (strlen($a) < strlen($b)) return 1; elseif (strlen($a) == strlen($b)) return 0; else return -1;});
Route::controller($controllers);
Тут массив сортируется по длине значений, не уверен что это правильно и что не может быть каких-то ситауаций где это решение не сработает, т.к. устал и тяжело думать) Но вроде должно быть правильным.
Странно что локально оно правильно сортирует.
Не в сети
- Поле этого меня смутил их порядок, сначала идет admin, а потом то что в папочке
Судя по всему именно поэтому он и не реагирует на вложенные контроллеры, потому что их перекрывает общий контроллер admin.
- Странно что локально оно правильно сортирует.
Порядок сортировки папок/файлов зависит от ОС.
Это баг в Laravel. Обойти его можешь написав свой PHPController::detect()
, типа:
...
$sub = array();
foreach ($items as $item) {
if ($item->isDir()) {
$nested = static::detect($bundle, $item->getRealPath());
$sub = array_merge($sub, $nested);
} else {
...
}
}
return array_merge($sub, $controllers);
Тогда подконтроллеры будут идти перед основными контроллерами.
Не в сети
Спасибо, попробую.
Не в сети
Не в сети
Страницы 1