Yii2. Выводим «Hello, world!»
23.02.2019
Теги: PHP • Web-разработка • Yii2 • Теория • Фреймворк
Одна из ключевых особенностей фреймворка — поддержка паттерна MVC. Это позволяет создавать более структурированный код, который проще понимать и упрощает многие вещи. Также это способствует поддержке и повторному использованию кода.
Архитектура приложения Yii2
В приложении Yii2 все запросы направляется на один файл /web/index.php
. Этот файл загружает Yii2, зависимости, а затем запускает приложение:
<?php // comment out the following two lines when deployed to production defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); $config = require(__DIR__ . '/../config/web.php'); (new yii\web\Application($config))->run();
По умолчанию вызывается метод actionIndex()
класса SiteController
:
<?php namespace app\controllers; use Yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\filters\VerbFilter; use app\models\LoginForm; use app\models\ContactForm; class SiteController extends Controller { public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'only' => ['logout'], 'rules' => [ [ 'actions' => ['logout'], 'allow' => true, 'roles' => ['@'], ], ], ], 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'logout' => ['post'], ], ], ]; } public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], 'captcha' => [ 'class' => 'yii\captcha\CaptchaAction', 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, ], ]; } public function actionIndex() { return $this->render('index'); } public function actionLogin() { if (!\Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } return $this->render('login', [ 'model' => $model, ]); } public function actionLogout() { Yii::$app->user->logout(); return $this->goHome(); } public function actionContact() { $model = new ContactForm(); if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) { Yii::$app->session->setFlash('contactFormSubmitted'); return $this->refresh(); } return $this->render('contact', [ 'model' => $model, ]); } public function actionAbout() { return $this->render('about'); } }
По умолчанию запускается метод actionIndex()
контроллера SiteController
:
<?php /* * Файл /vendor/yiisoft/yii2/web/Application.php */ namespace yii\web; class Application extends \yii\base\Application { // по умолчанию будет запущен контроллер SiteController public $defaultRoute = 'site'; }
<?php /* * Файл /vendor/yiisoft/yii2/base/Controller.php */ namespace yii\base; class Controller extends Component implements ViewContextInterface { // по умолчанию будет запущен метод actionIndex() public $defaultAction = 'index'; }
Контроллер по умолчанию можно переопределить в настройках:
/* * Файл /config/web.php */ $config = [ /* ... */ 'defaultRoute' => 'main', /* ... */ ];
Чтобы изменить действие по умолчанию, переопределяем свойство $defaultAction
:
namespace app\controllers; use yii\web\Controller; class MainController extends Controller { // по умолчанию будет запущен метод actionHome() public $defaultAction = 'home'; public function actionHome() { return $this->render('home'); } }
Как правило, в контроллерах много методов, но с минимальным количеством кода. Контроллеры загружают модели и представления. Основная нагрузка лежит моделях, а представления лишь отображают шаблоны.
Файл main.php
— это шаблон страницы с шапкой, меню, сайдбаром и подвалом. Можно сказать, что это обертка для основного контента страницы:
<?php /* @var $this \yii\web\View */ /* @var $content string */ use yii\helpers\Html; use yii\bootstrap\Nav; use yii\bootstrap\NavBar; use yii\widgets\Breadcrumbs; use app\assets\AppAsset; AppAsset::register($this); ?> <?php $this->beginPage() ?> <!DOCTYPE html> <html lang="<?= Yii::$app->language ?>"> <head> <meta charset="<?= Yii::$app->charset ?>"> <meta name="viewport" content="width=device-width, initial-scale=1"> <?= Html::csrfMetaTags() ?> <title><?= Html::encode($this->title) ?></title> <?php $this->head() ?> </head> <body> <?php $this->beginBody() ?> <div class="wrap"> <?php NavBar::begin([ 'brandLabel' => 'My Company', 'brandUrl' => Yii::$app->homeUrl, 'options' => [ 'class' => 'navbar-inverse navbar-fixed-top', ], ]); echo Nav::widget([ 'options' => ['class' => 'navbar-nav navbar-right'], 'items' => [ ['label' => 'Home', 'url' => ['/site/index']], ['label' => 'About', 'url' => ['/site/about']], ['label' => 'Contact', 'url' => ['/site/contact']], Yii::$app->user->isGuest ? ( ['label' => 'Login', 'url' => ['/site/login']] ) : ( '<li>' . Html::beginForm(['/site/logout'], 'post') . Html::submitButton( 'Logout (' . Yii::$app->user->identity->username . ')', ['class' => 'btn btn-link'] ) . Html::endForm() . '</li>' ) ], ]); NavBar::end(); ?> <div class="container"> <?= Breadcrumbs::widget([ 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], ]) ?> <?= $content ?> </div> </div> <footer class="footer"> <div class="container"> <p class="pull-left">© My Company <?= date('Y') ?></p> <p class="pull-right"><?= Yii::powered() ?></p> </div> </footer> <?php $this->endBody() ?> </body> </html> <?php $this->endPage() ?>
Переменная $content
будет заменена кодом, сгенерированным в /views/site/index.php
, который представляет собой шаблон основного контента страницы:
<?php /* @var $this yii\web\View */ $this->title = 'My Yii Application'; ?> <div class="site-index"> <div class="jumbotron"> <h1>Congratulations!</h1> <p class="lead">You have successfully created your Yii-powered application.</p> <p><a class="btn btn-lg btn-success" href="http://www.yiiframework.com">Get started with Yii</a></p> </div> <div class="body-content"> <div class="row"> <div class="col-lg-4"> <h2>Heading</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p> <p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation »</a></p> </div> <div class="col-lg-4"> <h2>Heading</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p> <p><a class="btn btn-default" href="http://www.yiiframework.com/forum/">Yii Forum »</a></p> </div> <div class="col-lg-4"> <h2>Heading</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p> <p><a class="btn btn-default" href="http://www.yiiframework.com/extensions/">Yii Extensions »</a></p> </div> </div> </div> </div>
Создаем страницу «Hello, world!»
Добавляем в файл /controllers/SiteController.php
метод actionHello()
:
class SiteController extends Controller { /* ... */ public function actionHello() { return $this->render('hello'); } }Создаем файл
/views/site/hello.php
:
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'Hello'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="site-hello"> <h1><?= Html::encode($this->title) ?></h1> <p> Это страница «Hello». Вы можете изменять эту страницу, редактируя файл шаблона: </p> <code><?= __FILE__ ?></code> </div>
Открываем страницу http://www.server.com/web/index.php?r=site/hello
в браузере и смотрим на результат:
Поиск: PHP • Web-разработка • Yii2 • Фреймворк • Framework • MVC • defaultRoute • defaultAction