В виджетах лучше не получать данные вовсе, ни через модели, ни через прямое обращение к базе. Передавайте туда чистые данные как это например сделано с хлебными крошками или на крайняк какой-нибудь DataProvider так же скрывающий реальный источник данных.
Я бы переопределил класс yii\web\View, добавил бы ему поле news для хранения списка новостей и явно передавал бы его в виджет в шаблоне. Сами данные во View можно подгонять в контроллере или если эти данные нужны везде, можно в самом классе View.
Как-нибудь так:
<?php
class NewsProvider
{
public function getNews()
{
return News::find()->all();
}
}
class View extends yii\web\View
{
/**
* @var NewsProvider
*/
private $newsProvider;
/**
* @var array
*/
private $news;
public function __construct(NewsProvider $newsProvider, array $config = [])
{
$this->newsProvider = $newsProvider;
parent::__construct($config);
}
public function getNews()
{
if (!$this->news) {
$this->news = $this->newsProvider->getNews();
}
return $this->news;
}
}
echo NewsWidget::widget(['items' => $this->getNews()]);
Класс View нужно создавать собственный. В папку vendor изменения вносить ни при каких условиях нельзя, это не ваш код.
Например можно создать класс app\components\View и подключить его в конфиге (сделать так, что бы Yii использовал именно этот класс для компонента view)
// в файле config/web.php
'components' => [
'view' => 'app\components\web\View',
],