cakePHP - как мне условно загрузить компонент в контроллер? - PullRequest
4 голосов
/ 03 августа 2010

Я использую отличный плагин для Facebook для cakephp 1.3 от http://www.webtechnick.com. Это то, что у меня есть в данный момент:

class UsersController extends AppController {
    var $name = 'Users';
    var $components = array('Facebook.Connect');

    function beforeFilter {
        $this->set('facebookUser', $this->Connect->user());
    }
}

Но я хочу условно загрузить компонент Facebook.Connect и использовать его в контроллере - как-то так в sudocode ...

if ($thisIsTrue) {
    Load_the_component_and_make_it_ready_for_use;
    $this->set('facebookUser', $this->Connect->user());
}

Как мне это сделать?

Ответы [ 5 ]

5 голосов
/ 29 апреля 2012

Если вы делаете это в CakePHP 2.0, это действительно просто.Я нашел эту ТАКУЮ ветку, которая меня изначально обескураживала, но это должна быть проблема 1.3 и ниже.Например:

public function beforeFilter(){
    parent::beforeFilter();
    $this->Paypal = $this->Components->load('Paypal');
}

И это все, что она написала.

4 голосов
/ 03 августа 2010

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

Как прокомментировала Мэгги, вы можете загрузить компонент (http://book.cakephp.org/view/939/Loading-Components), но тогда вам нужно будет вызвать автозагрузку и инициализировать себя и присоединить объект к вашему контроллеру.

В целом, может быть проще сделать условный $ this-> set ... и позволить компоненту загружаться каждый раз.

3 голосов
/ 03 августа 2010

Если здесь что-то отсутствует, вы используете App :: import для импорта компонента.

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

if( $condition ) {
 App::import( 'Component', 'MyComponent' );
 $this->MyComponent = new MyComponent();
 $this->MyComponent->method();
}

HTH, Travis

2 голосов
/ 14 февраля 2011

Я знаю, что уже поздно, но для всех, кто ищет, как это сделать, вам нужно добавить его в свой __construct, прежде чем вызывать __construct Родителя.

Так что вы должны сделать что-то вроде этого:

function __construct(){
  if($thisIsTrue){
    $this->components[] = 'Facebook.Connect'
  }
  parent::__construct();
}

Вы можете сделать это либо на своих отдельных контроллерах, либо в app_controller, чтобы каждый контроллер его брал.

Единственная проблема, с которой я столкнулся, заключалась в том, что он вызывался так рано, что его труднополучить переменные для оператора if ().В моем примере я хотел, чтобы компонент был только в том случае, если я был на странице администратора, и вместо возможности проверить $ this-> params мне пришлось проверять URL-адрес из $ _SERVER.

Я нашел это решение здесь,но он сказал, что вы должны были сделать это в app_controller, а это не так: Условная загрузка компонентов в CakePHP

0 голосов
/ 09 марта 2015

попробуйте это в вашем контроллере

var $components = array("Email", "Session", 'RequestHandler', 'Cookie');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...