Bazı durumlarda kullanıcıların gerçek bir kullanıcı mı, yoksa sahte bir kullanıcı mı olduğunu anlamak için doğrulama yapmamız gerekir. Burada çözüm olarak karşımıza devletin sağladığı bir SoapClient çıkıyor. Bu client üzerinden isim, soyisim, tc kimlik numarası ve doğum yılı ile istek atıp kullanıcıyı doğrulayabiliyoruz.
Bu validasyon işlemini laravel tarafında bir Rule oluşturup yapabiliriz.
İlk önce aşağıdaki artisan komutu ile Classımızı oluşturuyoruz.
1php artisan make:rule ValidateTCNo
Oluşan validasyon dosyamızı App\Rules dizini içinde görebilirsiniz. Bu classımızın içinde iki tane method otomatik olarak geliyor, birisi passes() methodu, diğeri message() methodu. Validasyon için logic işlemleri passes() içinde gerçekleştireceğiz. Hata mesajını ise message() methodu içinde oluşturacağız.
Classımız bu şekilde olacak, kodları incelersek:
1<?php 2 3namespace App\Rules; 4 5use Illuminate\Contracts\Validation\Rule; 6 7class ValidateTCNo implements Rule 8{ 9 /**10 * Create a new rule instance.11 *12 * @return void13 */14 public function __construct15 (16 public string $name,17 public string $surname,18 public int $birthYear19 )20 {21 //22 }2324 /**25 * Determine if the validation rule passes.26 *27 * @param string $attribute28 * @param mixed $value29 * @return bool30 */31 public function passes($attribute, $value)32 {33 $client = new \SoapClient('https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL');3435 $response = $client->TCKimlikNoDogrula([36 'TCKimlikNo' => $value,37 'Ad' => \Transliterator::create("tr-Upper")->transliterate($this->name),38 'Soyad' => \Transliterator::create("tr-Upper")->transliterate($this->surname),39 'DogumYili' => $this->birthYear40 ]);4142 return $response->TCKimlikNoDogrulaResult;43 }4445 /**46 * Get the validation error message.47 *48 * @return string49 */50 public function message()51 {52 return 'Girilen TC kimlik numarası doğru değil.';53 }54}
Bu objemizin içine TC kimlik numarası otomatik olarak gelecek, ama ad soyad vs. fieldlerı constructor ile almamız gerekiyor. PHP8 ile gelen Constructor property promotion özelliği ile değişkenleri objeye direkt atayabilirsiniz.
Passes methodu içinde aşağıdaki kısım, gönderdiğimiz datayı büyük harflere çeviriyor. strtoupper() kullanmamamın sebebi, bu fonksiyon ı, ğ, ç gibi Türkçe karakterleri çeviremiyor.
1\Transliterator::create("tr-Upper")->transliterate($this->name)
Sırada oluşturduğumuz validasyonu form içinde kullanmakta var. Aşağıda örnek bir validasyon işlemi görebilirsiniz.
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Http\Controllers\Controller; 6use App\Rules\ValidateTCNo; 7use Illuminate\Http\Request; 8 9class ApplicationController extends Controller10{11 public function store(Request $request)12 {13 $attributes = $request->validate([14 'name' => 'required|string',15 'surname' => 'required|string',16 'birthyear' => 'required|numeric',17 'tc' => ['required', new ValidateTCNo($request->name, $request->surname, $request->birthyear)],18 // diğer validasyonlar19 ]);2021 /** işlemler*/22 }23}