Flaker
@Flaker

(Yii2) Как лучше организовать взаимодействие виджета для вывода аватары с менеджером аватар?

В продолжение вопроса: (Yii2) Какой лучший способ работы с аватарами пользователей?

Пытаюсь решить как сделать оптимальную структуру для работы с аватаром и вывода его с помощью виджета.

  • Avatar Widget должен выводить блок с аватаром указаного пользователя.
  • Параметры и методы для работы с аватарами хранятся в Avatar Manager.
  • На странице может выводится неограниченое кол-во аватаров и Avatar::Widget() в цикле будет неоптимально по времени, так как каждый раз объект пересоздается.
  • Avatar Widget берет URL картинки из Avatar Manager.


Сделал вот такой вариант:

Есть AvatarManager конструктор которого принимает User Model или просто user_idconfig)
Code Avatar Manager

public $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 Widget

public $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)


Правильный ли подход я выбрал?
Как сделать лучше/правильно?
  • Вопрос задан
  • 3392 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы