概要
任意のHTTPステータスコードを返せるようにしたい。
試しに普通なら200のステータスを返却する特定商取引法のページを、404のステータスで返却するようにしてみます。(そんな特定商取引法のページは嫌だ…)
本来ならCustomizeディレクトリ内でやるべきだけど、方法を示すだけなのでsrc/Eccube/Controller/HelpController.php
に実装してみます。
手を加える前
Controllerの各関数の上に@Route
アノテーションと@Template
アノテーションを記述してあげることで、ルーティングの設定と使用するテンプレートを指定できるようになりますよね。
特定商取引法のページだと以下のような感じ。
https://ドメイン/help/tradelaw というページができて、使うテンプレートは Help/tradelaw.twig になります。
namespace Eccube\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Routing\Annotation\Route;
class HelpController extends AbstractController
{
/**
* HelpController constructor.
*/
public function __construct()
{
}
/**
* 特定商取引法.
*
* @Route("/help/tradelaw", name="help_tradelaw")
* @Template("Help/tradelaw.twig")
*/
public function tradelaw()
{
return [];
}
まあ、普通に200のHTTPステータスを返します。
任意のHTTPステータスへ変更する
namespace Eccube\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
class HelpController extends AbstractController
{
private $twig;
/**
* HelpController constructor.
*/
public function __construct(\Twig_Environment $twig)
{
$this->twig = $twig;
}
/**
* 特定商取引法.
*
* @Route("/help/tradelaw", name="help_tradelaw")
*/
public function tradelaw()
{
$content = $this->twig->render("Help/tradelaw.twig", []);
return new Response($content, Response::HTTP_NOT_FOUND);
}
このように特定商取引法のページの内容を表示しつつHTTPステータスは404となりました。(ページは存在するのに404で返すのは変ですが…)
@Template
アノテーションでテンプレートの指定を行わずTwig_Environment
のrender
で指定してあげたものをResponse
クラスに渡してオブジェクトを戻り値にしてあげてください。
render
の第一引数は使用するテンプレートの文字列で、第二引数はテンプレートで使用する変数を連想配列で渡します。
Response
クラスの第二引数はHTTPステータスコードの指定になります。integerで渡しても問題ないのですが、Response
クラスが準備してくれた定数を使っても良いです。
Response::HTTP_NOT_FOUND
は404という数字の入った定数です。
どんな場面で活用すればいいか
EC-CUBE4は存在しないページへアクセスがあった場合にヘッダーとフッターのないページが404ステータスで表示されます。
ヘッダーとフッターのあるオリジナルなNotFoundページを普通に作成しリダイレクトをさせてあげるなどすると、リダイレクト先が200のHTTPステータスになると思います。
そのような場合に任意のHTTPステータスコードを返せるこの実装で404のHTTPステータスコードを返してあげれば良いと思います。
…まあこれぐらいしか使いみちがないかもしれませんが、方法の一つとしてこういうのがあったなぐらいで覚えておいてください。
以上です。
(もっといい方法あったら教えてください…)