Плагин CakePHP 2.3, похоже, не расширяет appcontroller

Я создал плагин под названием «IssueTracker», который находится в app/Plugin/IssueTracker. Я создал контроллер с именем Tickets, и он доступен по адресу www.example.com/issue_tracker/tickets/. Но только для зарегистрированных пользователей со статусом «Админ».

Это было не совсем то, на что я надеялся, поэтому я добавил в свой Plugin/IssueTracker/Controller/TicketsController.php следующее:

public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('index');
}

Я надеялся, что этот фрагмент кода (который я использую в нескольких других контроллерах в моем app/Controller/) унаследует от моего файла AppController.php. Файл TicketsController.php расширяет IssueTrackerAppController (вот так):

class TicketsController extends IssueTrackerAppController { 
//functions goes in here
}

И в моей папке Plugin/Controller я создал файл IssueTrackerAppController, который расширяет папку AppController.

В моем файле AppController.php я уже определил, что 'index' и 'view' являются публичными действиями. Но почему-то в моем плагине это не работает.

Есть ли что-то, за чем я наблюдаю? Когда я обращаюсь к www.example.com/issue_tracker/tickets как незарегистрированный пользователь (гость), он говорит мне, что мне нужно войти в систему. Если я вошел в систему как пользователь, но не как администратор, компонент Auth не позволит мне войти и представит форму входа.

Должен быть способ заставить Auth работать в плагине, верно?

ИЗМЕНИТЬ

Ниже приведен фрагмент AppController.php, где я настроил аутентификацию:

public $components = array(
        'Auth' => array(
            'loginAction' => array('controller' => 'users', 'action' => 'login', 'plugin' => false),
            'loginRedirect' => array('plugin' => false, 'controller' => 'ervaringen', 'action' => 'add'),
            'logoutRedirect' => array('plugin' => false, 'controller' => 'ervaringen', 'action' => 'index'),
            'authorize' => array('controller'),
            'flash' => array(
                'element' => 'error',
                'key' => 'auth',
                'params' => array(
                    'heading' => 'Waarschuwing!')
            ),
            'authError' => 'Je moet inloggen om deze inhoud te bekijken.',
        ),
        'Session',
        'DebugKit.Toolbar'
    ); 

person JorickL    schedule 15.07.2013    source источник
comment
у вас есть функция beforeFilter в вашем файле IssueTrackerAppController? если это так, вам нужно добавить еще один вызов parent::beforeFilter(); внутри него   -  person Tim Joyce    schedule 15.07.2013
comment
Да, есть. Забыл упомянуть, но этот также вызывает parent::beforeFilter();.   -  person JorickL    schedule 15.07.2013
comment
Можно ли перезаписать настройки компонента с помощью beforeFilter?   -  person David Yell    schedule 17.07.2013
comment
Я не понимаю вашего комментария. Это «Попробуй это» или «Можешь»?   -  person JorickL    schedule 17.07.2013


Ответы (1)


Тайна разгадана.

После повторного сканирования всего кода в плагине я заметил, что один из моих коллег по проекту использовал $variable = $this->requestAction(link/here/with/id/etc);, что ведет к функции контроллера. Эта конкретная функция никоим образом не была разрешена системой beforeFilter(), что привело к «отказу функции» в системе Auth.

Я добавил эту конкретную функцию в $this->Auth->allow('function'); в beforeFilter() плагина, и теперь она работает.

person JorickL    schedule 23.07.2013
comment
Это выглядит как яркий пример неправильного использования requestAction и страданий (некоторых) от последствий этого. - person AD7six; 23.07.2013
comment
Да, я начну переписывать этот фрагмент кода, чтобы он соответствовал соответствующей модели. - person JorickL; 23.07.2013