Люди, которые разбираются, смогут помочь за 2 секунды). Проблема детская, но я уже просидел 2 часа, но так и не понял ничего. Смотрите: я создал свой ВИД show.php, в нем я подключаю простой файл scripts.js используя метод registerJsFile, который, как вы знаете, принадлежит Class yii\web\View. То есть, в файле ВИДА я пишу Код (Text): <h1>Show Action</h1> <?php $this->registerJsFile('@web/js/scripts.js') ?> и файл подключается. Теперь вопрос, почему он подключается? Я ведь не указывал пространство имен ни в контроллере, ни в виде. И даже в AppAsset.php я ничего не указал.
Да я без понятия. Я вызываю метод класса, но при этом не указываю его пространства имен. Как yii2 понимает, что нужно запустить именно этот метод этого класса?
подожди, я что-то провмыкал. твой вид наследуется от класса View? ну тогда просто ищется метод в данном объете, если его там нет, то по цепочке вверх по родителями идёт поиск.
Ну вот, метод render внутри себя делает include show.php, по этому в show.php доступен $this который yii\web\View. Всё примерно так. Смотри код Yii2 и метод render в view. --- Добавлено --- https://github.com/yiisoft/yii2/blob/master/framework/base/View.php#L321
Он подключается, когда в layout вы вызываете <?php $this->head(); ?> и <?php $this->endBody() ?>, а также когда вьюха выводится через вызов renderAjax В Yii2 вывод так построен, что к моменту, когда выводится layout, все остальные вьюхи уже отработали, и соответственно, все вызовы registerJsFile произошли
хм.... действительно, я убрал <?php $this->head(); ?> и <?php $this->endBody() ?> после чего скрипт уже не подключился... Получается, что render здесь не при чем?
Почему непричём? А кто подключает, по вашему, layout? --- Добавлено --- Причём тут вообще пространства имён?
ну мы когда импортируем пространство имен , например так, use yii\helpers\Html;, можем пользоваться этим классом --- Добавлено --- Ок, я выяснил, что в ВИДЕ в строке Код (Text): <?php $this->registerJsFile('@web/js/scripts.js') ?> $this является объектом yii\web\View. тогда все ясно, мы вызываем метод этого объекта, передаем путь и все у нас подключается. Осталось, чтобы до меня дошло, как попал в Вид этот объект. Через render? через layout?
Какой объект? Если show.php работает в классе view метода render, а head и endBody методы как уже выше писали вызываются в том же экземпляре view класса в котором и show.php, только после show.php ещё если настроено происходит render layout в котором вызов head и endBody происходит
Очень просто всё. Вьюхи подрубаются (require или include) внутри одного из методов класса View, поэтому внутри и доступна переменная $this. Упрощённо это выглядит так: PHP: class View { /* ...... */ function render($fname, $params) { extract($params); include $fname; } } В реале всё, конечно, посложнее немного, но суть такая --- Добавлено --- А вообще, что, код Yii2 никак не почитать? --- Добавлено --- Вон и ссылку @denis01 дал, там как раз почти один в один код с моим, только ещё идёт буферизация вывода, чтоб потом можно было спокойно всё собирать в общий вывод