Slim3でのURLマッピングはControllerパッケージ内のAppRouterクラスに書くことで行うことができます。
下記で言えば、/bbs/topic/123 は、/bbs/topic?id=123 にアクセスすることになります。
public class AppRouter extends RouterImpl {
public AppRouter() {
addRouting("/bbs/topic/{id}", "/bbs/topic?id={id}");
addRouting("/list/{packageName}", "/list/index?packageName={packageName}");
}
}
で、自分がやりたかったのは、Javaのパッケージ名をクエリに持たせたかったのですが、packageNameに.(ドット)が入った途端、Not foundのページが表示されてしまいました。なんでだろう?と思っていたら、.(ドット)が入ると拡張子扱いされて静的ファイルを見に行ってしまうんですね。そらー、そんなファイルあるわけないわー。
参考にしたサイトは下記。
Slim3における拡張子付きURIのマッピング 理系のためのTIPS集
上記のサイトでは、AppRouterにはisStaticというメソッドがあるので、それをオーバーライドして指定の拡張子(JSONとか)の場合のみfalseを返して静的ファイルじゃないよという宣言をしているようです。自分の場合は、パッケージ名のほうが大量になると思われるので、参考サイトとは逆に指定の拡張子の場合のみ静的ファイルだよと宣言してみました。
public class AppRouter extends RouterImpl {
public AppRouter() {
addRouting("/appli/image/{id}", "/appli/image?id={id}");
addRouting("/list/{packageName}", "/list/index?packageName={packageName}");
}
@Override
public boolean isStatic(String path) throws NullPointerException {
boolean isStatic = super.isStatic(path);
if ("png".equals(RequestUtil.getExtension(path))
||
"jpg".equals(RequestUtil.getExtension(path))
||
"gif".equals(RequestUtil.getExtension(path))
||
"js".equals(RequestUtil.getExtension(path))
||
"css".equals(RequestUtil.getExtension(path))
||
"jsp".equals(RequestUtil.getExtension(path))
) {
return isStatic;
} else {
return false;
}
}
}
これで、とりあえずは思った通りの動作になってくれました。よかったー。