Controller в common (advanced template)
-
- Сообщения: 143
- Зарегистрирован: 2014.08.13, 15:08
Controller в common (advanced template)
Насколько приемлемо сделать общий контроллер?
Есть необходимость обращаться к Vk API для получения списка стран/городов для сайта.
Это будет использоваться и во фронтенде и в бэкэнде для автокомплита на формах.
Так возможно ли сделать общий контроллер или может есть более правильный путь? Просто совсем не хочется задваивать код...
И еще вопрос. Методы контроллера для работы с API я планировал использовать внутри модуля. По идее модуль это полностью изолированная единица и в ней не должно быть обращения к компонентам и уж тем более контроллерам снаружи. НО как быть? Ведь мне очень нужно внутри модуля получить эти данные. А запихивать в модуль то, что и так есть во всем проекте тоже не хочется.
И правильно ли я понимаю, что код обращающийся к стороннему API не должен быть в моделях, только в контроллере?
Есть необходимость обращаться к Vk API для получения списка стран/городов для сайта.
Это будет использоваться и во фронтенде и в бэкэнде для автокомплита на формах.
Так возможно ли сделать общий контроллер или может есть более правильный путь? Просто совсем не хочется задваивать код...
И еще вопрос. Методы контроллера для работы с API я планировал использовать внутри модуля. По идее модуль это полностью изолированная единица и в ней не должно быть обращения к компонентам и уж тем более контроллерам снаружи. НО как быть? Ведь мне очень нужно внутри модуля получить эти данные. А запихивать в модуль то, что и так есть во всем проекте тоже не хочется.
И правильно ли я понимаю, что код обращающийся к стороннему API не должен быть в моделях, только в контроллере?
-
- Сообщения: 143
- Зарегистрирован: 2014.08.13, 15:08
Re: Controller в common (advanced template)
Код: Выделить всё
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;
}
}
Re: Controller в common (advanced template)
Можно сделать классы Action-ов и подключать их к контроллерам там и там.Nicolai6120 писал(а): ↑2017.03.23, 11:15 Так возможно ли сделать общий контроллер или может есть более правильный путь? Просто совсем не хочется задваивать код...
Код, обращающийся к стороннему API, должен быть в объекте для работы со сторонним API.Nicolai6120 писал(а): ↑2017.03.23, 11:15 И правильно ли я понимаю, что код обращающийся к стороннему API не должен быть в моделях, только в контроллере?
-
- Сообщения: 143
- Зарегистрирован: 2014.08.13, 15:08
Re: Controller в common (advanced template)
Мой вариант, который выше, он ведь по факту в другом объекте, просто вызов в контроллере, значит там все правильно? Иначе как я ajax`ом буду обращаться к объекту? Можно ведь только к контроллеру...
И самое важное....Ответьте пожалуйста насчет модуля. Критически важный вопрос. Можно ли в модуле расширять классы из основного приложения и задействовать его компоненты? У меня в админке модуль "user" и ему вот необходимо использовать возможности установленного в приложении authclient расширения.
И опять же, гляньте на мой пример. Там 2-3 однотипных экшена. Разве стоит для них standalone экшены создавать?Можно сделать классы Action-ов и подключать их к контроллерам там и там.
И самое важное....Ответьте пожалуйста насчет модуля. Критически важный вопрос. Можно ли в модуле расширять классы из основного приложения и задействовать его компоненты? У меня в админке модуль "user" и ему вот необходимо использовать возможности установленного в приложении authclient расширения.
Re: Controller в common (advanced template)
Ну если несколько, то можно и контроллер:
Код: Выделить всё
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 раз.
-
- Сообщения: 143
- Зарегистрирован: 2014.08.13, 15:08
Re: Controller в common (advanced template)
Насчет инъекции в конструктор контроллера понял. Насчет выделения объекта Geo, тоже. Спасибо!
Я кстати не задумывался, что контроллер тоже может быть подвергнут инъекции и это при том упростит его существенно. Еще раз спасибо.
Единственный вопрос который меня сильно мучает теперь, это модуль. В документации сказано, что это полностью самодостаточная единица. Что его можно просто взять и перенести в другой проект. Это исключает возможность связывания модуля с окружением за его пределами.
Но мне совсем не ясно, как тогда из этого модуля обратиться к тому же объекту Geo? Ведь он будет за его пределами потому, что будет использоваться в других частях приложения.
Я кстати не задумывался, что контроллер тоже может быть подвергнут инъекции и это при том упростит его существенно. Еще раз спасибо.
Единственный вопрос который меня сильно мучает теперь, это модуль. В документации сказано, что это полностью самодостаточная единица. Что его можно просто взять и перенести в другой проект. Это исключает возможность связывания модуля с окружением за его пределами.
Но мне совсем не ясно, как тогда из этого модуля обратиться к тому же объекту Geo? Ведь он будет за его пределами потому, что будет использоваться в других частях приложения.
Re: Controller в common (advanced template)
Если очень хотите заморочиться с независимостью, то в модуле сделайте и иньектите GeoInterface, а в сommon его реализуйте.Nicolai6120 писал(а): ↑2017.03.23, 17:26 Но мне совсем не ясно, как тогда из этого модуля обратиться к тому же объекту Geo? Ведь он будет за его пределами потому, что будет использоваться в других частях приложения.
Re: Controller в common (advanced template)
Пусть использует.Nicolai6120 писал(а): ↑2017.03.23, 16:54 У меня в админке модуль "user" и ему вот необходимо использовать возможности установленного в приложении authclient расширения.
-
- Сообщения: 143
- Зарегистрирован: 2014.08.13, 15:08
Re: Controller в common (advanced template)
Все понятно, спасибо. Значит правило про модули не жесткое.
Re: Controller в common (advanced template)
Если будете выкладывать модуль на GitHub, то жёсткое. Если только для своего проекта, то нет.Nicolai6120 писал(а): ↑2017.03.24, 14:19 Все понятно, спасибо. Значит правило про модули не жесткое.