Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

SOLID prensibine göre yürüdüğümüzde kullanıcı kaydı kısmında adım adım nasıl olmalı?

  1. Validate işlemleri için bir FormRequest yaptık ve inputlarımızı burada validate ettik.
  2. UserRepostroyInterface yaptık bunun üzerindende kullanıcı oluşturma işlemimizi yaptık.
    Bu durumda controller üzerindeki görüntü aşağıdaki gibi olacak, E-posta gönderim ve SMS doğrulama yapacaksam yine bu controller üzerinde mi yapmalıyım? Yoksa farklı bir yöntem var mı?
        public function register(UserRegisterRequest $request, UserRepostoryInterface $userRepostory){
            $request->flash();
            $ko = $userRepostory->create($request);
            
            return redirect()->route('kullanici.profil')
                    ->with('m', __('Başarıyla kayıt işleminiz tamamlandı.'))
                    ->with('m_type', 'success');
                    
            }
    Yada şu şekilde mi yapmalıyım?
        public function register(UserRegisterRequest $request, UserRepostoryInterface $userRepostory){
            $request->flash();
            $ko = $userRepostory->create($request);
            if(config('usersmscheck' == 1)){
                SMSGonder::gonder($ko->gsm);
            }
            if(config('epostacheck' == 1)){
                EpostaGonder::gonder($ko->email);
            }
            return redirect()->route('kullanici.profil')
            ->with('m', )
            ->with('m_type', 'success');
               
        }
  • Leon

    1. Event kuyrukta işlem yapıyorsa hataları loglayarak alabilirsiniz. Kuyrukta yapmıyorsa ateşlediğiniz yerde hata verir.
    2. Constructor içinde enjekte ederseniz sınıfın diğer tüm yöntemlerinde tekrar enjekte etmeden kullanabilirsiniz.

