Şimdiden altın değerindeki bilgiler için teşekkür ederim.
Bir SMS hizmeti sistemi satacağımızı düşünün. Birden fazla paket var ve her paket farklı bir SMSGateway ile çalışıyor.
A paketi "jetgibisms"
B paketi "yurtdisisms"
Yukarıdaki gibi A paketi satın alındığında "jetgibisms" B paketi satın alındığında ise müşterimizin göndereceği SMSler "yurtdisisms" SMSGateway üzerinden gitsin istiyorum.
Şimdi ben burada service container yapısı ile mi yapmalıyım?
SmsGatewayContract isminde bir interface yaparım bu interface ise jetgibismsGateway ve yurtdisismsGateway classlarıma implements ederim.
app/Services/SmsGateway/SmsGatewayContract.php dosyasını aşağıdaki gibi oluşturdum:
<?php
namespace App\Services\SmsGateway;
interface SmsGatewayContract
{
public function gonder($telno);
}
app/Services/SmsGateway/JetGibiSms.php dosyasını aşağıdaki gibi oluşturdum:
<?php
namespace App\Services\SmsGateway;
use SoapClient;
class JetGibiSms implements SmsGatewayContract
{
public function gonder($telno)
{
//Kodlarım
}
}
app/Services/SmsGateway/YurtDisiSms.php dosyasını aşağıdaki gibi oluşturdum:
<?php
namespace App\Services\SmsGateway;
use SoapClient;
class YurtDisiSms implements SmsGatewayContract
{
public function gonder($telno)
{
//Kodlarım
}
}
Daha sonra bunları bağımlılıklarını karşılamak için bir Providers oluşturup register bölümünü de aşağıdaki gibi yaptım diyelim.
<?php
namespace App\Providers;
use App\Services\SmsGateway\JetGibiSms;
use App\Services\SmsGateway\YurtDisiSms;
use App\Services\SmsGateway\SmsGatewayContract;
use Illuminate\Support\ServiceProvider;
class SmsGatewayProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->singleton(SmsGatewayContract::class, function ($app){
//JETGIBISMS MODÜLÜ
if(config('ayar.sms.gonderen') == "jetsms") {
return new JetGibiSms(config('ayar.sms.jetgibisms'));
}
//YurtdisiSMS Modülü
if(config('ayar.sms.gonderen') == "yurtdisi") {
return new YurtDisiSms(config('ayar.sms.yurtdisisms'));
}
});
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
Ben bunu controller ile aşağıdaki gibi çağırsam?
public function gonder(Request $request,SmsGatewayContract $sms){
$urun = Urun::where('id', $kullanici->urun_id)->first();
config()->set('ayar.sms.gonderen',$urun->smsgatewayi);
$sms->gonder("05551111111");
}
Yoksa daha değişik bir şey yapıp aşağıdaki gibi class ile işimi görsem mi?
<?php
class sms{
public function olustur($sinif)
{
$sinif = $this->ClassAdi($sinif);
if (!class_exists($sinif)) {
throw new RuntimeException("'$sinif' isminde sınıf bulunamadi");
}
return new $sinif();
}
public static function ClassAdi($kisaadi)
{
if (0 === strpos($kisaadi, '\\')) {
return $kisaadi;
}
$kisaadi = str_replace('_', '\\', $kisaadi);
if (false === strpos($kisaadi, '\\')) {
$kisaadi .= '\\';
}
return '\\SMSKAPILARI\\'.$kisaadi.'Gateway';
}
}
$sms = sms::olustur($urun->smsgatewayi);
$sms->gonder(“05551111111″);
Bu yaptıklarım tamamen facia olabilir. Bilmediğim için mazur görün beni.