Slim Frameworkについて紹介します。
○機能
ホームページで紹介されている機能は以下の通りです。
■強力なルーター
・標準と拡張できるHTTPメソッド
・ワイルドカードや条件と一緒に使えるルートパラメーター
・リダイレクト、パス、停止
・ルートミドルウェア
■拡張できるビューとテンプレートの表示
■フラッシュメッセージ
■AES256暗号化した安全なクッキー
■HTTPキャッシュ
■拡張できるログライター
■エラーハンドリングとデバッグ
■ミドルウェアとフックアーキテクチャ
■簡単な設定
○インストール
・フォルダー構成
app
- composer.json
- composer.lock
- lib
- Controller
- Model
- public
- index.php
- templates
- vendor
・composer
vi composer.json
{php composer.phar install
"require": {
"slim/slim": "2.*"
}
}
・index.php
mkdir public
cd public
vi index.php
<?php・nginx
require 'vender/autoload.php';
$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
echo "Hello, $name";
});
$app->run()
server {
server_name slim.example.com;
listen 80;
root /var/www/app/slim/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}
○拡張
素のSlimにはあまり機能がありません。
目的に応じて機能を追加します。
・ビュー
HTMLを構築することが多いようならSmartyがおすすめ。
以下のパッケージを追加します。
"slim/extras": "2.0.*",
"smarty/smarty": "3.1.*",
vi index.php
\Slim\Extras\Views\Smarty::$smartyDirectory = '../vendor/smarty/smarty/distribution/libs';
\Slim\Extras\Views\Smarty::$smartyCompileDirectory = '../templates_c';
\Slim\Extras\Views\Smarty::$smartyTemplatesDirectory = '../templates';
\Slim\Extras\Views\Smarty::getInstance()->escape_html = true;
$app = new \Slim\Slim([
"templates.path" => "../templates",
'view' => new \Slim\Extras\Views\Smarty,
]);
・ログ
fluentdにログを書くにはこれ。
"aoyagikouhei/slim-fluent-logwriter": "0.0.*",
vi index.php
$writer = new \Slim\FluentLogwriter(['tag' => 'mongodb.system_log', 'level' => \Slim\Log::INFO]);
$writer->addFluent(['tag' => 'mail.system_log', 'level' => \Slim\Log::WARN]);
$app = new \Slim\Slim([
'log.writer' => $writer,
]);
・セッション
MongoDBにセッションを保存します。
"aoyagikouhei/mongo-session-handler": "0.0.*",
vi index.php
\MongoSession\Handler::initSession([
'server' => 'mongodb://127.0.0.1:27017'
,'db_name' => 'test'
,'write_options' => ['w' => 1]
]);
○コントローラー
規模が大きくなってくると、index.phpに全てのコードを書くと量が多くなり読みにくいコードになります。共通化するのも関数でしかできなくて不便です。
そこでコントローラークラスを導入することで、ベースクラスやポリモルフィズムやtraitなどの共通化行いやすくなります。
まずindex.phpの先頭でコントローラークラスを自動で読み込んでもらえるようにAutoloaderに登録します。
<?php
$loader = require "../vendor/autoload.php";
$loader->add('Controller', '../lib');
$loader->register();
次にBaseControllerです。
<?php
namespace Controller;
class BaseController
{
protected $app;
public function __construct($app)
{
$this->app = $app;
}
}
各コントローラーを定義します。
<?phpルート設定はコンストラクターで行います。無名関数では宣言無しで$thisが使えるのが便利です。
namespace Controller;
class Member extends \Controller\BaseController
{
public function __construct($app)
{
parent::_construct($app);
$this->app->get('/member/login'), function () {
$this->login();
});
}
private function login() {
echo "hi";
}
}
○モデル
モデルもあると便利です。
自前で容易するのもいいですがMongoDBを使うのならmandangoがおすすめです。
"mandango/mondator": "dev-master",
"mandango/mandango": "dev-master",
ジェネレーションギャップパターンで空の派生クラスが生成されるので、追加のコードはそこに書けば再生成し直しても問題ありません。