В моем контроллере cakephp я повторяю логику в каждой функции для просмотра кода - PullRequest
0 голосов
/ 31 января 2012

У меня есть несколько функций в логике моего контроллера, и для каждой из них у меня есть некоторая логика, которая извлекает данные для «избранного» набора единиц.Эти блоки находятся на нескольких страницах.Как мне сделать эту единую логику доступной для всех 4 представлений, которые в ней нуждаются?

Для справки, вот часть моей логики контроллера:

public function index() {
        $this->set('title', 'All accommodations available in and near Gulf Shores, AL');


$this->Unit->Behaviors->attach('Containable');
    $this->Unit->contain(
        array(
         'User'=>array(
            'id'),
         'Location',
         'Complex'=>array('location_id'),
         'Image'=>array(
            'logo','img1'
            )
          )
        );
    $c=$this->Unit->find('all', 
        array(

        'limit'=>3,
        'conditions'=>array(
            'active'=>1,
            'featured'=>1
        )
        )
    );
    $this->set('featured', $c);





$this->paginate['Unit']=array(
        'limit'=>9,
        'order' => 'RAND()',
        'contain'=>array(
                'User'=>array('email'),
                'Complex'=>array('location_id','complex_website'),
                'Location',
                'Image'
                ),
        'conditions'=>array(

                'Unit.active'=>1)   
    );
$data = $this->paginate('Unit');
$this->set('allaccommodations', $data);

    }
    public function houses() {

$this->set('title', 'Home rentals available in Gulf Shores');

$this->Unit->Behaviors->attach('Containable');
    $this->Unit->contain(
        array(
         'User'=>array(
            'id'),
         'Location',
         'Complex'=>array('location_id'),
         'Image'=>array(
            'logo','img1'
            )
          )
        );
    $c=$this->Unit->find('all', 
        array(

        'limit'=>3,
        'conditions'=>array(
            'active'=>1,
            'featured'=>1
        )
        )
    );
    $this->set('featured', $c);






$this->paginate['Unit']=array(
        'limit'=>9,
        'order' => 'RAND()',
        'contain'=>array(
                'User'=>array('email'),
                'Location',
                'Image'
                    ),
        'conditions'=>array(
                'Unit.type'=>array('house', 'rentalco'),
                'Unit.active'=>1)   
    );
$data = $this->paginate('Unit');
$this->set('allhouses', $data);



}
...

У меня естьдве другие функции, которые устанавливают переменную «Featured», которая доступна для представления.Я уверен, что есть гораздо лучший / более эффективный способ сделать это?

1 Ответ

1 голос
/ 31 января 2012

Да, идея состоит в том, чтобы все взаимодействия с данными в вашей модели были понятными и понятными для вашего контроллера.Жирные модели, узкие контроллеры.Есть пользовательские находки, которые вы можете использовать: http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#creating-custom-find-types

, но я предпочитаю просто сделать функцию модели, потому что с ними проще работать в IDE с дополнением кода и документацией.Таким образом, для избранной находки, которую вы продолжаете использовать, вы можете сделать что-то в своей модели юнитов, например:

public function getFeatured($limit) {
    $results = $this->find('all', array(
        'limit' => $limit,
        'conditions' => array(
            'active' => 1,
            'featured' => 1
            )
        )
    );

    return $results;
}

Затем в UnitController:

$this->set('featured', $this->Unit->getFeatured(3));
...