Controller в common (advanced template)

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Controller в common (advanced template)

Сообщение Nicolai6120 »

Насколько приемлемо сделать общий контроллер?

Есть необходимость обращаться к Vk API для получения списка стран/городов для сайта.
Это будет использоваться и во фронтенде и в бэкэнде для автокомплита на формах.

Так возможно ли сделать общий контроллер или может есть более правильный путь? Просто совсем не хочется задваивать код...

И еще вопрос. Методы контроллера для работы с API я планировал использовать внутри модуля. По идее модуль это полностью изолированная единица и в ней не должно быть обращения к компонентам и уж тем более контроллерам снаружи. НО как быть? Ведь мне очень нужно внутри модуля получить эти данные. А запихивать в модуль то, что и так есть во всем проекте тоже не хочется.

И правильно ли я понимаю, что код обращающийся к стороннему API не должен быть в моделях, только в контроллере?
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Re: Controller в common (advanced template)

Сообщение Nicolai6120 »

Код: Выделить всё

namespace common\controllers;

use \yii\authclient\clients\VKontakte;

class VkApiController extends \yii\web\Controller
{
    public $client;

    public function init()
    {
        $this->client = new VKontakte();
    }

    public function actionGetCountries()
    {
        $response = $this->client->api('database.getCountries', 'GET');

        return $response;
    }

    public function actionGetCities($countryId, $query, $needAll = 1, $count = 1000)
    {
        $response = $this->client->api('database.getCities', 'GET', [
            'country_id' => $countryId,
            'q' => $query,
            'need_all' => $needAll,
            'count' => $count
        ]);

        return $response;
    }
}
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Controller в common (advanced template)

Сообщение ElisDN »

Nicolai6120 писал(а): 2017.03.23, 11:15 Так возможно ли сделать общий контроллер или может есть более правильный путь? Просто совсем не хочется задваивать код...
Можно сделать классы Action-ов и подключать их к контроллерам там и там.
Nicolai6120 писал(а): 2017.03.23, 11:15 И правильно ли я понимаю, что код обращающийся к стороннему API не должен быть в моделях, только в контроллере?
Код, обращающийся к стороннему API, должен быть в объекте для работы со сторонним API.
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Re: Controller в common (advanced template)

Сообщение Nicolai6120 »

Мой вариант, который выше, он ведь по факту в другом объекте, просто вызов в контроллере, значит там все правильно? Иначе как я ajax`ом буду обращаться к объекту? Можно ведь только к контроллеру...
Можно сделать классы Action-ов и подключать их к контроллерам там и там.
И опять же, гляньте на мой пример. Там 2-3 однотипных экшена. Разве стоит для них standalone экшены создавать?

И самое важное....Ответьте пожалуйста насчет модуля. Критически важный вопрос. Можно ли в модуле расширять классы из основного приложения и задействовать его компоненты? У меня в админке модуль "user" и ему вот необходимо использовать возможности установленного в приложении authclient расширения.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Controller в common (advanced template)

Сообщение ElisDN »

Ну если несколько, то можно и контроллер:

Код: Выделить всё

class GeoController extends \yii\web\Controller
{
    private $geo;

    public function __construct($id, $module, Geo $geo, $config = [])
    {
        $this->geo = $geo;
        parent::__construct($id, $module, $config);
    }

    public function actionCountries()
    {
        return $this->geo->getCountries();
    }

    public function actionCities($countryId, $query, $count = 1000)
    {
        return $this->geo->getCities($countryId, $query, $count);
    }
}
Последний раз редактировалось ElisDN 2017.03.23, 18:36, всего редактировалось 1 раз.
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Re: Controller в common (advanced template)

Сообщение Nicolai6120 »

Насчет инъекции в конструктор контроллера понял. Насчет выделения объекта Geo, тоже. Спасибо!
Я кстати не задумывался, что контроллер тоже может быть подвергнут инъекции и это при том упростит его существенно. Еще раз спасибо.

Единственный вопрос который меня сильно мучает теперь, это модуль. В документации сказано, что это полностью самодостаточная единица. Что его можно просто взять и перенести в другой проект. Это исключает возможность связывания модуля с окружением за его пределами.

Но мне совсем не ясно, как тогда из этого модуля обратиться к тому же объекту Geo? Ведь он будет за его пределами потому, что будет использоваться в других частях приложения.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Controller в common (advanced template)

Сообщение ElisDN »

Nicolai6120 писал(а): 2017.03.23, 17:26 Но мне совсем не ясно, как тогда из этого модуля обратиться к тому же объекту Geo? Ведь он будет за его пределами потому, что будет использоваться в других частях приложения.
Если очень хотите заморочиться с независимостью, то в модуле сделайте и иньектите GeoInterface, а в сommon его реализуйте.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Controller в common (advanced template)

Сообщение ElisDN »

Nicolai6120 писал(а): 2017.03.23, 16:54 У меня в админке модуль "user" и ему вот необходимо использовать возможности установленного в приложении authclient расширения.
Пусть использует.
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Re: Controller в common (advanced template)

Сообщение Nicolai6120 »

Все понятно, спасибо. Значит правило про модули не жесткое.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Controller в common (advanced template)

Сообщение ElisDN »

Nicolai6120 писал(а): 2017.03.24, 14:19 Все понятно, спасибо. Значит правило про модули не жесткое.
Если будете выкладывать модуль на GitHub, то жёсткое. Если только для своего проекта, то нет.
Ответить