Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 10.01.2013 21:54:24

Не может найти родтельский контроллер, хотя он есть

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());

Не в сети

#2 10.01.2013 22:10:30

Re: Не может найти родтельский контроллер, хотя он есть

Вопрос решен добавлением в start.php

Autoloader::map(array(
	'Base_Controller' => path('app').'controllers/base.php',
	'Admin_Controller' => path('app').'controllers/admin.php',
));

Не в сети

#3 10.01.2013 22:15:10

Re: Не может найти родтельский контроллер, хотя он есть

Теперь другая проблема, локально все отлично работает. А на сервере 404 ошибка по адресу /admin/login/ а если в роуты добавляю

Route::controller('admin.login');

То все ок, но я не хочу для каждого контроллера роут писать

Не в сети

#4 10.01.2013 23:22:55

Re: Не может найти родтельский контроллер, хотя он есть

Это странно, потому что PHPController::detect() проходит по папке рекурсивно и должен найти вложенные контроллеры. Посмотри, что он возвращает через PHPvar_dump().

Как ещё вариант можешь добавить в login.php PHPrequire_once __DIR__.DS.'..'.DS.'admin.php'; — тогда базовый класс будет подключаться сам без автозагрузчика Laravel. Алиасы не нужны.

Не в сети

#5 12.01.2013 05:24:10

Re: Не может найти родтельский контроллер, хотя он есть

Он находит.
Вывел мне

  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);

Тут массив сортируется по длине значений, не уверен что это правильно и что не может быть каких-то ситауаций где это решение не сработает, т.к. устал и тяжело думать) Но вроде должно быть правильным.

Странно что локально оно правильно сортирует.

Не в сети

#6 12.01.2013 10:13:16

Re: Не может найти родтельский контроллер, хотя он есть

  1. Поле этого меня смутил их порядок, сначала идет admin, а потом то что в папочке

Судя по всему именно поэтому он и не реагирует на вложенные контроллеры, потому что их перекрывает общий контроллер admin.

  1. Странно что локально оно правильно сортирует.

Порядок сортировки папок/файлов зависит от ОС.

Это баг в Laravel. Обойти его можешь написав свой PHPController::detect(), типа:

PHP
  ...
  
$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);

Тогда подконтроллеры будут идти перед основными контроллерами.

Не в сети

#7 12.01.2013 10:40:05

Re: Не может найти родтельский контроллер, хотя он есть

Спасибо, попробую.

Не в сети

#8 13.01.2013 21:01:06

Re: Не может найти родтельский контроллер, хотя он есть

Попробуй родительский контроллер назвать Admin_Base_Controller и положи его в папку admin
И все остальные контроллеры наследуй от него

Изменено OrlandoST (13.01.2013 21:01:33)

Не в сети

Подвал раздела