Архитектура Lithium Framework — вызов одного контроллера из другого

Я работаю над веб-приложением, используя Lithium Framework с базой данных MongoDB.

На одной странице приложения - я хочу отображать данные из нескольких типов объектов. Я понимаю концепцию отношений (т. е. «принадлежит», «имеет много» и т. д.) между моделями. Но мои вопросы связаны с отношениями с контроллером.

Например, предположим, что у меня есть два объекта с именами «Люди» и «Компании». Я хочу показать конкретную информацию о компаниях в представлении «люди». Я сделал следующее:

1) В модели «Люди» я добавил следующую строку:

public $belongsTo = array('Companies');

2) В файл «PeopleController» я также включил ссылку на модель компаний, например:

use app\models\Companies;

Теперь внутри PeopleController я хочу вызвать метод в файле CompaniesController.

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

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

Заранее спасибо за помощь!


person NinoCodes    schedule 10.03.2013    source источник
comment
Как говорит @Chris, я предлагаю вам переосмыслить свою архитектуру. Рассмотрите возможность переноса функциональности из CompaniesController в модель Companies. Если вам нужен более конкретный совет, что делает метод контроллера?   -  person michaeltwofish    schedule 11.03.2013


Ответы (2)


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

Итак, если у вас есть URL-адрес «/people/bob» и вы хотите получить данные компании для Боба, просто добавьте это в метод представления вашего контроллера People. Что-то типа

People::first(array('conditions' => array('name' => 'Bob'), 'with' => 'Companies'));
person Chris    schedule 11.03.2013

Вы можете создать экземпляр CompaniesController (возможно, передав $this->request в параметр 'request' в процессе), а затем вызвать в нем метод. Однако лучший способ организовать его — переместить общие функции из CompaniesController в Companies и вызывать их из обоих мест.

use app\models\Companies на самом деле не является "ссылкой". Это просто указывает, что Companies на самом деле означает app\models\Companies. Я думаю, что «псевдоним» - лучший способ думать об этом. См. http://php.net/manual/en/language.namespaces.importing.php.

Пример:

// in app/models/Companies.php
namespace app\models;

class Companies extends \lithium\data\Model {
    public static function doSomething() {
      // do something related to companies.
    }
}

// in app/controllers/CompaniesController.php
namespace app\controllers;

use app\models\Companies;

class CompaniesController extends \lithium\action\Controller {
    public function index() {
        $result = Companies::doSomething();
        return array('some' => 'data', 'for' => 'the view');
    }
}

// in app/controllers/PeopleController.php
namespace app\controllers;

use app\models\Companies;

class PeopleController extends \lithium\action\Controller {
    public function index() {
        $result = Companies::doSomething();
        return array('some' => 'data', 'for' => 'the view');
    }
}
person rmarscher    schedule 11.03.2013