追記 2014-05-20
久しぶりにslimを使ったアプリを触る機会があっていろいろ調べてたら、本文のcomposer.jsonにあるslim/extrasはdeprecatedになっていた。
SmartyかTwigをテンプレートエンジンとして使うなら、代わりにslim/viewsを使うといいみたい。
今日、slim/viewsを使うところまでやってみたけども、記事をちゃんとまとめる時間がないので後日書いてアップしようと思う。
書いた → Slim ViewsでSmartyテンプレートを呼び出す - わすれっぽいきみえ
本編
vagrantを使ってslim frameworkというphpのマイクロフレームワークを使ってみた。 そのときにいろいろやったことを未来の自分は絶対忘れると思うので、今のうちにメモっとく。
まず仮想環境(vagrant)側の設定
vagrantは仮想環境構築をらくちんにするためのソフト。この記事はvagrantの使い方を述べたい記事ではないので、使い方やインストール方法は他のブログ記事とかで調べてほしい。ここではvagrant ssh
してからのOSの設定とかを記す。
vagrantで立ち上げたOSはCentOS6.4
$ cat /etc/redhat-release
CentOS release 6.4 (Final)
デフォルトのyumリポジトリだとインストールできるphpのバージョンが5.3で古いので、せめて5.4系にしておこうという訳で、remiのリポジトリを追加する。
$ sudo rpm -Uvh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
epelリポジトリはremiリポジトリを追加するのに必要なので、remiリポジトリ追加前に追加しておく。
ついこの間の8月2日にepelの6が出たみたいだけど、vagrantにphpをインストールした段階では5だったので、そのまま書いてる。
で、remiを使ってyumのupdateとphp、apacheのインストールをする。
$ sudo yum --enablerepo=remi update
$ sudo yum install httpd
$ sudo yum --enablerepo=remi install mysql-server php php-devel php-pear php-mbstring php-gd php-mysql php-xml
mysqlも何となく入れておいた。 php-xmlはこの後にcomposerを使ってphpunitをインストールするときに必要になる。 phpのバージョンを確認すると、
$ php -v
PHP 5.4.17 (cli) (built: Jul 12 2013 21:18:57)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
で、どうせローカル開発環境だし、とiptablesは切って、httpdとかはvagrant upとかで自動起動するようにしておく。
$ sudo service httpd start
$ sudo service iptables stop
$ sudo chkconfig httpd on
$ sudo chkconfig iptables off
ざっくりこんな感じでやっといて、Vagrantfileを編集する。
... config.vm.network :hostonly, "192.168.33.10" ....
これでvagrant reload
すると、一応192.168.33.10にアクセスでapacheの起動画面が見れるはず。
httpd.confは特にいじんなくてもphpinfoを書いたindex.phpをドキュメントルート下においてやっただけで私は見れた。もし見れなかったら、httpd.confをphpのモジュール読み込むように編集する。
次に、いちいちvagrant sshしないとドキュメントがいじれないのが面倒くさいので、/var/www/htmlを削除して、/vagrantへのシンボリックリンクを/var/www/htmlに貼った。
$ sudo rm -rf /var/www/html
$ sudo ln -s /vagrant /var/www/html
これでvagrantにいちいちsshしなくても、vagrantとの共有フォルダにindex.phpとかおいてやればVagrantfileで指定したIPアドレスでページが見れるようになる。
ただこの操作でちょっとハマりポイントがあった。
このあとにインストールするsmartyがapacheの実行ユーザーとsmartyのテンプレートディレクトリの所有者が一致していないとうまく動いてくれないので、/vagrant(というかsmartyのテンプレートディレクトリ)の所有者をapacheにするか、httpd.confを編集してapacheの実行ユーザーをvagrantにするかしないといけない。
このときに私は面倒くさがってsudo chown apache:apache /vagrant
を実行したんだけども、実行したのに/vagrantの所有者がvagrantからapacheに変わってくれなかった。
どうもCan I modify the ownership for a shared folder in vagrant?
にもあるように、そもそも/vagrantはVagrantfileで管理してchownでは所有者を変更できないようにしてあるらしく、Vagrantfileを変更しなければいけないということだった。で、そのVagrantfileの編集が結構面倒くさそうだった。
というわけで、あまり深く考えたくないし、他の必要なhttpd.confの設定もやってしまう。
.... User vagrant Group vagrant .... <Directory "/var/www/html" > Options -Indexes FollowSymLinks AllowOverride All </Directory>
httpdを再起動してやった。
これでとりあえずslim frameworkのインストールに移る。
slim frameworkとsmartyのインストール
slim frameworkはphpのマイクロフレームワークの一つ。phpのフレームワークにはCakePHPとかFuelPHPとかもあるけれども、先輩から「学習コストが比較的小さくてすむからslim frameworkオススメだよ」と言われたので、その受け売りで使ってみることにした。
slimのインストールディレクトリは/vagrant/slimにした。
smartyはphpのテンプレートエンジンで、slimでも対応しているし、これは先輩から「もしテンプレートエンジン使うならtwigもあるけど、アドバイスはsmartyの方がしやすい」と言われたので、smartyを選んだ。twigも別の機会に使ってみたいな。とりあえず今回はsmartyで。
slimの公式サイトではzipファイルでインストール(というか解凍だけ)もできるよ、とあるが、composerを使った方が管理しやすそうだったのでまずcomposerを使えるようにする。
$ curl -s https://getcomposer.org/installer | php
これだけ。これでcomposerが使えるようになる。ちなみにこの操作自体は別にvagrant sshしてから行う必要はなくて、共有フォルダで実行すればよい。
次にcomposer.jsonを編集する。(なければ作る)
しれっとphpunitもいれておいた。
$ vim composer.json
{
"require": {
"slim/slim": "2.*",
"slim/extras": "2.*",
"smarty/smarty": "3.*"
},
"require-dev": {
"phpunit/phpunit": "3.7.*"
}
}
composerを使ってインストール。これはvagrant ssh
した上で実行しないと動いてくれなかった。
$ php composer.phar install
$ ls -l
composer.json
composer.lock
composer.phar
vendor
これで、準備完了。
slim + smartyを使ってみる
Slim Framework Documentationを参考に.htaccessとindex.phpを作成する。 カレントディレクトリは/vagrant/slimだとする。
RewriteEngine On RewriteBase /var/www/html/slim RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*) /slim/index.php [L,QSA]
index.php
<?php require_once 'vendor/autoload.php'; define('HOME_URL', '/slim/'); $app = new \Slim\Slim(array( 'debug' => true, 'templates.path' => 'templates', 'view' => new \Slim\Extras\Views\Smarty(), )); \Slim\Extras\Views\Smarty::$smartyDirectory = 'vendor/smarty/smarty/distribution/libs/'; \Slim\Extras\Views\Smarty::$smartyCompileDirectory = 'templates_c/'; $app->get("/", function () use ($app) { $app->render("index.tpl"); })->name("home"); $app->post("/hello/", function () use ($app) { $name = $app->request()->post("name"); $app->render("hello.tpl", array('name' => $name)); })->name("hello"); $app->run();
slim直下にmkdir templates
でtemplatesフォルダを作成して、templates/index.tpl
<!DOCTYPE html> <html> <head> <title>slim sample</title> <meta charset="UTF-8"> </head> <body> <h1>slim sample</h1> <p>please input your name</p> <form action='hello/' method="POST"> <input type="text" name="name" value=""> <input type="submit" name="submit" value="submit"> </form> </body> </html>
templates/hello.tpl
<!DOCTYPE html> <html> <head> <title>hello!</title> <meta charset="UTF-8"> </head> <body> <h1>Hello, {$name}</h1> <footer> <a href='{$smarty.const.HOME_URL}'>return to HOME</a> </footer> </body> </html>
これでhttp://192.168.33.10/slimにアクセスすると
フォームに例えばkimikimi714と入れて送信すればhttp://192.168.33.10/slim/helloに飛んで
が見れるはず。
smartyの使い方とかslimの使い方をしっかり勉強した訳ではないけれども、当面これで動いてくれる。