Ben olsam ( Event/Listener veya Observer ) ve notification kullanarak sms veya mail gönderimi yapardım.

  • Leon

      Seviye 31
    • Düzenlendi

    @coder2 Hocam hiç birisini bilmiyorum eposta için bir template sistemi yaptım şablonları veritabanında tutuyorum model dosyamın içindende parse ediyorum gönderimide bir interface yaptım onunla yapıyorum ve veritabanına yine bu interface içerisinden logluyorum bu söylediklerinize bakayım ama event dediğiniz bir hook gibi bir şey mi?

      Leon https://laravel.com/docs/8.x/events

      Event ile belirttiğimiz bir olay tetiklendiğinde onu yakalayarak ne veya neler yapılacağını belirliyoruz. Dökümantasyondan ilerlerseniz daha anlaşılır olacaktır.

      • Leon

          Seviye 31
        • Düzenlendi

        Hocam tekrar merhabalar, Event konusuna baktım ve uyguladım, sormak istediğim

        event(new UserRegisteredEvent($user));

        Şeklinde Controller içerisinde kayıt işleminden sonra eklediğim kodda SMS ve E-posta gönderimini yapan sınıflarımı çalıştırmış oldu. Peki bu sınıflardan birisi içerisinde hata alırsam bu hata mesajını nasıl alıp ekrana basabilirim?

        Bir de aklıma takılan sürekli sormak istediğim bir konu var bir arayüzü service provider üzerinde bind ettiğimizde bunu aşağıdaki gibi çağırmak mı doğru

           protected $GondericiContract;
        
            public function __construct(GondericiContract $GondericiContract)
            {
                $this->GondericiContract = $GondericiContract;
            }

        Yoksa controller içerisinde sadece bu arayüzün kullanıldığı metoda mı tanımlanmalı?

        public function gonder(Request $request, GondericiContract $GondericiContract) : string {
            //.....
        }

          Leon

          1. Event kuyrukta işlem yapıyorsa hataları loglayarak alabilirsiniz. Kuyrukta yapmıyorsa ateşlediğiniz yerde hata verir.
          2. Constructor içinde enjekte ederseniz sınıfın diğer tüm yöntemlerinde tekrar enjekte etmeden kullanabilirsiniz.
          • Leon bunu yanıtladı.
            • Leon

                Seviye 31
              • Düzenlendi

              @mgsmus Hocam aslında soruyu soramadığımı fark ettim. Constructor içerisine enjekte ettiğimizde bu Controller her çağırıldığında bu enjekte oluyor. Bu performansı etkiler mi? Yoksa biz bunu sadece Controller içerisinde kullanacağımız örnek veriyorum tek bir metod var ise o zaman sadece o tek metodamı enjekte etmeliyiz.

              1. Kuyruğa eklediğimiz bir iş nasıl çalışıyor kendi kendine mi?

              2. php artisan queue:work komutu ile mi çalıştırmak gerekiyor?

              3. Bu komutu SSH üzerinde mi yürütmek gerekiyor?

              4. Eğer öyle ise dakikada bir çalışacak ssh cronu eklemek yeterli olur mu? * * * * * cd /public_html && php artisan queue:work --stop-when-empty >> /dev/null 2>&1

              5. Eğer hiç birisi ise bir route oluşturup örnek www.mahmut.com/cron_kuyruk bu sayfayı cron ile ziyaret etsem ve içerisinde tanımlayacağım kuyruk çalıştırma fonksiyonu tetiklense?

              Bu arada @coder2 @sineld @mgsmus gerçekten çok teşekkür ederim.

                • Leon

                    Seviye 31
                  • Düzenlendi

                  mgsmus Event kuyrukta işlem yapıyorsa hataları loglayarak alabilirsiniz. Kuyrukta yapmıyorsa ateşlediğiniz yerde hata verir.

                  Hocam örneğin bir eventım var ama bu event ile çalışan ikitane listenerim var. Eventı ateşiledim

                  $sonuc = event(new UserRegisteredEvent($user));

                  birinci listener çalıştı sorun var ikinci listener çalışıyor mu yada çalışıyor ise ikisininde farklı bir hatayı nasıl alabiliyorum. Yoksa tek bir listener içerisinde aşağıdaki gibi mi olmalı?

                      public function handle(KullaniciKayitOldu $event,  SmsGateWay $sms, EpostaGateWay $eposta)
                      {
                          $errors = [];
                          $mesajim = [];
                          if(config('ayar.dogrulama.durum.deger') == 1){
                              if(config('ayar.dogrulama.d_sms.deger') == 1){
                  
                                  $sms_sonuc = $sms->kullanici($event->kullanici)->sablon('kullanici-dogrulama')->gonder();
                                  if($sms_sonuc->durum){
                                      $mesajim[] = ['m' => $sms_sonuc->m,'m_type' => $sms_sonuc->m_type];
                                  }else{
                                      $errors[] = [$sms_sonuc->m];
                                  }
                              }
                              if(config('ayar.dogrulama.d_smtp.deger') == 1){
                                  $eposta_sonuc = $eposta->kullanici($event->kullanici)->sablon('kullanici-dogrulama')->gonder();
                                  if($eposta_sonuc->durum){
                                      $mesajim[] = ['m' => $eposta_sonuc->m,'m_type' => $eposta_sonuc->m_type];
                                  }else{
                                      $errors[] = [$eposta_sonuc->m];
                                  }
                              }
                                  
                              return [$mesajim, $errors];
                      }

                  Hocam birde forumda en iyi cevap seçeneğini seçtim diyelim, kaldırıyorum sayfayı yeniden ziyaret ettiğimde en iyi cevap seçeneğinin kalkmadığını görüyorum.

                    Leon Hocam birde forumda en iyi cevap seçeneğini seçtim diyelim, kaldırıyorum sayfayı yeniden ziyaret ettiğimde en iyi cevap seçeneğinin kalkmadığını görüyorum.

                    Kaldırdım.

                    • Leon bunu yanıtladı.

                      Leon

                      1. Maalesef kendi kendine hiçbir şey olmuyor. Queue work komutunu çalıştırarak worker e işi yaptırıyoruz. Worker in devamlı çalışması veya tanımladığınız şekilde çalışmasıiçin supervisor u araştırabilirsiniz.
                      2. Evet.
                      3. Evet
                      4. Cron ekleyerek yapılmaz bu işlem. Zaten Laravel in içinde schedule var ama bu farklı bir olay. Worker - ler oluşturup işleri onlara yaptırıyoruz.
                      5. Bence bu yolu hiç düşünmeyin, en azından Laravel de.

                      @coder2 Hocam, teşekkür ederim bilgiler için ve bu bilgilerden yola çıkarak supervisor tarafı shared hosting için olabilitesi yok. bir .sh script ile aynı mantık kolayca oluşturulabilir. Fakat biraz araştırınca https://laravel.com/docs/8.x/scheduling#running-the-scheduler şuradaki shared hosting tarafında işimi görür mü?

                      App\Console\Kernel.php

                      <?php
                      
                      namespace App\Console;
                      
                      use Illuminate\Console\Scheduling\Schedule;
                      use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
                      
                      class Kernel extends ConsoleKernel
                      {
                          /**
                           * The Artisan commands provided by your application.
                           *
                           * @var array
                           */
                          protected $commands = [
                              //
                          ];
                      
                          /**
                           * Define the application's command schedule.
                           *
                           * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
                           * @return void
                           */
                          protected function schedule(Schedule $schedule)
                          {
                              $schedule->command('queue:work')
                              ->cron('* * * * * *')
                              ->withoutOverlapping();
                          }
                      }

                      sineld Kaldırdım.

                      Kendiliğinde geri gelmiş hocam sanırım bir bug var.

                      Evet, kararlı sürümün gelmesini bekliyorum yükseltme için.

                      Çok soru soruyorum ama bir event içerisinde iki tane listenerim var birisi implements ShouldQueue ile kuyruğa gönderiyor diğer listener ise direk çalışması gerekiyor. Fakat kuyruğa giden gidiyor diğer listener ise çalışmıyor. ikisinide kuyruğa gidecek şekilde ayarlarsam ikiside çalışıyor. Neden çalışmaz başka bir şey mi yapmak gerekiyor? Nereyi atlıyor olabilirim?