торт php AppController и наследование - PullRequest
2 голосов
/ 14 апреля 2010

Во многих уроках компонента Acl в cakephp я получил инструкцию, которая добавляет компонент либо в AppController, либо во всех других контроллерах, которые наследуют AppController .......

но проблема в

var $components=array('Auth',Acl);

когда я использую вышеуказанную строку в AppConroller, я не могу использовать компонент Auth или Acl ... но когда я использую один и тот же код во всех дочерних классах, он работает нормально ........

в чем будет проблема

вот мой appController

<?php
class AppController extends Controller {

     var $helpers = array('Html', 'Form', 'Session','CssMenu');
     var $components = array('Auth');

     function beforeFilter() {
        //Configure AuthComponent
        $this->Auth->authorize = 'actions';
        $this->Auth->authError = "Sorry, you are lacking access.";
        $this->Auth->userModel = 'Login';
}

}
?>

код для пользователейКонтроллер

<?php
class userssController extends AppController{
    var $name="Logins";
    //var $components = array('Auth');
    var $layout='login';

    function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('*');
        $this->Auth->loginRedirect = array('controller' => 'homes', 'action' => 'index');
    }
}
?>

когда я комментирую строку 4, это будет ошибкой на раскомментированном работает нормально заранее спасибо

любая помощь будет оценена.

Ответы [ 3 ]

5 голосов
/ 21 ноября 2011

Мне удалось это осуществить. У меня была пара контроллеров, которые совместно использовали некоторые методы, но другие контроллеры в приложении не использовали (и не могли) использовать эти методы, потому что в модели должны были присутствовать определенные данные. Более того, нельзя разрешать вызывать контроллер, содержащий общие методы, в URL, что было дополнительной проблемой.

  1. Создайте контроллер в папке контроллеров с именем shared_controller.php. Определите в нем некоторые общие методы и убедитесь, что он расширяет AppController:

    class SharedController extends AppController {
    
  2. Мои субконтроллеры расширяли AppController. Измените это, чтобы расширить SharedController вместо этого. Я не смог заставить общий контроллер загружаться автоматически, поэтому я добавил App :: import выше этого:

    App::import('Controller', 'Shared');
    class SubController extends SharedController {
    
  3. Компоненты и помощники должны быть объединены в родительские переменные вручную; в противном случае дочерние классы перезапишут их. Определите метод __construct в каждом субконтроллере и вызовите array_merge для компонентов, помощников и всего остального. Вызовите родительский конструктор в конце. Примечание: это не может быть сделано в beforeFilter

    function __construct(){
        $this->components = array_merge($this->components,array('Mycomponent'));
        parent::__construct();
    }
    
  4. Если вы позвоните http://example.com/shared/method,, вы, вероятно, получите сообщение об ошибке, что вы пропустили таблицу базы данных или пропустили представление. Мне не нужно было вызывать методы из Shared для непосредственного вызова, поэтому я определил маршрут для простого перенаправления на главную страницу:

    Router::connect('/shared/*', array('controller' => 'pages', 'action' => 'display', 'home'));
    

Надеюсь, это кому-нибудь поможет!

4 голосов
/ 10 сентября 2013

Если кому-то интересно, почему их $components и $helpers перезаписывают, а не объединяют после изменения наследования, потому что вам нужно определить protected $_mergeParent = 'YourParentClass';. По умолчанию для этого параметра установлено значение «AppController».

Источник: CakePHP 2.4 Исходный код

0 голосов
/ 14 апреля 2010

Я думаю, что в вашем коде может быть что-то не так. Если вы добавите строку в /app/cake/libs/controller/app_controller.php, каждый дочерний класс сможет использовать компоненты. См. о app_controller в поваренной книге :

CakePHP объединяет следующие переменные из AppController с контроллерами вашего приложения: $components,$helpers,$uses

EDit @ deceze

вы можете написать свой собственный настроенный базовый контроллер в /app/yourown_app_controller.php

class YourOwnAppController extends Controller
{
       var $components = array("Auth");
}

затем используйте его по требованию, например require_once(APP."yourown_app_controller.php"); в файле дочернего контроллера.

...