В продолжение вопроса: (Yii2) Какой лучший способ работы с аватарами пользователей?
Пытаюсь решить как сделать оптимальную структуру для работы с аватаром и вывода его с помощью виджета.
- Avatar Widget должен выводить блок с аватаром указаного пользователя.
- Параметры и методы для работы с аватарами хранятся в Avatar Manager.
- На странице может выводится неограниченое кол-во аватаров и Avatar::Widget() в цикле будет неоптимально по времени, так как каждый раз объект пересоздается.
- Avatar Widget берет URL картинки из Avatar Manager.
Сделал вот такой вариант:
Есть
AvatarManager конструктор которого принимает
User Model или просто
user_id (в
config)
Code Avatar Managerpublic $user_id;
public function __construct(User $UserModel = null, $config = [])
{
parent::__construct($config);
$this->_UserModel = $UserModel;
}
public function getAvatarUrl()
{
// Возвращает URL картинки
}
Если в
$config нет
user_id, то он заполняется из модели.
В
Avatar Widget $user_id тоже берется из
$config или текущего пользователя, а также создается объект
Avatar Manager.
Метод
content возвращает сгенерированый
HTML код. А метод
run его выводит.
Code Avatar Widgetpublic $user_id;
private $_AvatarManager;
public function init()
{
parent::init();
$this->user_id = isset($this->user_id) ? $this->user_id : Yii::$app->user->identity->getId();
$this->_AvatarManager = new AvatarManager(null, ['user_id' => $this->user_id]);
}
public function run($user_id = null)
{
echo $this->content($user_id);
}
public function content($user_id = null)
{
if (isset($user_id))
$this->_AvatarManager->user_id = $user_id;
$img_url = $this->_AvatarManager->getAvatarUrl();
$content = // Генерация контента
return $content;
}
Теперь для вывода большого кол-ва аватаров во View создаю объект
AvatarManager и вызываю метод
run() где требуется:
$avatar = new AvatarManager();
$avatar->run(1)
$avatar->run(2)
$avatar->run(3)
...
$avatar->run(10000)
Правильный ли подход я выбрал?
Как сделать лучше/правильно?