Контроллеры Kohana 3.2 в классах/контроллерах/‹подпапке›/‹подпапке›

Я уже видел много вопросов, очень похожих на этот вопрос (например, этот и this), но моя проблема в том, что мои контроллеры находятся в подпапке в папке внутри папки controllers. Моя структура каталогов выглядит так:

classes/
    controllers/
        admin/
            manageMemberProfile/
                memberList.php
                memberProfileInfo.php
                editMemberProfile.php
            manageCompanyProfile/
                ........
        member/
            ........

        guest/
            ........

    models/
        ........

Обратите внимание, что я уже сделал решение по предоставленной ссылке (и мне удалось заставить его работать), но это только для контроллеров, которые находятся в папке внутри папки controllers. Я хочу вызвать свои контроллеры с такой настройкой каталога. Я новичок в маршрутизации в kohana 3.2, поэтому я действительно не знаю, как это решить, и я также читал их документацию по маршрутизации, но до сих пор не могу решить эту свою проблему.


person boi_echos    schedule 28.06.2015    source источник


Ответы (1)


Ответы, указанные в ссылках, работают и здесь. Вам просто нужно добавить подкаталог, например. нравится

Route::set('admin_manageMembersProfile', 'admin/manageMembersProfile(/<controller>)')
    ->defaults(array(
        'directory' => 'admin/manageMembersProfile',
        'controller' => 'defaultController',
        'action' => 'defaultAction',
    ));

Конечно, будет сложно сделать это для каждого подкаталога. Таким образом, вы можете использовать логику маршрута Lambda/Callback:

Route::set('admin', function($uri) {
    $directories = array('manageMembersProfile', 'manageOthers');
    if (preg_match('#^admin/('.implode('|', $directories).')(/[^/]+)*#i', $uri, $match)) {
        $subdirectory = $match[1];
        if (array_key_exists(2, $match)) {
            $controller = trim($match[2], '/');
        } else {
            $controller = 'defaultController';
        }
        if (array_key_exists(3, $match)) {
            $action = trim($match[3], '/');
        } else {
            $action = 'defaultAction';
        }
        return array(
            'directory' => 'admin/'.$subdirectory,
            'controller' => $controller,
            'action' => $action,
        );
    }
});

Это только очень простой пример, но я надеюсь, что он показывает, как вы можете управлять маршрутизацией таким образом.

person kero    schedule 28.06.2015
comment
Должен ли я изменить имя моего контроллера на Controller_Guest_MemberProfileInfo? Потому что я пробую ваше первое решение, но оно все еще не работает. - person boi_echos; 28.06.2015
comment
@boi_echos В примере с администратором контроллер должен быть назван Controller_Admin_ManageMembersProfile_MemberList - каждый подкаталог должен быть добавлен с _ - person kero; 28.06.2015
comment
Вау, теперь это работает. Спасибо. У меня возникла проблема с вызовом действия в контроллере, и я обнаружил, что вам нужно добавить (/‹action›) в маршрут. - person boi_echos; 28.06.2015