Symfony ile harici RESTful API nasıl kullanılır?


10

Projelerimiz için çoğunlukla ön uç Symfony uygulamalarının arka uç RESTful API'leriyle etkileşime girdiği bir Microservice mimarisi inşa ediyoruz.

Sorun bu yaklaşım Symfony varlık yönetimini ağırlıklı olarak veritabanı ile Doktrine dayanarak kırmaktır. Symfony, çoğu zaman işi otomatikleştiren Doctrine ile varlıkları ele aldığında, API'lardan harici verilere erişmemiz gerektiğinde bu kolayca çoğaltılamaz.

Örneğin, bir Müşteri varlığıyla:

  • Doktrin kullanarak, sadece Müşteri sınıfımızı tanımlamamız gerekiyor ve artık müşterilerimizi oluşturmak, güncellemek, almak çok kolay
  • REST API yaklaşımını kullanarak istemcilere API aracılığıyla erişilebilir, ancak istemcinin nasıl oluşturulduğunu (POST), güncellendiğini (PUT), geri getirildiğini (GET) vb.

Unutulmamalıdır ki istemciler sadece ön uç uygulaması değil, özel API tarafından da çeşitli uygulamalar tarafından kullanılmaktadır.

API çağrıları karmaşıklığını gizleyen, tüm API verilerini yerel olarak içe aktarıp bunlara Doktrini yoluyla veya başka bir yolla erişen varlık benzeri yöntemlerle sınıflar oluşturmalı mıyız?


Seninle aynı gemideyim. OpenApi / Swagger spesifikasyonlarından oluşturulan istemcilerle harici API'leri kullanma. Tüketim 'yaşam döngüsü', crud operasyonları, parametreler ve filtre formu üretimi için en iyi uygulamaları merak ediyorum. Şu anda araştırmamı Symfony'a özgü olsun veya olmasın herhangi bir yaklaşımı içerecek şekilde genişletiyor.
upstream

Birkaç ay boyunca bu sorun üzerinde çalıştıktan ve bu soruya geri döndükten sonra, her iki cevap da benzer bir çözüm sunuyor: popi ile api çağrılarını soyutlamak. Diğer çözümler mevcut olsa da, bu şekilde kullandık. Benzer Webapp <> API iletişim bağlamında, soyutlama düzeyi Webapp API çağrılarını gizleme kullanarak iyi bir çözüm gibi görünüyor. Mikro hizmetlerin ve API liderliğindeki yaklaşımların artmasıyla, kuşkusuz ortak bir sorun gibi görünen şeyleri çözmek için ilgili en iyi uygulamalar ve araçlar ortaya çıkacaktır.
Pierre

Buraya benzer bir yaklaşım uygulandı. İş mantığı artık REST api veya çağıran bir cli komutu olup olmadığı umurumda olmayan bir 'eylem' katmanında bulunmaktadır. Alistair Cockburn'un altıgen tasarımı bizim durumumuzda harika bir başlangıç ​​noktasıydı: alistair.cockburn.us/Hexagonal+architecture
upstream

Yanıtlar:


2

Harici bir API (JSON) kullanan symfony tabanlı bir proje yaptım; yaptığım bağımsız bir istemci kitaplığı ("istemci kitaplığı" - bir yazılım parçası, besteci paketi), kendi varlık kümesi (POPO) oluşturmaktı; Symfony tarafından sağlanan arayüzleri kullanarak çerçeveye entegre olur (örneğin, sadece özel bir kullanıcı sağlayıcısı oluşturarak ).

İstemci, gelecekteki test yetenekleri için önemli olan "sahne arkası" adlı http aramaları yapar. Veri kaynağınızla iletişim kurma şeklinizi ortaya çıkarmak istemiyorsunuz ve ayrıca testlerinizin canlı API'ye güvenmesini istemiyorsunuz.

İstemci kitaplığı arabirimi (nasıl görünebileceği örneği):

class ApiClient {

   /**
    * @throws SomeApiException If credentials are invalid
    * @return ApiUser
    */
   public function authenticate($username, $password);

   /**
    * @return ApiUser
    */
   public function findUserByEmail($email);

   /**
    * @throws SomeApiException If email is invalid
    * @return void
    */
   public function changeUserEmail(User $user, $newEmail);
}

İstemci kitaplığı dahili olarak iletişim için Guzzle'ı ve sonuçları önbelleğe almak için Doktrin Önbellek bileşenini kullanır. Varlık nesneleri ve json arasındaki eşleme, bir kez yazıldığında - çok sık değişmeyen (ya da hiç olay) olmayan haritacılar tarafından yapıldı. Bu durumda JSON ve JSON otomatik dönüşüm için JMS Serializer kullanmanızı öneririm (JSON kullandığınızı varsayıyorum).

İyi bir önbellek mekanizması ve Redis gibi yerel depolamaya ihtiyacınız olacak. Her uygulama isteğinde api çağrıları yapmak sunucunuzu öldürecek ve uygulamanızı büyük ölçüde yavaşlatacaktır. Http önbelleklerinin nasıl çalıştığını anlamak çok önemlidir. API'nız önbellek başlıklarını kullanmıyorsa (veya belirsiz bir şekilde kullanıyorsa) değişiklikleri takip etmek çok zor ve kaynak tüketir.

Ayrıca bağlantı koparsa istemcinin nasıl davranması gerektiğini düşünmek isteyeceksiniz - istemci durmuş verileri kullanmalı mı? Uygulamanız ve API arasında bazı proxy sunucuları kullanmak iyi bir fikir olacaktır. Bu durumda proxy (Vernik gibi) isteklerinizi hızlandırabilir ve uygulamanızı yavaşlatmadan arka planda durmuş verileri yenileyebilir. Ayrıca bir API hatası durumunda web sitenizi çevrimiçi tutacaktır. Bu arada veri yazamayabilirsiniz, ancak kullanıcılarınız yine de önbelleğe alınmış verilere göz atabilir.

Ve Doktrinden bahsetmişken, bkz. " Enstrüman Kanunu ".


1

Doktrin bir veritabanı erişim katmanıdır. Bir veritabanına erişmek istemiyorsunuz, apis. Hala bir Varlık oluşturabilirsiniz, ancak daha sonra herhangi bir şeyi (popo) uygulamak için gerekli olmayan basit bir nesne olarak. Tüm CRUD yöntemlerini uygulayan bir Havuzu olmalıdır. Bu durumda, veritabanı yerine API'yi çağırır. Bunun için bir arayüz oluştururdum. Uygulamanızın kullanması için farklı hissetmek zorunda değildir, ancak bir mikro hizmetin yanıt veremeyeceği her yerde dikkate almanız gerekir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.