2013年5月1日水曜日

Slim Frameworkについて

青柳です。
Slim Frameworkについて紹介します。

○機能

ホームページで紹介されている機能は以下の通りです。
■強力なルーター
・標準と拡張できるHTTPメソッド
・ワイルドカードや条件と一緒に使えるルートパラメーター
・リダイレクト、パス、停止
・ルートミドルウェア
■拡張できるビューとテンプレートの表示
■フラッシュメッセージ
■AES256暗号化した安全なクッキー
■HTTPキャッシュ
■拡張できるログライター
■エラーハンドリングとデバッグ
■ミドルウェアとフックアーキテクチャ
■簡単な設定

○インストール
・フォルダー構成
app
  - composer.json
  - composer.lock
  - lib
    - Controller
    - Model
  - public
    - index.php
  - templates
  - vendor

・composer
vi composer.json
{
  "require": {
    "slim/slim": "2.*"
  }
}
php composer.phar install

・index.php
mkdir public
cd public
vi index.php
<?php
require 'vender/autoload.php';
$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
  echo "Hello, $name";
});
$app->run()
・nginx

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
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";
    }
}
ルート設定はコンストラクターで行います。無名関数では宣言無しで$thisが使えるのが便利です。

○モデル
モデルもあると便利です。
自前で容易するのもいいですがMongoDBを使うのならmandangoがおすすめです。

"mandango/mondator": "dev-master",
"mandango/mandango": "dev-master",

ジェネレーションギャップパターンで空の派生クラスが生成されるので、追加のコードはそこに書けば再生成し直しても問題ありません。



0 件のコメント:

コメントを投稿