2013-07-15 3 views
1

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

Это было не совсем то, что я надеялся, так что я добавил в моем 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, работающий в плагине, не так ли?

EDIT

Ниже AppController.php фрагмент кода, где я настроил Auth:

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' 
    ); 
+0

У вас есть функция beforeFilter в файле 'IssueTrackerAppController'? если это так, вам нужно добавить еще один родительский :: beforeFilter(); 'вызов внутри там –

+0

Да, есть. Забыл упомянуть, но это вызывает вызов «parent :: beforeFilter();». – JorickL

+0

Можете ли вы перезаписать параметры компонента, используя beforeFilter? –

ответ

1

Тайна решена.

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

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

+1

Это похоже на простой пример неправильного использования 'requestAction' - и страдания (некоторые из) последствий этого. – AD7six

+0

Да, я начну переписывать этот бит кода, чтобы он разместился в соответствующей модели. – JorickL