Yii2でHelloWorldしてみた

投稿日:

ちょっとした興味でYii2で Hello World してみたメモです。

Yiiとは

Yii – Wikipedia によると、

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

とのことです。
Yii2はYiiの最新バージョンを指します。

The Definitive Guide to Yii 2.0 を見て何も考えずにいってみます。Yes It Is!

インストール

Installing Yii – Getting Started – The Definitive Guide to Yii 2.0 を元にインストールしてみます。
こちら の通りアーカイブファイルをダウンロードすることも出来ますがComposerを使いましょう

Composer

以下コマンドでインストールです。
例だとプロジェクト名をbasicという名前にしていますが、今回はhello-yii2という名前を付けます。

$ composer create-project --prefer-dist yiisoft/yii2-app-basic hello-yii2

一緒に依存モジュールもめっちゃインストールされます。

確認

hello-yii2 の中がこんな感じになっていればいいかと思います。

hello-yii2/
    assets/
    codeception.yml
    commands/
    composer.json
    config/
    composer.lock
    controllers/
    LICENSE.md
    mail/
    models/
    README.md
    requirements.php
    runtime/
    tests/
    vendor/
    views/
    web/
    widgets/
    yii*
    yii.bat

ビルトインサーバで起動

起動してみます。hello-yii2/ の中で以下コマンドを打ちます。

$ php yii serve

こんなふうに言われると思います。

Server started on http://localhost:8080/
Document root is "\your\path\to\hello-yii2\web"
Quit the server with CTRL-C or COMMAND-C.

http://localhost:8080/ にアクセスしてみましょう。

この画面が出たら起動成功です。

portを変えたい場合

デフォルトでportは8080となっていますが以下のように --port=xxxx でport番号を指定することができます。

$ php yii serve --port=8888

こうした場合、http://localhost:8888/ でアクセス可能です。

Apache

とりあえずサクッと試すにはビルトインサーバでいいと思いますが、アパッチの設定もしてみます。httpd.confでもバーチャルホスト用のconfファイルでもいいので以下の設定を入れてみます。
※MAMPとかXAMPPとか

バーチャルホストの場合

<VirtualHost *:80>
  DocumentRoot "/your/path/to/hello-yii2/web"
  ServerName hello-yii2.net
  <Directory "/your/path/to/hello-yii2/web">
    # use mod_rewrite for pretty URL support
    RewriteEngine on
    # If a directory or a file exists, use the request directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # Otherwise forward the request to index.php
    RewriteRule . index.php

    # if $showScriptName is false in UrlManager, do not allow accessing URLs with script name
    RewriteRule ^index.php/ - [L,R=404]

    # ...other settings...
  </Directory>
</VirtualHost>

hosts

hostsファイルには以下を書いておきます。

127.0.0.1 hello-yii2.net

確認

http://hello-yii2.net にアクセスすると先程と一緒の画面(Congratulations!)になることが確認できると思います。
こんな感じでアパッチの設定をするとドキュメントルートに存在しないファイルにアクセスされた場合、http://hello-yii2.net/index.php に処理が集約されます。
※つまり、http://hello-yii2.net/hoge.php にアクセスしても Congratulations! の画面が表示されます
※ビルトインサーバだと404画面が表示されます

