2013-08-20 3 views
1

, поэтому у меня есть пользовательский контроллер, который имеет методы для обновления профиля и т. Д. В системе, которую я разрабатываю, пользователю нужно будет публиковать статьи и т. Д. Итак, я я запутался с дизайном системы. Основная логика создания статей будет размещаться в статье article_model. Но как я могу назвать методы?Метод в одном контроллере, вызывающем метод в другом контроллере, используя MVC

  • Я могу создать функцию в пользовательском контроллере, которая вызывает модель статьи для создания статьи?
  • Я могу вызвать метод в пользовательском контроллере и создать контроллер товара, а пользовательский контроллер вызывает метод на контроллере статьи, который по очереди вызывает модель для основной логики.
  • Или просто вызовите контроллер товаров, который подключается к модели модели.

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

+0

Контроллеры обычно не должны вызывать другие контроллеры; контроллеры должны просто реагировать на разные ситуации ввода и направлять модель на то, чтобы что-то делать. Контроллеры * управляют * моделью, а не друг с другом. Это может быть несколько специфично для платформы и среды, в которой вы работаете; что это? – deceze

ответ

1

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

class ProfileController extends BaseController { 

    public function __construct() 
    { 
     $this->load->model('article_model'); 
    } 
    public function index(){ 
     $this->article_model->post(); 
    } 

} 
+0

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

+0

Просто загрузите свои модели из вашего метода __constructor, поэтому вам не придется загружать его снова и снова. Или лучшим решением является создание автозагрузчика, который будет загружать ваши модели по всему миру. Эти ссылки могут помочь вам http://gonzalo123.com/2012/09/03/dependency-injection-containers-with-php-when-pimple-is-not-enough/ и http: //www.potstuck.ru/2010/09/09/php-dependency-a-php-dependency-injection-framework/ –

+0

Или используйте пакет https://github.com/php-fig/fig-standards/blob/master/accepted/PSR- 0.md –

2

Вы можете загрузить несколько моделей в контроллер, вы не просто ограничиваете модель в том же домене, что и контроллер. Поэтому, если вам нужно взаимодействовать со статьями в контроллере пользователей, просто загрузите модель статей. Как говорится в deceze, вы не должны вызывать другие контроллеры в одном контроллере; что определенно идет против соглашений MVC.

В вашем случае любое взаимодействие со статьей должно быть в контроллере статей, хотя доступно по URL-адресу, например /articles/add.

0

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

если вы должны вызвать контроллер от другого, вы можете посмотреть на CodeIgniter hmvc HMVC: an Introduction and Application

0

Постарайтесь использовать это расширение HMVC для CI. Это позволяет вызывать методы контроллера в других контроллерах. Что-то вроде этого:

class Dashboard extends MX_Controller{ 
    public $autoload = array(); 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function index() 
    { 
     $params = 'some_params'; 
     $data['some_data'] = Modules::run('another_controller/method', $params); 
    } 
} 

Где another_controller - простой контроллер CI, какие расширения MX_Controller.

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