ちょっとした興味で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 とアクセスしたのでControllerIDはsiteになります。
これが解決されてSiteController
がコントローラ名になります。
ActionID
ActionIDはアクション名(関数)になるそうです。
action + ActionID(先頭大文字になる) として解決されるようです。
今回、r=site%2Fsay でアクセスしたのでActionIDはsayになります。
これが解決されて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