2014-11-02 4 views
0

Я работаю над проектом CakePHP, и я понял, что многие из моих контроллеров имеют почти такой же код. Я решил, что я должен попытаться сделать свой род «BaseController» и имеющим другие контроллеры расширения, что ... что-то вроде этого:Расширительный контроллер для общих функций

class BaseController extends AppController { 

    public $components = array(
     'RequestHandler' 
    ); 

    public function get($param = "all", $value = "") { 
     $this->layout = 'ajax'; 
     if($param == "all") { 
      $data = $this->Base->find('all'); 
     } elseif ($param == "id") { 
      $data = $this->Base->findById($value); 
     } else { 
      ... 
     } 
    } 

    ... 
} 

Но в этот момент я заблудился. Я делаю не хочу иметь базовую таблицу базы данных и модель ... Я просто хочу что-то, чтобы не нужно было писать примерно такой же метод get() десятка раз ... и позволяет сказать, что я делаю контроллер «FooController ", который расширяет этот контроллер ... как мне сделать так, чтобы get() теперь взаимодействует с моделью/таблицей Foo?

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

+1

Используйте компонент –

+0

Hi @ mcgowan.b, я смотрю в [документации] (http://book.cakephp.org/2.0/en/controllers/components.html) для компонентов. Я не вижу способ, которым я могу работать с базой данных для разных моделей, я что-то упускаю? – smerny

+0

В руководстве говорится: «Компоненты представляют собой пакеты логики, которые разделяются между контроллерами», и это то, что вы хотите достичь, общую функциональность, доступную для всех контроллеров. [manual] (http://book.cakephp.org/2.0/en/controllers/components.html) –

ответ

0

Предполагая, что вы хотите заменить Base с моделью Foo, я личный бы передать имя модели в качестве аргумента:

public function get($param = 'all', $value = '', $model = 'Foo') 
{ 
    $this->layout = 'ajax'; 

    if($param == 'all') { 
     $data = $this->{$model}->find('all'); 
    } elseif ($param == 'id') { 
     $data = $this->{$model}->findById($value); 
    } 
} 

не достаточно знакомы с тортом, чтобы дать лучшее решение, возможно, не помешает сделайте некоторую проверку существования модели до вызова find.

Если это из-за методологии CakePHP, извините меня.

+0

Пока я вижу, как это может сработать, похоже, мне все же потребовалось бы, чтобы все эти функции были в контроллере 'Foo' (и другие контроллеры), которые просто называют связанную функцию выше. – smerny

+0

Я вижу, так что сначала вам понадобится расширяемая модель. Думаю, когда я увидел «Base», я понял, что модель Foo уже расширяет эту модель, которая обеспечивает функции findBy –

Смежные вопросы