わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

vagrant + slim framework + smartyをcomposerで構築

追記 2014-05-20

久しぶりにslimを使ったアプリを触る機会があっていろいろ調べてたら、本文のcomposer.jsonにあるslim/extrasはdeprecatedになっていた。
SmartyTwigをテンプレートエンジンとして使うなら、代わりにslim/viewsを使うといいみたい。
今日、slim/viewsを使うところまでやってみたけども、記事をちゃんとまとめる時間がないので後日書いてアップしようと思う。

書いた → Slim ViewsでSmartyテンプレートを呼び出す - わすれっぽいきみえ

本編

vagrantを使ってslim frameworkというphpのマイクロフレームワークを使ってみた。 そのときにいろいろやったことを未来の自分は絶対忘れると思うので、今のうちにメモっとく。

まず仮想環境(vagrant)側の設定

Vagrant

vagrantは仮想環境構築をらくちんにするためのソフト。この記事はvagrantの使い方を述べたい記事ではないので、使い方やインストール方法は他のブログ記事とかで調べてほしい。ここではvagrant sshしてからのOSの設定とかを記す。

vagrantで立ち上げたOSはCentOS6.4

$ cat /etc/redhat-release
CentOS release 6.4 (Final)

ここにyumphpapacheをインストールする。

デフォルトの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が出たみたいだけど、vagrantphpをインストールした段階では5だったので、そのまま書いてる。

で、remiを使ってyumのupdateとphpapacheのインストールをする。

$ 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アドレスでページが見れるようになる。

ただこの操作でちょっとハマりポイントがあった。

このあとにインストールするsmartyapacheの実行ユーザーと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の設定もやってしまう。

/etc/httpd/conf/httpd.conf

....
User vagrant
Group vagrant
....
<Directory "/var/www/html" >
    Options -Indexes FollowSymLinks
    AllowOverride All
</Directory>

httpdを再起動してやった。

これでとりあえずslim frameworkのインストールに移る。

slim frameworkとsmartyのインストール

Slim Framework

slim frameworkはphpのマイクロフレームワークの一つ。phpフレームワークにはCakePHPとかFuelPHPとかもあるけれども、先輩から「学習コストが比較的小さくてすむからslim frameworkオススメだよ」と言われたので、その受け売りで使ってみることにした。
slimのインストールディレクトリは/vagrant/slimにした。

PHP Template Engine | Smarty

smartyphpのテンプレートエンジンで、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だとする。

.htaccess

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にアクセスすると

f:id:kimikimi714:20130804175804p:plain

フォームに例えばkimikimi714と入れて送信すればhttp://192.168.33.10/slim/helloに飛んで

f:id:kimikimi714:20130804175925p:plain

が見れるはず。

smartyの使い方とかslimの使い方をしっかり勉強した訳ではないけれども、当面これで動いてくれる。