Silexでのforwardの方法は ドキュメントにも書かれており、
forward.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
$app->get('/', function () use($app) {
// redirect to /hello
$subRequest = Request::create('/hello', 'GET');
return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
});
のように、Silex\Application::handle()を使用するのですが、
これ毎回書くの面倒ですよね。
ということで、こんなtraitを用意し、
RequestSupports.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
trait RequestSupports {
public function forward($uri, $method = null) {
if (!isset($method)) {
$method = $this['request']->getMethod();
}
return $this->handle(
Request::create($uri, $method),
HttpKernelInterface::SUB_REQUEST
);
}
}
Applicationにmix-inしてあげれば、
MyApplication.php
class MyApplication extends \Silex\Application {
use RequestSupports;
}
usage.php
$app->forward('/');
と、簡潔に書くことができるようになります。
traitを使用するため、残念ながら、5.4以降限定となってはしまいますが....。