とりあえずは、ビルトインサーバで立ち上げた状態(http://localhost:8080/)で続きをやっていきます。

HelloWorld

ここまできたらHelloWorldしてみます。
Saying Hello – Getting Started – The Definitive Guide to Yii 2.0 を参考にします。

Controllerの修正

hello-yii2\controllers\SiteController.php を修正します。

  • hello-yii2\controllers\SiteController.php
<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\web\Response;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;

class SiteController extends Controller
{
    // ~ 略 ~ 
    
    /**
     * action say
     * @param string $message
     * @return string
     */
    public function actionSay($message = 'Hello')
    {
        return $this->render('say', ['message' => $message]);
    }
}

Viewの作成

hello-yii2\views\site 以下に say.php を作成します。

  • hello-yii2\views\site\say.php
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>

確認

http://localhost:8080/index.php?r=site%2Fsay&message=Hello+World にアクセスしてみます。
※%2F は / です

こんな画面が表示されたと思います。

なぜこれで表示されたし

なぜこれでHelloWorldが表示されたのでしょうか。自分にはさっぱりわかりませんでしたのでちょっとドキュメントを見てわかったことを書きます。

r=xxx/xxx は ルート

r=xxx/xxx はルートのことを指し、以下の書式で表されるそうです。

ControllerID/ActionID

ControllerID

ControllerIDは要はコントローラ名です。
ControllerID(先頭大文字になる) + Controller として解決されるようです。
今回、r=site%2Fsay とアクセスしたのでControllerIDsiteになります。
これが解決されてSiteControllerがコントローラ名になります。

ActionID

ActionIDはアクション名(関数)になるそうです。
action + ActionID(先頭大文字になる) として解決されるようです。
今回、r=site%2Fsay でアクセスしたのでActionIDsayになります。
これが解決されてactionSay()がアクション名(関数)になります。

というルールに則ったわけで、r=site%2Fsay にアクセスした結果
SiteController::actionSay()
が呼ばれたわけで。

そして、このメソッドの中で$this->render()を呼んでいますが、これは第1引数にview名(viewのパス)、第2引数にパラメータを渡せるので素直にそのままの意味だと思います。
付け加えるなら、view名(viewのパス)は多分 hello-yii2\views\ControllerID\ 下のviewファイルを探すのだと思います。
※なので、hello-yii2\views\site\say.php を作った

あと、レイアウトもhello-yii2\views\layouts\main.phpが適用されていますが、これはベースとなるControllerクラスのプロパティpublic $layout = 'xxx';の値がデフォルトでmainになっているから。とのことです。

こんなわけで HelloWorld が表示されたというわけですね。

ID名のルール

ControllerID/ActionID 名ですが以下のルールがあるようです。

xxxID からダッシュを削除し、各単語の最初の文字を大文字にし、結果として出来る文字列

なので、SiteControllerに以下のアクションを増やしておくと

/**
 * action saysaysay
 * @param string $message
 * @return string
 */
public function actionSaySaySay($message = 'Hello')
{
    return $this->render('say', ['message' => $message]);
}

http://localhost:8080/index.php?r=site%2Fsay-say-say&message=Hello+World でアクセスしてもよいということになります。

URLの正規化

上記でHelloWorld出来ましたが、Getパラメータでやるのはどうも気が引けます。URLをかっこよくしたいです。
どうすればいいのでしょうか。
Routing and URL Creation – Handling Requests – The Definitive Guide to Yii 2.0 を参考にやっていきます。

hello-yii2\config\web.php の修正

ドキュメントを読んでみると上記設定ファイルのcomponents.urlManagerの値をゴニョゴニョしなさいと書いてあります。

[
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => false,
            'rules' => [
                // ...
            ],
        ],
    ],
]

上記がよく使われる構成だというのでこの通りにします。
各プロパティが持つ意味は以下の通りとのことです。
※いまいちよく分かっていません

  • enablePrettyUrl
    • きれいなURLにするかどうか
  • showScriptName
    • 生成される URL にエントリスクリプトを含めるかどうか
    • false にすると、/index.php/post/100 という URL を生成する代りに、/post/100 という URL を生成する
  • enableStrictParsing
    • 厳密なリクエスト解析を有効にするかどうか
    • true にすると以下に書くrules の設定にマッチするURLでないとyii\web\NotFoundHttpException が投げられる
    • false だとURL のパス情報の部分がリクエストされたルートとして扱われる
  • rules
    • URLを解析および生成するための一連の規則を書く

urlManager.rules の設定

なんとなくわかったようなわからないような感じですが、とりあえず
http://localhost:8080/index.php?r=site%2Fsay&message=Hello+World

http://localhost:8080/site/say/{message}
※messageが空の場合、Helloが渡るように
でアクセス出来るようにしてみます。

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'enableStrictParsing' => false,
    'rules' => [
        [
            'pattern' => 'site/say/<message>',
            'route' => 'site/say',
            'defaults' => ['message' => 'Hello'],
        ],
    ],
],

こちら を参考に書いてみました。

簡単に説明すると、

  • pattern
    • URLのパターン
    • <xxx> で名前付きパラメータ ※正規表現で縛ることも可能
  • route
    • ルート
    • 上記に書いた r=xxx/xxx(ControllerID/ActionID) と一緒
  • defaults
    • 名前付きパラメータのデフォルト値

となります。

http://localhost:8080/site/say でアクセスすると画面には
Hello
と表示されて、
http://localhost:8080/site/say/Hello+World!! でアクセスすると画面には
Hello World!!
と表示されるかと思います。

アパッチの設定(confファイルの修正)

ビルトインサーバではなくアパッチで動かしていて、上記の通りcomponents.urlManagerの値をゴニョゴニョした場合アパッチのconfファイルから以下の記述を削除してアパッチの再読込をする必要があります。

# if $showScriptName is false in UrlManager, do not allow accessing URLs with script name
RewriteRule ^index.php/ - [L,R=404]

上記を施してから、http://hello-yii2.net/site/say/ にアクセスすると期待する結果になると思います。

終わりに

というわけで、Yii2でHelloWorldしてみました。
※かなり駆け足で書いてみたので説明が間違っている箇所があるかもしれません

自分の感想としては正直慣れるまで時間がかかるかなというイメージを持ちました。直感的じゃないというかなんというか(HelloWorldくらいで何言ってんだ)。
まぁ、こういったものは使っていけば慣れていくので使っていけばなんとかなるのではないでしょうか。使っていけば。

2017/12/18 追記

上記の流れを簡単に書いておきました。
https://github.com/shimabox/hello-yii2

投稿日:
カテゴリー: PHP タグ:

作成者: shimabox

Web系のプログラマをやっています。 なるべく楽しく生きていきたい。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください