Symfony’de $request->get() Kullanımı: Güncel ve Doğru Yöntem

Symfony projelerinde request verilerine ulaşmak için uzun süre şu kullanım tercih ediliyordu:

 
$value = $request->get('name');
 

Ancak güncel Symfony sürümlerinde bu kullanım artık önerilmiyor. Symfony 7.4 ile Request::get() metodu deprecated oldu ve Symfony 8.0 ile tamamen kaldırılması planlanıyor. Bunun temel nedeni, $request->get() metodunun değerin nereden geldiğini açıkça göstermemesidir. Bu metod önce route attributes, sonra GET parametreleri, sonra POST verileri içinde arama yapar. Bu durum kodun okunabilirliğini ve güvenilirliğini azaltabilir.

Symfony’nin önerdiği yaklaşım, verinin geldiği kaynağı açıkça belirtmektir. HttpFoundation dokümanında query için $_GET, request için $_POST, attributes için route veya uygulama içi attribute verileri kullanıldığı belirtilir.

Eski Kullanım

 
$name = $request->get('name');
 

Bu kullanımda name değeri nereden geliyor belli değildir:

  • URL query parametresi olabilir.
  • Form POST verisi olabilir.
  • Route attribute değeri olabilir.

Bu yüzden güncel Symfony projelerinde daha açık ve kontrollü kullanım tercih edilmelidir.

Yeni ve Doğru Kullanım

GET Parametresi İçin

Örneğin URL şu şekildeyse:

 
/products?search=laptop&page=2
 

Doğru kullanım:

 
$search = $request->query->get('search');
$page = $request->query->getInt('page', 1);
 

Burada veri URL query string üzerinden geldiği için $request->query kullanılır.


POST Form Verisi İçin

Bir formdan veri gönderiliyorsa:

 
$name = $request->request->get('name');
$email = $request->request->get('email');
 

Burada veri form POST içeriğinden geldiği için $request->request kullanılır.


Route Parametresi İçin

Route şu şekildeyse:

 
#[Route('/products/{id}', name: 'product_show')]
 

Controller içinde en temiz kullanım:

 
#[Route('/products/{id}', name: 'product_show')]
public function show(string $id): Response
{
// $id route parameter
}
 

Alternatif olarak request üzerinden almak gerekirse:

 
$id = $request->attributes->get('id');
 

Somut Örnek: Ürün Arama Controller’ı

Aşağıdaki örnekte kullanıcı ürün listesinde arama yapıyor. search ve page bilgileri URL üzerinden geliyor.

URL örneği:

 
/products?search=phone&page=2
 

Controller:

 
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class ProductController extends AbstractController
{
#[Route('/products', name: 'product_index', methods: ['GET'])]
public function index(Request $request): Response
{
$search = $request->query->get('search', '');
$page = $request->query->getInt('page', 1);

return $this->render('product/index.html.twig', [
'search' => $search,
'page' => $page,
]);
}
}
 

Burada eski şekilde şöyle yazmak doğru olmazdı:

 
$search = $request->get('search');
$page = $request->get('page');
 

Çünkü bu kullanımda Symfony değeri route, GET veya POST içinde arayabilir. Oysa bizim bildiğimiz şey şu: search ve page URL’den geliyor. Bu yüzden doğru kullanım:

 
$search = $request->query->get('search', '');
$page = $request->query->getInt('page', 1);
 

JSON API Örneği

Eğer bir API endpoint’ine JSON body gönderiliyorsa:

 
{
"name": "Test Product",
"price": 150
}
 

Controller içinde şu kullanım tercih edilebilir:

 
#[Route('/api/products', name: 'api_product_create', methods: ['POST'])]
public function create(Request $request): Response
{
$data = $request->toArray();

$name = $data['name'] ?? null;
$price = $data['price'] ?? null;

return $this->json([
'name' => $name,
'price' => $price,
]);
}
 

Form verisi veya JSON payload birlikte desteklenecekse Symfony’nin getPayload() metodu da kullanılabilir:

 
$payload = $request->getPayload();

$name = $payload->get('name');
$price = $payload->get('price');
 

Kısa Karşılaştırma

Veri Kaynağı Eski Kullanım Yeni Kullanım
GET parametresi $request->get('search') $request->query->get('search')
POST form verisi $request->get('name') $request->request->get('name')
Route parametresi $request->get('id') $request->attributes->get('id')
JSON body $request->get('name') $request->toArray() veya $request->getPayload()

Sonuç

Symfony’de $request->get() kullanımı artık modern projeler için doğru bir tercih değildir. Bunun yerine verinin kaynağına göre açık kullanım tercih edilmelidir:

 
$request->query->get('key');      // GET
$request->request->get('key'); // POST form
$request->attributes->get('key'); // Route attribute
$request->toArray(); // JSON body
$request->getPayload(); // Form veya JSON payload
 

Bu yaklaşım kodu daha okunabilir, daha güvenli ve Symfony’nin güncel sürümleriyle daha uyumlu hale getirir. Özellikle Symfony 7.4 ve sonrası için yeni projelerde $request->get() yerine bu yöntemlerin kullanılması daha doğru olacaktır.

Keywords: Symfony

Yorumlar

Log in or sign up to write a comment
Giriş
Sign Up