環境構築からWEBアプリ開発・スマホアプリ開発まで。ときには動画制作やゲームも。

supilog
すぴろぐ

HelloWorldとechoしてもPHPと友達になれなかったから、フレームワークでやってみるMVC(6)Yii

このシリーズは果たしてどこを目指しているのか、自分でも分からなくなってきましたが(ぇ

趣味の領域に入ってきております。ラノベっぽくしちゃった記事のタイトルが徐々に恥ずかしくなってきている今日この頃。

Yii

詳しくないので引用。

Yii は、オープンソースで作成されたオブジェクト指向のコンポーネントベースなMVCのPHPで書かれたWebアプリケーションフレームワークである。Yiiの発音は[ji:]”イー”で、名称は「簡単:Easy)」 ・「効率的:(Efficient)」 ・「高拡張性:Extensible)」を表しているとしている。また、Yiiのスペルは「Yes It Is!(はい、それです!)」の頭文字より名付けられた。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

日本では利用実績が少ないものの、ロシアでよく利用されていたようだ。ロシアで仕事をするときのために試すんだと言い聞かせて、試してみることにする。

プロジェクト作成

https://www.yiiframework.com/doc/guide/2.0/ja/start-installation

composer create-project --prefer-dist yiisoft/yii2-app-basic supilog

今回インストールされたバージョンは「2.0.41」のようだ。(※ supilogの部分は各自プロジェクト名を入れてください)

起動してみる

まだ何も修正を加えていないが、まずは一度起動してみる。

無事に表示された。Contactリンクだけはエラーが出ていたが、キャプチャ実装のためにphp-gdかphp-imagickが必要のようだ。今回はキャプチャ実装などはしないので、一旦そのまますすめる。

初期プロジェクトとしては、なかなかリッチで、「トップ画面」「第1カテゴリページ」「コンタクト」「ログイン」が内装された形。構成を学ぶのも現物から理解できそうなので良い。

Yii Application Requirement Checker

必要なextensionなどが揃っているか確かめてくれるチェッカーが入っているので、プロジェクトディレクトリに移動して、以下のphpを実行すれば良い。

php requirements.php


【結果】
... 省略 ...

------------------------------------------
Errors: 0   Warnings: 7   Total checks: 23

Warningが7件出ていたが、今回は必要なさそうだということで、無視する。アプリ構築する際には、1件ずつ確認するのが良いだろう。

controllers/HelloController.php

<?php

namespace app\controllers;

use yii\web\Controller;

class HelloController extends Controller
{
    /**
     * Displays index page.
     *
     * @return string
     */
    public function actionIndex()
    {
        return $this->render('index');
    }
}

views/hello/index.php

<?php
$this->title = 'Yeah - My Yii Application';
?>
<div class="site-index">
    <div class="body-content">
        <h1>Hello World</h1>
    </div>
</div>

確認

2ファイルを配置すると、下記URLでのアクセスが可能となる。

http://localhost:8080/index.php?r=hello%2Findex

残る課題は、

  • ルーティングをなんとかしたい
  • コントローラから定数を渡したい
  • レイアウトをコントロールしたい(今回はデフォルトレイアウトが外せればOK)

ルーティング

config/web.phpの「components」に「urlManager」設定を記述します。以下をご参考に。

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        ...
    ],
    'components' => [
        ...
        'urlManager' => [
            'enablePrettyUrl' => true,
        ],

ここまで実行すると、下記URLでアクセス可能になった。

http://localhost:8080/hello/index
※最後のindexは省略しても同じ。

どうせなら、/でアクセスしてみたいので、config/web.phpをさらに修正して、defaultRoute設定を追加。

$config = [
    ...
    'defaultRoute' => 'hello/index',
    'components' => [
        ...
        'urlManager' => [
            'enablePrettyUrl' => true,
        ],

ここまで実行すると、下記URLでアクセス可能になった。

http://localhost:8080/

レイアウト

デフォルトでは、views/layouts/main.phpがレイアウトとして適用されているので、これを変更してみる。

class HelloController extends Controller
{
    public $layout = 'hello';
    
    ...    
}

views/layouts/hello.php 

<?php

use app\widgets\Alert;
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 http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <?php $this->registerCsrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div>
    <div class="container">
        <?= $content ?>
    </div>
</div>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

デフォルトのレイアウトmain.phpを修正して、一番シンプルな形のレイアウトを用意。コントローラでレイアウト名を指定してあげると、そのレイアウトを適用させることが出来た。

変数を渡そう

最後にコントローラから変数を渡してみる。

controllers/HelloController.php

    public function actionIndex()
    {
        $data = [
            'title' => 'Hello World!! - Yii PHP Framework',
            'message' => 'Yii2.0.41は、2021/03/03にリリースされたばかり。Yii3がまもなく正式リリース?'
        ];
        return $this->render('index', $data);
    }

views/hello/index.php

<?php
$this->title = 'Yeah - My Yii Application';
?>
<div class="site-index">
    <div class="body-content">
        <h1><?= $title ?></h1>
        <div><?= $message ?></div>
    </div>
</div>

これで無事に表示することが出来た。

さいごに

Yii 2の公式ドキュメントは、初心者の方にはやや難しめ。というのは、どのファイルをどのように修正すれば良いのかが、ぱっと見て分かりにくい記述になっている。

Yii 3が開発中のようで、2021は動向にも注目だ。ロシアで仕事する方はぜひ!

https://www.yiiframework.com/status/3.0

それでは。