Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
  • YardımLaravel
  • PHP ile yazılmış bir API nasıl laravel içerisine dahil edilmeli?

  • Leon

      Seviye 31
    • Düzenlendi

    Merhabalar,

    Örnek olarak php ile yazılmış bir API var bunu yazdığımız laravel projemize dahil etmek istediğimizde bunu bir service container olarak mı dahil etmeliyiz? Yoksa bunu bir cephe facades olarak mı dahil etmeliyiz? Yoksa hop direk bir namespace ile use ederek mi kullanmalıyız?

    örnek vermek gerekirse bir çeviri için yazılmış API var bunu sisteme Service Container mi yoksa Facades olarak mı eklemeliyim?

    Birde mesela benim daha önce yazdığım bir alan adı parçalayıcı var bunu sisteme dahil etmek istersem bunu bir cephemi yoksa bir helper mi olarak eklemeliyim?

    • mgsmus bunu yanıtladı.
    • Leon Facade, service container dahilinde bir sınıfın yöntemlerinin statik olarak kullanılmasını sağlayan bi arayüzdür. Ayrıca ek bir katman daha oluşturarak kodda değişiklik yapmadan proxy olarak temsil edilen ana sınıfın değiştirilmesine olanak sağlayarak inversion of control ilkesinin de gerçekleşmesini sağlar. Bu bakımdan örneğin tarih işlemlerinde Carbon sınıfı yerine Illuminate\Support\Facades\Date kullanılması gerekiyor. Carbon kullandığınızda Laravel özelliğini değil PHP paketi olan Carbon'u kullanmış oluyorsunuz. Illuminate\Support\Facades\Date kullandığınızda ise Laravel'in özelliğini kullanıyorsunuz. İkisi aynı şey gibi gözükse de örneğin ileride Carbon sınıfı değişse Illuminate\Support\Facades\Date kullanırsanız Illuminate\Support\Facades\Date geçen yerleri değiştirmek zorunda kalmazsınız. Illuminate\Support\Facades\Date içinde aynı yöntemler gerçekleştirilerek farklı bir tarih kütüphanesi sisteme eklenebilir, Carbon değiştirilebilir.

      Burada Facade kullanımı ile bir soru da cevaplanmış oluyor: Facade kullanabilmek için proxylenen sınıfın service container dahilinde bir sınıf olması gerekiyor.

      Yapmanız gereken yazılan API, servis... her ne ise bunu service container içerisine dahil etmeniz. Bir alias vererek bağlayın:

      $this->app->bind('translation.api', function() {
          return new \App\Services\Translation\TranslationService();
      });

      Böylece direkt kullanmak istediğinizde new TranslationService() yerine resolve('translation.api') şeklinde kullanabilirsiniz. Daha sonra binding üzerinde bir değişiklik yapsanız bile kodu değiştirmenize gerek kalmaz.

      Ayrıca interface kullanın ki takaslanabilir dependency injection gerçekleşebilsin ve service container ile IoC nimetlerinden faydalanabilesiniz:

      $this->app->bind(
          \App\Services\Translation\TranslationServiceInterface::class,
          \App\Services\Translation\TranslationService::class
      );

      Sınıfı service container içerisine dahil ettiğinizde artık Facade kullanmak biraz tercih meselesi oluyor. Durağan olmayan yöntemlere statik ulaşmaktan fazla bir katkısı olmuyor.

      Kamyon arkası yazısı gibiyim. Yemin ediyorum, ümitsiz vakayım. 🙂

      Testimiz pozitif değil ama bizde hiç bir şeyden tat alamıyoruz.

      Ben olsam Laravel'e uygun şekilde yeniden yazma yoluna giderdim.

      • Leon bunu yanıtladı.

        coder2 tekrar yazsam sorun değil hocam ben öğrenmek istiyorum. Neyi, neden, niçin, nesebepten, nasıl bu biraz şey gibi oldu cinayet süsündeki eleman gibi 🙂 hocam nasıl öğreneceğim ben bunu doğru düzgün yazmayı bir çok şeyi gerçi öğrendim ama hala yerine oturmaya bir kaç şey var. bu yukarıda bahsettiklerim gibi, mesela bir classım var herhangi bir enjeksiyonu yok illa bunu service container olarak mı eklemeliyim, yoksa bunu facade mi eklemeliyim. class ları use ederek kullanamaz mıyım? Kullanmamalı mıyım? Hocam dicemki müsaitseniz yemek ısmarlayayım birazda sohbet etsek her yer kapalı 🙂 resmen çöldeki kutup ayısı gibiyim.

        • mgsmus

          Seviye 1379
        • Düzenlendi
        • En İyi YanıtLeon tarafından

        Leon Facade, service container dahilinde bir sınıfın yöntemlerinin statik olarak kullanılmasını sağlayan bi arayüzdür. Ayrıca ek bir katman daha oluşturarak kodda değişiklik yapmadan proxy olarak temsil edilen ana sınıfın değiştirilmesine olanak sağlayarak inversion of control ilkesinin de gerçekleşmesini sağlar. Bu bakımdan örneğin tarih işlemlerinde Carbon sınıfı yerine Illuminate\Support\Facades\Date kullanılması gerekiyor. Carbon kullandığınızda Laravel özelliğini değil PHP paketi olan Carbon'u kullanmış oluyorsunuz. Illuminate\Support\Facades\Date kullandığınızda ise Laravel'in özelliğini kullanıyorsunuz. İkisi aynı şey gibi gözükse de örneğin ileride Carbon sınıfı değişse Illuminate\Support\Facades\Date kullanırsanız Illuminate\Support\Facades\Date geçen yerleri değiştirmek zorunda kalmazsınız. Illuminate\Support\Facades\Date içinde aynı yöntemler gerçekleştirilerek farklı bir tarih kütüphanesi sisteme eklenebilir, Carbon değiştirilebilir.

        Burada Facade kullanımı ile bir soru da cevaplanmış oluyor: Facade kullanabilmek için proxylenen sınıfın service container dahilinde bir sınıf olması gerekiyor.

        Yapmanız gereken yazılan API, servis... her ne ise bunu service container içerisine dahil etmeniz. Bir alias vererek bağlayın:

        $this->app->bind('translation.api', function() {
            return new \App\Services\Translation\TranslationService();
        });

        Böylece direkt kullanmak istediğinizde new TranslationService() yerine resolve('translation.api') şeklinde kullanabilirsiniz. Daha sonra binding üzerinde bir değişiklik yapsanız bile kodu değiştirmenize gerek kalmaz.

        Ayrıca interface kullanın ki takaslanabilir dependency injection gerçekleşebilsin ve service container ile IoC nimetlerinden faydalanabilesiniz:

        $this->app->bind(
            \App\Services\Translation\TranslationServiceInterface::class,
            \App\Services\Translation\TranslationService::class
        );

        Sınıfı service container içerisine dahil ettiğinizde artık Facade kullanmak biraz tercih meselesi oluyor. Durağan olmayan yöntemlere statik ulaşmaktan fazla bir katkısı olmuyor.

        Bende hala öğrenmeye çalışıyorum aslında. Bu süreçte farkettiğim şey şu oldu, yapa yapa öğreniyor insan. En azından bende öyle oluyor.
        Mesela geçen sene arayüz kullanımı çok saçma ve gereksiz geliyorken bu yıl arayüz olmadan yazılan sınıf görünce rahatsız oluyorum. Sevice container ile uğraşacağıma her sınıfı trait olarak yazıp use ile ekler geçerim diyordum şimdi ise service içinde kullanacağım kodlar haricinde trait kullanmama taraftarıyım. Bu böyle uzayıp gidiyor.

        Düşüncelerimdeki bu tür değişimlerin temel sebebi ise yaptığım web sitelerinde istenen güncelleme ve değişimlerin beni çok zorlaması oldu. Arayüz kullanıp bunu bind etsem değişiklik istendiğinde 1 saatte değişikliği tamamlayabileceksem bu değişiklik 1 günümü alıyor, çünkü bir yeri değiştirince farklı yerler patlıyordu. Bir method yazıyordum, o method un return ettiği veri tipi değişince tüm projede o methodu kullandığım yeri arayıp duruyordum vs vs

        Benden öğrenebileceğiniz pek birşey yok ama; mgsmus, sineld, alihankoc ve deathisonitsway hocalardan çok şey öğrenebilirsiniz.

        @coder2 Valla herkesten öğrenecek mutlaka bir bilgi vardır. @mgsmus @sineld @alihankoc valla hocalar işi bitirmişler. şimdi benim yazmak kurgulamak ile ilgili hiç bir sorunum yok, @mgsmus Hocam sağ olsun yazmış facadeleri anlatmış. Service containerleride anlatmış, şimdi bakalım anlamış mı benim küçük beynim.

        Anladıklarımı tercüme edeyim, herhangi bir sınıfı use ederek direk kullanma mutlaka interface ile service container olarak tanımlamak gerekiyor. İleride ne olur ne olmaz belki enjektör gerekir belki başka birşey.

        Facades mantığı proxy bir web sunucusu gibi düşünebiliriz. Nginx önde proxy arkada ister apache koşar ister litespeed istersen nodejs serverin koşar. kendi yazdığımız bir interface için gereksiz, daha sonra değişebileceğini düşündüğümüz bir php fonksiyon kumkuması için gerekebilirliği şeklinde kullanılabilir. Örnek veriyorum bir mail fonksiyonu sonradan değişebilir bunun için facade kullanılabilir.

        @mgsmus Hocam anlamış mıyım? Ya nolur anlamış olayım. Hocam size bir yemek ısmarlayayım valla şu pandemik biterse.

          Leon

          class MyClass
          {
              public function doSomething()
              {
                  // ...
              }
          }

          Burada MyClass::doSomething() şeklinde kullanamazsınız çünkü doSomething durağan yani static bir yöntem değil. O yüzden MyClass sınıfını new kelimesi ile yüklemeniz gerekiyor. En kısa yapabileceğiniz (new MyClass)->doSomething(). Facade, MyClass::doSomething() şeklinde kullanmanızı sağlıyor, MyClassFacade::doSomething() gibi. Burada MyClassFacade, yüklenmiş MyClass sınıfının yerine geçiyor, vekil gibi davranıyor yani proxy gibi. MyClass içindeki public yöntemlerin static olarak kullanılmasına olanak sağlıyor.

          @mgsmus hocam anladım olayı teşekkür ederim. Sanırım diğerleri için bir şey yazmadığınıza göre anladığımı var sayarak koşmaya başlıyorum. Çok teşekkür ederim Hocam. Allah razı olsun, Allah tuttuğunuzu altın etsin.

            Leon Aklınızda olması gereken şu:

            Ben bir yerde new MyClass() kullanırsam, onu değiştirmenin tek yolu kodda refaktöre gidip değişiklik yapmak. Yani new MyClass() yazan yeri bulmak ve düzenlemek ya da direkt MyClass içerisini değiştirmek olur fakat Inversion of Control ilkesine göre hareket edip service container, binding, injection, facade gibi ilkeye ait özellikleri kullanırsam kodu ellemeden örneğin sadece bir AppServiceProvider içinden tüm uygulamadaki kullanımları değiştirebilirim.

            Bunu yaptığınızda amelelik yapmıyor oluyorsunuz ve işi framework'e yaptırmış oluyorsunuz. Buna Inversion of Control denir.

            @mgsmus Hocam, valla sayenizde mal gibi yazmayacağım, yoksa gelişi güzel herşeyi her yere yazacaktım, bir dünya şey öğrendim. Yemek borcum var hocam size ilk pandemik bittiğinde eğer müsait olursanız yemek ısmalamak isterim hocam hangi ildesiniz?

            Facade dediğin şey laravelin facade ise facade felan değil o.bir çeşit proxy gibi bir şey.
            Facade başka bir şeydir.Laravelin facade ine boyle dedigin zamanda taylor bey kızıyor 🙂 değil işte lan.container bağımlılıgında static yöntemle methodlara ulaştırma yontemi..Annotation yazmazsanız da beş kuruş faydası yok..Öyle yazana da ağzına kürekle vururum..Hic acımam 🙂

            app(ClassName) // kullanmayın abi boyle şeyleri.Nedir bu artist görüncem diye antipatternlik.
            Buna yazarsın bir facade ama annotation yazmak zorundasın.Boşuna eziyet.direkt (new classname) en güzelidir.Başka şeylere kafa yorun.