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

Merhabalar efendim, projemde setLocal() değiştirmek için bir dropmenu ekledim. setLocal işlemi tek seferde çalışıyor bununla ilgili araştırma yaptığımda; hep router üzerinden, /lang/{local} şeklinde seçim yapan bir arakatman oluşturuluyor. Benim yapmak istediğim şudur: URL'de yani rotasyonda bir parametre belirtmeden dili kullanıcıya göre değiştirmek istiyorum. Giriş yapmamış, misafir kullanıcı dil seçimi yapmadığında session'da bu local verisini tutsun eğer giriş yapmış bir kullanıcı ise UserDB de oluşturacağım sütunda bu local verisini tutsun.
/lang/{local} şeklinde olmasını istememe sebebim de hem url uzamasın hemde daha önceden hazırladığım rotasyon kalabalık olduğu için hepsinde bir değişiklik yapmak istemiyorum. Bu konu hakkında yardım edebilecek, yol gösterebilecek biri olursa çok mutlu olurum. Şimdiden teşekkürler 🙂

    mgsmus
    Dediğiniz gibi yaptım Session'da gayet güzel çalışıyor:

    web.php
    Route::get('/dil/{lang}','LocalSwitchController@index')->name('localChange');

    Controller

    public function index($lang) //rotadan gelen lang degerini aldik
        {
            if ($lang == 'en' or $lang=='tr' or $lang=='nl')
            {
                Session::put('lang', $lang);
                return redirect()->back();
            }else
            {
                return redirect()->back();
            }
        }

    View
    <a class="dropdown-item" href="{{ route('localChange',['lang'=>'tr'] )}}">

    Ve son olarak oluşturduğum: (Karnel içinde web middlewareGroups içine ekledim.)

    middleware

    public function handle($request, Closure $next)
        {
    
            if(Session::has('lang'))
            {
                app()->setLocale(Session::get('lang'));
            }
            return $next($request);
        }

    mgsmus
    Aklımda User tablosuna lang sütunu ekleyip session değerini oraya yazdırmak vardı fakat araştırma yaparken şöyle birşeye rastladım:
    php artisan session:table
    Session veri tabanı oluşturuyormuş, sizce hangi yöntemi kullanmalıyım? Dediğim gibi bir sütun ekleyip işi bitireyim mi yoksa bu yapıyla mı çalışmalıyım? Bilemedim. 😃

      FahriMeral

      php artisan session:table
      Bu ayrı bir şey. Oturumun Redis, dosya ya da veritabanında tutulmasını seçerken veritabanında tutulması seçerseniz bunu yaparak oturumun tutulacağı tabloyu oluşturmanız için gerekli komut bu.

      User tablosuna kullanıcının dilini tutmak mantıklı. Genellikle de oturum dilinden üstün olur, o varsa oturum dilini ezer. Middleware içerisinde $request->user() şeklinde aktif kullanıcıya ulaşabilirsiniz ve şöyle bir şey yapabilirsiniz:

      public function handle($request, Closure $next)
      {
          $locale = app()->getLocale();
      
          if($request->session()->has('locale')) {
              $locale = $request->session()->get('locale');
          }
      
          // Burada giriş yapılmış ve giriş yapan kullanıcı kendisine dil tanımlamış ise onu seçtiği
          // dil öncelikli olduğundan oturumdan geleni eziyoruz.
          if(auth()->check() && $request->user()->locale) {
              $locale = $request->user()->locale;
          }
      
          app()->setLocale($locale);
      
          return $next($request);
      }

        mgsmus dil öncelikli olduğundan oturumdan geleni eziyoruz.

        Bu kısım çok mantıklı olmuş, if ile var mı yok mu? eğer varsa gitsin yoksa sessiona baksın falan yapmayı düşünüyordum. Ezme; işlemi çok pratikleştirmiş, bence güzel bi trick 😅

          FahriMeral config/app.php içerisinde, locale anahtarının altına locales şeklinde bir anahtar daha ekleyin:

          'locales' => ['tr', 'en', 'nl'],

          if ($lang == 'en' or $lang=='tr' or $lang=='nl') yapmak yerine if(in_array($locale, config('app.locales'))) yapın.

          Hatta app/Services/LocaleManager.php dosyası oluşturun:

          <?php
          
          namespace App\Services;
          
          class LocaleManager
          {
              public function resolve($locale): string
              {
                  if(in_array($locale, config('app.locales'))) {
                      return $locale;
                  }
          
                  return app()->getLocale();
              }
          
              public function set($locale): void
              {
                  $locale = $this->resolve($locale);
                  
                  app()->setLocale($locale);
              }
          
              public function keep($locale): void
              {
                  session([
                      'locale' => $this->resolve($locale)
                  ]);
              }
          }

          Şöyle kullanın:

          public $localeManager;
          
          public function __construct(LocaleManager $localeManager)
          {
              $this->localeManager = $localeManager;
          }
          
          public function index($locale)
          {
              $this->localeManager->keep($locale);
          
              return redirect()->back();
          }

          Artık yavaş yavaş vanilla PHP yazmayı bırakmanız lazım.

            mgsmus app/Services/LocaleManager.php

            Bunun amacını anlayamadım çok çalışmam lazım daha😅
            Spatie paketiyle kullandığım için text içindeki lang baslıklarını dizi olarak döndürüp yazdırmayı da düşünüyorum, onun için bir tane id=1 olan veriyi referans verisi yapıp onun text içindeki lang ları döndürüp if() içine almayı düşünüyorum aynı şekilde view'de de menüyü ona entegre edersek, referansa yeni bir dil eklediğimizde sistem otomatikleşecek diye düşünüyorum 😃

            mgsmus Kodu inceledim controller'da yaptıgımız işi aslında bu LocalManager kodları ile yapıyoruz. Peki bunu controllardan hariç burda yapmamızın artısı nedir daha derli olduğu için mi böyle düşündünüz acaba?

              FahriMeral Benzer işlemleri yapmanız gerekirse if...else... yazmadan direkt LocaleManager ile halledersiniz. Şimdilik böyle düşünün.