Symfonyでコントローラのコードをリファクタリングする方法をやさしく解説!初心者向けガイド
生徒
「先生、Symfonyで作ったコントローラのコードがごちゃごちゃして読みにくくなってきたんですが、どうすればいいですか?」
先生
「それはリファクタリングのチャンスですね!」
生徒
「リファクタリング?なんか難しそうな言葉ですね…」
先生
「心配しなくて大丈夫。リファクタリングとは、“動きはそのままに、中身をキレイに整理すること”なんです。台所を掃除して、道具を使いやすく並べるような感じですね。」
生徒
「なるほど、コードも整理整頓って大事なんですね!やり方を教えてください!」
先生
「それでは、Symfonyでコントローラのリファクタリングをする方法を、やさしく解説していきましょう!」
1. リファクタリングとは?
リファクタリングとは、プログラムの動作は変えずに、コードの書き方や構造を見やすく整理する作業のことです。
たとえば、長くなりすぎた関数を分けたり、重複した処理を一つにまとめたりします。
Symfonyのコントローラでは、特に「共通処理」や「条件分岐」が増えてくると、コードが長くなって読みにくくなるので、リファクタリングがとても重要です。
2. リファクタリング前の例
まずは、少しごちゃごちゃした状態のコントローラを見てみましょう。
#[Route('/product/{id}', name: 'product_detail')]
public function detail(int $id): Response
{
$product = $this->getDoctrine()->getRepository(Product::class)->find($id);
if (!$product) {
throw $this->createNotFoundException('商品が見つかりません');
}
$priceWithTax = $product->getPrice() * 1.1;
return $this->render('product/detail.html.twig', [
'product' => $product,
'priceWithTax' => $priceWithTax,
]);
}
このままでも動きますが、いろんな処理が混ざっていて少し読みづらいですね。
3. リファクタリングのポイント
以下のような処理を整理しましょう:
- 共通処理(商品の取得)を専用の関数に分ける
- 計算処理(税計算)を別の関数に切り出す
こうすることで、コントローラ本体は「流れだけ」を書いて読みやすくなります。
4. リファクタリング後のコード
private function findProductOr404(int $id): Product
{
$product = $this->getDoctrine()->getRepository(Product::class)->find($id);
if (!$product) {
throw $this->createNotFoundException('商品が見つかりません');
}
return $product;
}
private function calculateTaxPrice(float $price): float
{
return $price * 1.1;
}
#[Route('/product/{id}', name: 'product_detail')]
public function detail(int $id): Response
{
$product = $this->findProductOr404($id);
$priceWithTax = $this->calculateTaxPrice($product->getPrice());
return $this->render('product/detail.html.twig', [
'product' => $product,
'priceWithTax' => $priceWithTax,
]);
}
リファクタリング後は、関数名を見るだけで何をしているか分かるようになりましたね!
5. Symfonyでよくあるリファクタリングのアイデア
- 長すぎる関数 → 小さく分割
- 同じコードが何度も登場 → 関数にまとめる
- HTMLテンプレートへの渡し方 → 配列名を整理する
- ベースコントローラを使う → 共通処理の集約
「読みやすいコード」は、後から自分やチームの仲間が見たときに理解しやすくなります。
6. 初心者でもできる!リファクタリングのコツ
リファクタリングは、小さなところから少しずつ始めるのがポイントです。
最初は「同じコードが2回以上出てきたら関数にまとめる」だけでも十分です。
慣れてきたら、ベースコントローラにまとめたり、サービスクラスに分ける方法もあります(今回は紹介しません)。
「キレイにすることは悪ではない」どころか、長く使うコードほど大事な考え方です。