Merhabalar,Laravel de curl icin thread mantigi varmidir.Bi ürün karşılaştirma sitesi yapmak isiyorum.Yapilan urun ismine gore ayni anda belirledigim sitelerden verileri getirmesi lazim.
yoksa belirledigim her site icin ayri bir bot mu yapmam lazim.
Merhabalar,Laravel de curl icin thread mantigi varmidir.Bi ürün karşılaştirma sitesi yapmak isiyorum.Yapilan urun ismine gore ayni anda belirledigim sitelerden verileri getirmesi lazim.
yoksa belirledigim her site icin ayri bir bot mu yapmam lazim.
Merhaba; her site için ayrı bot yazmanız gerekiyor. Bot dolaştırma işlemlerinin eşzamanlı çalışması için de kuyruklama mantığına bakabilirsiniz Laravel tarafında: https://laravel.com/docs/8.x/queues
Ancak bu asenkron bir çalışma gerektirir. Yani; kullanıcı siteye girsin, bir şey aratsın, siz o esnada arkada bütün sitelere gidin, toplayın, getirin, karşılaştırın, kullanıcı için çıktıyı üretin, yanıtı kullanıcıya gönderin şeklindeki bir akış mantıklı olmaz.
Genelde şöyle yapılır; yazdığınız botlar, bir servis üzerinde sürekli olarak çalışarak veri okuyacağınız sistemler üzerinde dolaşır, veriyi oralardan alıp sizin doğrudan erişebileceğiniz bir yerde toplar. Kullanıcınızdan talep geldiğinde siz bu talebe göre doğrudan yanıt döndürürsünüz çünkü veriler zaten elinizde vardır. Tam senkron olmasa da doğru ve hızlı çalışmaya en yakın yaklaşım budur. Ne kadar fazla iş gücünüz varsa kuyruğunuz o kadar sık baştan baştan dolaşılır. Orada da veri kıyaslamadaki yetenekler devreye giriyor. Son kullanıcıya “bu ürüne dair son verileri şu tarih şu saatte aldım he” diye bir uyarı da gösterdiğinizde büyük oranda çözülüyor.
Böyle işler yaptık, danışmanlığını verdik, bot hizmetleri sağladık. Sektörde de böyle dönüyor yani işler. Bu yönden deneyebilirsiniz
Gayet açıklayıcı olmuş.Mantığı oturdu şimdi teşekkürler
Merhaba Hocam,
Bu olayın biraz daha basitini sorayım size.
source_sites
isimli bir tablom var ve ben buraya wordpress woocommerce websitelerimi bağlıyorum tablo yapısı şöyle olsun
id - site_url - api_version - consumer_key - consumer_secret
kaynak : laravel-woocommerce/WooCommerceApi.php at master · Codexshaper/laravel-woocommerce · GitHub
şu durumda benim SourceSite
diye bir Modelim var. ben şunu yapmak istiyorum
siteadi.com/admin/sources/1/orders şeklinde girdiğimde hedef websitemdeki siparişleri görmek istiyorum.
Şu durumda modelimin içinde şöyle bir method oluştursam ve controller içinde
$sourcemodel = model::find($id);
$sourceClient = $sourceModel->getWCClient();
şeklinde ulaşıp curl istekleri yapmam Laravel için aykırı bir olay mı?
Model Methodu
public function getWCClient(){
return new Client(
$this->site_url,
$this->consumer_key’,
$this->consumer_secret’,
[
‘version’ => ‘wc/’.$this->api_version,
‘timeout’ => config(‘woocommerce.timeout’),
]
);
}
Ayrıca kaynak gösterdiğim paket service provider kısmında singleton
kullanıyor. onlarca farklı paket gördüm hepsi hemen hemen singleton. ve hepsi .env dosyasında belirlenen config değerlerini alıyor. dinamik parametreler verildiğini hiç görmedim
$this->app->singleton(‘WooCommerceApi’, function () {
return new WooCommerceApi();
});
şu yazıyı 20 dk sürdü yazdım umarım anlatabilmişimdir .
Merhaba Resul, hoşgeldin foruma
Dediğin şey kesinlikle çalışır, bunun için de gerekli yapıyı kendin kurmanı öneririm. Yani Laravel tarafındaki Model üzerinden oluşturduğun örnekler üzerinden “şimdi bunun kaydını ver” diyorsun ya mesela, sonra o kayıt üzerinden bir Client alıp o Client ile de işlemler yapmak istiyorsun. Müthiş mantık.
Gönderdiğin örnek pakete baktım, zaten Laravel içindeki .env->config ayarları okuyup sonra bir Client başlatıyor, o Client da aslında automattic/woocommerce diye bir paketten aslında WooCommerce’in kendi clientını getiriyor: automattic/woocommerce - Packagist
Haliyle gerekli girdileri verdiğinde bu Clientı döndürecek bir method yazabilirsin içeriye. Hatta ben olsam şöyle yapardım. SourceSite
diye bir model var ya elimde, onun üstüne direkt WooCommerce’ten okumak istediğim işlemler için metodlar yazardım.
Örnek;
$site = SourceSite::find(5);
$site->orders();
böyle yaptığımda bana WooCommerce üstünden dönecek siparişleri gösterecek bir yapı kurardım. Bunu nasıl yapabilirim?
public function orders()
{
return collect($this->getClient()->get('orders'));
}
burada ilgili objenin kendi Client’ını isteyip onun üzerinden get('orders')
çalıştırıp gelen yanıtı da collect(...)
ile collection’a çevirdim ki kullanırken kolaylık olsun
Peki bu getClient kısmı nasıl olacak?
public function getClient()
{
if(is_null($this->wooClient)) {
$this->wooClient = new \Automattic\WooCommerce\Client(
$this->site_url,
$this->consumer_key,
$this->consumer_secret,
[
'version' => $this->api_version,
]
);
}
return $this->wooClient;
}
Tabii modelin içinde tepeye bir tane şunu eklemek lazım;
protected $wooClient;
Yani mantığı açıklayabilmek için aklımdakileri yazdım ama işine yarayacaktır diye düşünüyorum. Direkt böyle olmasa da benzer bir yapıyla kurabilirsin
Hoşbuldum hocam
Gerçekten ufkumu açtın. Sadece bu mantık iyi mi kötü mü düşünerek projeyi iptal etmiştim. artık bitirebilirim
forum çok güzel olmuş yakında laravel sail ile ilgili çok sorum olacak