axiosで渡したパラメータをSymfonyで受け取る方法まとめ

はじめに

あっという間に年の瀬で、もうすぐ入社から10か月の廣田です。

入社時よりは多少知識はつきましたが、他の記事を読むとハイレベルだな~、まだまだだな~と感じ入ります。

とはいえ難しいことは語れないので(汗)、今回は毎回調べてしまうaxiosとSymfonyのやりとり(SymfonyのRequestクラスの使い方)について書こうと思います。

開発本部で使っているjavascriptフレームワーク、Vue.jsでサーバーとやり取りする際にaxiosを利用していますが、その際のaxiosの書き方やSymfonyでパラメータを受け取る時の方法が、いつもなんだっけ?となるので備忘がてらまとめました。


Routeにplaceholderを設定しているとき

SymfonyでRouteを以下の例のように設定している場合、GET/POST送信されたパラメータをコントローラの引数として取得できます。

単純な値を1、2個渡すだけならこの方法を使ったほうが良いと思います。(URLの見た目もスッキリします。)
▼javascript側
const url = Routing.generate('app_find_prdct', {id: this.id});
const res = await axios.get(url);
if (!res.data.success) {
   EventBus.$emit('simple-modal_alert', 'エラー', res.data.errorMessages, callback);
   return;
}
//うまくいったときの処理
・・・
  ▼PHP側
  /**
     * @Route("/findProduct/{id}", name="app_find_prdct", options={"expose"=true}, methods={"GET"})
     * @param ProductRepository $pRepo
     * @param int|null $id
     * @return JsonResponse
     */
    public function findProduct(ProductRepository $pRepo, ?int $id ): JsonResponse
    {
        $p = $pRepo->findById( $id );
        if( !$p ){
            return $this->json(['success' => false]);
        }
        return $this->json([
            'success'  => true,
            'product' => $p
        ]);
    }
Routeでプレースホルダーに{id}とすることでコントローラの引数$idでaxiosが渡したパラメータを取得しています。

SymfonyのRequestクラスを使う

プレースホルダーの指定をしないときはSymfonyのRequestクラスを使います。

use Symfony\Component\HttpFoundation\Request;
public funtion someFunction(Request $request) {
     ...............
//GETの時
$id = $request->query->get('id');
//POSTの時
$id = $request->get('id');

//JSON形式でPOSTされた値を取得する時など
$content = $request->getContent();
['id' => $id] = json_decode($content, true);

}
axiosで渡すパラメータの値がJSON形式の時や、パラメータが複数の時はRequestクラスのgetContentを使うと、POST/GETされたそのままのデータにアクセスできます。
さらに、その値をPHPのjson_decodeを利用して連想配列形式で取得したりできるので便利です。

※参考:Symfony Routing
    generate_url_javascript
    HttpFoundation Component

さいごに

初歩的なところですが、当然のように使っていたので文章にまとめてみると理解が深まったような気がします。
記事を書く順番が来るとネタを決めるまで悩みますが、振り返る良い機会になりますね^^

冬休みまで指折り数える毎日ですが、それまで体調管理に気を付けて頑張りましょう!
ではでは。