Projelerimizde çeşitli sebeplerle farklı sistemler ile iletişim halinde olmamız gerekebiliyor. Bir ödeme sistemi, bağımlısı olduğumuz bir API kaynağı, sık sık taramak zorunda olduğumuz bir URL veya bir SOAP adresine sık sık istek göndermemiz gerektiğinde sürekli aynı kodları kopyalayıp ilerlemek doğru bir yazılım geliştirme yöntemi değildir.
Özellikle oturum gerektiren bir istekte bulunmamız gerekiyorsa sürekli header içinde auth bilgisi gönderiyoruz. Bu auth bilgisini eğer basic auth veya JWT token ise sürekli config içinden veya başka bir kaynaktan okuyarak istekte bulunmadan önce header içine eklememiz gerekiyor.
Ayrıca URL ve bilgisini de bir config içinden okuyarak ve hiç doğru bir yöntem olmamasına rağmen sürekli istekte bulunduğumuz satır içinde yazarak kod tekrarı yapmış oluyoruz.
Örneğin aşağıda bir API adresine doğrudan istekte bulunan 2 örneğimiz var. Bu 2 örnekte de site adresi tekrar edilmiş durumda.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Http; class RemoteApiController extends Controller { public function index(){ return Http::aceptJson()->asJson()->get('https://picsum.photos/v2/list')->body(); } public function show(int $id){ return Http::aceptJson()->asJson()->get("https://picsum.photos/id/$id/info")->body(); } } |
Bu şekilde kod tekrarı yapmanın önüne geçmek için Http Macro kullanabiliriz. AppServiceProvider
içinde aşağıdaki gibi macro tanımlayabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php namespace App\Providers; use Illuminate\Support\Facades\Http; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Register any application services. */ public function register(): void { // } /** * Bootstrap any application services. */ public function boot(): void { Http::macro('imageAPI', function (){ return Http::acceptJson() ->asJson() ->withBasicAuth( config('image_api.auth.username'), config('image_api.auth.password') ) ->baseUrl(config('image_api.base_url')); }); } } |
Bu tanımlamayı başka bir service provider içinde tanımlayıp onu config/app.php
içindeki providers
dizisine eklemeniz biraz daha düzenli çalışmanıza yardımcı olur.
Yukarıdaki tanımlamamızda acceptJson()
ve asJson()
ile giden ve gelen tüm verinin JSON olmasını istediğimizi belirtmiş olduk. Daha sonra withBasicAuth()
içinde kullanıcı bilgilerimizi de tanımlayarak tüm isteklerin auth bilgisi içermesini de sağladık. Ardından baseUrl()
ile API adresimizi de vererek en temel ihtiyaçlarımızı karşılamış olduk.
Aşağıdaki image_api.php
içeriğini ve .env
içeriğini de ilgili yerlere ekleyerek test edebiliriz.
1 2 3 4 5 6 7 8 9 |
<?php return [ 'base_url' => env('IMAGE_API_BASE_URL'), 'auth' => [ 'username' => env('IMAGE_API_USERNAME'), 'password' => env('IMAGE_API_PASSWORD'), ] ]; |
.env
içeriği
1 2 3 |
IMAGE_API_BASE_URL="https://picsum.photos" IMAGE_API_USERNAME="" IMAGE_API_PASSWORD="" |
Şimdi RemoteApiController
içinde gerekli değişiklikleri aşağıdaki gibi yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Http; class RemoteApiController extends Controller { public function index(){ return Http::imageAPI()->get('/v2/list')->body(); } public function show(int $id){ return Http::imageAPI()->get("/id/$id/info")->body(); } } |
Herhangi bir hata yapmadan bu adıma kadar geldiyseniz sonucun aynı olduğunu görmüş olmalısınız. Http sınıfındaki Macro özelliği ile kodlarımızı bu şekilde kısaltarak kod tekrarının önüne geçebilir ve okunabilirliği arttırabilirsiniz.
Faydalı olması dileğiyle..
Bir sonraki yazıda görüşmek üzere.
İlk Yorumu Siz Yapın