エンジニ屋.com(エンジニヤドットコム)

分かりやすくを意識して情報発信!

【Eccube・symfony初学者】クエリ文字列( URLパラメータ)をtwigからControllerに受け渡し

本記事では、twigページから指定されたURLにページ遷移する際に、クエリ文字列の受け渡し方法を紹介します。 Eccubeでも、商品ID情報などをURLに付与してページの表示方法を変えたりしています。

クエリ文字列(URLパラメーター)とは

URLの末尾につけ足す文字列(変数)のことです。「?」をURLの末尾につけ、その次に「パラメーター=値」をつけ、複数のパラメーターをつけたい場合は「&」を使用します。この形式で、サーバーに送信したいデータをURLにつけ加えることが可能です。

twigファイルの作成

それでは、先ずはtwigファイルでクエリ文字列を付与する部分から書いていきます。 app/template/default/Test/hello.twigでファイルを作成してください。 コードを下記のように書きます。

<a href="{{ url('test_hello',{'name':'エンジニヤドットコム'}) }}">リンク</a>

aタグで「リンク」を作成しました。 hrefの属性に{{ url() }}の中でnameに設定している部分がクエリ文字列です。 {{ url('<指定url(後ほどcontrollerで指定します)>', {'<パラメータ名>':'<値>')}}となります。

Controllerを作成

このままでは、twigファイル自体も表示されたないので、表示させる為にControllerを作成します。 app/Customize/Controller/testController.phpを作成します。 とりあえず、twigを表示させる為の最低限のコードを書きます。

<?php

namespace Customize\Controller;

use Eccube\Controller\AbstractController;#FormClassやsessionClassなど纏めて継承できます。Eccubeで用意されている
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;#twigファイルを表示させる為に必要
use Symfony\Component\HttpFoundation\Request;#Requestの情報を受け取る。
use Symfony\Component\Routing\Annotation\Route;#Routeアノテーションを使用する為に必要

class testController extends AbstractController
{
    /**
     *
     * @Route("/test/hello", name="test_hello")
     * @Template("Test/hello.twig")
     */
    public function index()
    {
        return [];
    }
}

@Routeで表示させる為のURLを指定います。ここではtest/helloにします。name=でtwigから指定するurlに名前をつけます。 @Templateでtwigのファイルパスを指定います。

先ほどのtwigでurl()でtest_helloと記述しているので、 これで、指定したURLを入力すれば、先ほどのtwigの内容が表示されます。 "link"としか書いていないので、リンク付きの文字列のみ表示されたはずです。

Controllerでクエリ文字列の取得

それでは、Controllerでクエリ文字列を受け取りたいと思います。本来は、取得する為のControllerを別で記述するケースが基本ですが、本記事はテスト用の為、同じControllerに記載していきます。先ほどのControllerを下記のように書き加えます。

class testController extends AbstractController
{
    /**
     *
     * @Route("/test/hello", name="test_hello")
     * @Template("Test/hello.twig")
     */
    public function index(Request $request)
    {
        $name = $request->query->get('name');
       
        return ['name' => $name ];
    }
}

$request->queryでRequestで送信されたクエリ文字列が取得できます。 get()でパラメータ名を指定すると、その指定した値が取得できます。 最後の行で、配列としてtwigに値を渡しています。

twigファイルに追記

では、渡された値を表示させる為に下記のように書き加えます。

{% if name is defined %}
<p>{{ name  }}</p>
{% endif %}

<a href="{{ url('test_hello',{'name':'エンジニヤドットコム'}) }}">link</a>

{{ name }}が表示させる部分です。ifで囲む理由は、もし値がnullの場合にエラーとなるので、is definedで定義されている場合は、表示とすることでエラーを回避しています。

これで、linkをクリックすると画面に「エンジニヤドットコム」と表示されたはずです。

複数のクエリを渡す方法

twigを下記のように書き加えます。

{% if name is defined %}
<p>{{ name  }}</p>
<p>{{ bloger  }}</p>
{% endif %}

<a href="{{ url('test_hello',{'name':'エンジニヤドットコム','bloger':'morishi' }) }}">link</a>

単純に増やしたい、パラメータ名と値を、url()の第2引数の値を増やしていくだけです。

Contorollerも同じように増やします。

class testController extends AbstractController
{
    /**
     *
     * @Route("/test/hello", name="test_hello")
     * @Template("Test/hello.twig")
     */
    public function index(Request $request)
    {
        $name = $request->query->get('name');
        $bloger = $request->query->get('bloger');

        return ['name' => $name,'bloger' => $bloger ];
    }
}。・

これでOKです。 下記画像のようにlinkをクリックした同じページに「エンジニヤドットコム」 と「morishi」という文字が表示されました。 URL名の末尾も&で繋がれて表示されいます。

twig表示

phpでの書き方

特にsymfonyやLaravelを使用していると必要ありませんが、Controllerの中身を下記のように書き換えても同じように動作します。 PHPで用意されているグローバル関数の$_GETでクエリ文字列を取得しています ただsymfonyやLaravelの場合は、RequestというClassが用意されているので、わざわざこのように書く必要はありませんね。

class testController extends AbstractController
{
    /**
     *
     * @Route("/test/hello", name="test_hello")
     * @Template("Test/hello.twig")
     */
    public function index(Request $request)
    {
        if (isset($_GET['name'])) {
            $name = $_GET['name'];
        }

        return ['name' => $name ];
    }
}

以上となります!

最後に

Eccubeはsymfonyのフレームワークで構成されています。もし「自力でもっとカスタマイズしたい」や「仕事でEccubeで開発することになった」方には、下記のsymofony4 入門の参考書をおすすめします。
こちらの参考書にはEccubeのカスタマイズ方法については、記載されてませんがカスタマイズに必要な知識のEntity、Controller、twig、Repositoryなどの利用方法が非常に分かりやすく書かれています。筆者も仕事でEccubeに携わることとなり、参考書を購入し理解が深まりました。 symfonyはLaravelと密接している部分もありLaravelの構成部分の理解も深まり有益でした。
価格帯は若干高めですが、中身はしっかりしているので、購入して損はないと思います。