LoginSignup
18
22

More than 5 years have passed since last update.

PHPのSlimフレームワークでのコントローラ例

Last updated at Posted at 2015-12-03

Slim3.0 RC3 でのメモ。

slim 2.4からroutingでクラス形式のコントローラーを呼び出せるようになっていたらしい などを見て $app (Slim\Appオブジェクト) の受け渡しができないとキツいなあという感じだったんだけど、そのまま渡したらいけるっぽい(3.0だから?)。

簡単な説明はコード内コメントにて。

index.phpでのSlimルーティング
$app = new \Slim\App(/* ... */);

// any で全てのメソッドに対応し、/sample 以下の全てをコントローラで処理
//
// v3.0 RC3 の時点で、特定ディレクトリ以下の全パスを取得するには
// なぜか {path:.*} という記述でしか動かなかった
// {.*} とか (.*) とかダメ
// 
// コンストラクタに $app を渡す必要がある

$app->any('/sample{path:.*}', new SampleController($app));
BaseController.phpの例
<?php
class BaseController
{
    protected $app;

    final public function __construct($app)
    {
        // Slim\\Appオブジェクトをセット
        $this->app = $app;
    }

    // ルーティングでの処理
    final public function __invoke($request, $response)
    {
        // リクエストパラメータ
        $params = $request->getParams();

        // ルーティングのパス( /sample 以下のパス)
        $path = $request->getAttribute('route')->getArgument('path');

        $path = trim($path, '/');
        if (!empty($path)) {
            // リクエストメソッドとディレクトリ名を合体しメソッド名にする
            // 例:GET /foo -> getFoo()
            // 例:POST /foo/bar -> postFooBar()
            $func_name = $request->getMethod().str_replace('/', '', $path);
            if (method_exists($this, $func_name)) {
                return $this->$func_name($params);
            }
        }

        // 該当がなければ Not Found
        throw new \Slim\Exception\NotFoundException($request, $response);
    }
}
SampleController.php
<?php
class SampleController extends BaseController
{
    // GET /sample/foo を処理
    public function getFoo($params = array())
    {
        return $this->app->response->getBody()->write('GETですよ');
    }

    // POST /sample/foo を処理
    public function postFoo($params = array())
    {
        return $this->app->response->getBody()->write('POSTしたでしょ!');
    }
}
18
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
22