LoginSignup
0
1

More than 5 years have passed since last update.

[EC-CUBE4] 任意のHTTPステータスコードを返すルーティングの設定方法

Posted at

概要

任意のHTTPステータスコードを返せるようにしたい。
試しに普通なら200のステータスを返却する特定商取引法のページを、404のステータスで返却するようにしてみます。(そんな特定商取引法のページは嫌だ…)

本来ならCustomizeディレクトリ内でやるべきだけど、方法を示すだけなのでsrc/Eccube/Controller/HelpController.phpに実装してみます。

手を加える前

Controllerの各関数の上に@Routeアノテーションと@Templateアノテーションを記述してあげることで、ルーティングの設定と使用するテンプレートを指定できるようになりますよね。

特定商取引法のページだと以下のような感じ。
https://ドメイン/help/tradelaw というページができて、使うテンプレートは Help/tradelaw.twig になります。

src/Eccube/Controller/HelpController.php
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.png

まあ、普通に200のHTTPステータスを返します。

任意のHTTPステータスへ変更する

src/Eccube/Controller/HelpController.php
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);
    }

404.png

このように特定商取引法のページの内容を表示しつつHTTPステータスは404となりました。(ページは存在するのに404で返すのは変ですが…)

@Templateアノテーションでテンプレートの指定を行わずTwig_Environmentrenderで指定してあげたものをResponseクラスに渡してオブジェクトを戻り値にしてあげてください。

renderの第一引数は使用するテンプレートの文字列で、第二引数はテンプレートで使用する変数を連想配列で渡します。

Responseクラスの第二引数はHTTPステータスコードの指定になります。integerで渡しても問題ないのですが、Responseクラスが準備してくれた定数を使っても良いです。

Response::HTTP_NOT_FOUNDは404という数字の入った定数です。

どんな場面で活用すればいいか

EC-CUBE4は存在しないページへアクセスがあった場合にヘッダーとフッターのないページが404ステータスで表示されます。

ヘッダーとフッターのあるオリジナルなNotFoundページを普通に作成しリダイレクトをさせてあげるなどすると、リダイレクト先が200のHTTPステータスになると思います。

そのような場合に任意のHTTPステータスコードを返せるこの実装で404のHTTPステータスコードを返してあげれば良いと思います。

…まあこれぐらいしか使いみちがないかもしれませんが、方法の一つとしてこういうのがあったなぐらいで覚えておいてください。

以上です。
(もっといい方法あったら教えてください…)

0
1
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
0
1