Laravel เปลี่ยนเส้นทางกลับไปที่หน้าเดียวกันหลังจากเปลี่ยนภาษา

วิธีที่ฉันใช้งาน multilang คือผ่านมิดเดิลแวร์และเส้นทาง

Middleware Localization.php มีลักษณะดังนี้:

public function handle(Request $request, Closure $next)
{
    $locale = $request->segment(1); 


    if(empty($locale)) { 
        return redirect()->to('/' . app()->getLocale());
    }

    if(in_array($locale, ['en','it'])) {
        App::setLocale($locale);
        $request->except(0); 
    }

    return $next($request);
}

และใน web.php ของฉันฉันมี:

Route::get('locale/{locale}', function ($locale){

  \Session::put('locale', $locale);
  $path = Route::getCurrentRoute()->getPath();

  return redirect($path);

})->name('langroute');

ในเบลดฉันใช้มันแบบนี้:

<a class="dropdown-item" href="{{ url('/en') }}">

ฉันจะเปลี่ยนเส้นทางกลับไปยังหน้าเดิมได้อย่างไรหลังจากเปลี่ยนเป็นภาษาอื่นแล้ว


person Marinario Agalliu    schedule 11.01.2021    source แหล่งที่มา
comment
โอเค ถ้ามันใช้งานไม่ได้สำหรับคุณ ลองดูคอนโทรลเลอร์นี้สิ มันใช้งานได้ github.com/akaunting/ภาษา/blob/master/src/ ผู้ควบคุม/   -  person Taha Paksu    schedule 11.01.2021
comment
นั่นเป็นแพ็คเกจและการนำไปใช้งานแตกต่างไปจากเดิมอย่างสิ้นเชิง ดังนั้นฉันจึงไม่สามารถแก้ไขปัญหาด้วยวิธีคอนโทรลเลอร์ของเขาได้... ตามที่ฉันระบุ ฉันใช้เฉพาะมิดเดิลแวร์และเส้นทางสำหรับการนำหลายภาษาไปใช้...   -  person Marinario Agalliu    schedule 12.01.2021
comment
โดยได้รับ URL ก่อนหน้าจากสองแหล่ง แหล่งหนึ่งมาจาก globals และอีกแหล่งหนึ่งจากคุกกี้ คุณยังสามารถใช้ทั้งสองวิธีเพื่อรับ URL ก่อนหน้าได้   -  person Taha Paksu    schedule 12.01.2021
comment
วิธีเปลี่ยนเส้นทางของฉันคือผ่าน href ฉันได้ลองด้วย {{route(Route::currentRouteName(), 'en') }} แล้ว แต่มันทำให้ฉันมีข้อผิดพลาดกับพารามิเตอร์บนเส้นทางเพจที่ต้องใช้พารามิเตอร์   -  person Marinario Agalliu    schedule 12.01.2021
comment
มีแฟล็ก ->withInput() ซึ่งรวมถึงสตริงการสืบค้นก่อนหน้า บางทีมันอาจจะช่วยได้   -  person Taha Paksu    schedule 12.01.2021
comment
ใช่ แต่นี่ไม่ใช่กรณีที่ฉันคิดว่า   -  person Marinario Agalliu    schedule 12.01.2021
comment
ยังไงก็ขอบคุณครับพี่   -  person Marinario Agalliu    schedule 12.01.2021


คำตอบ (1)


ฉันหวังว่าคำตอบนี้จะช่วยใครซักคนได้เพราะฉันรู้ว่าหลายคนต้องดิ้นรนกับเรื่องนี้ เครดิตไปที่ @khaledw62 ที่ตอบฉันใน laracasts: ลิงก์ที่นี่

ฉันกำลังเขียนคำตอบที่นี่เพื่อ

1- คุณสามารถจัดการมันบนเบลดได้ดังนี้:

 @php
    $thisUrl = url()->current().'/';
    if (app()->getlocale() == 'en') {
        $newUrl  = str_replace('/en/', '/it/', $thisUrl);
    }else{
        $newUrl  = str_replace('/it/', '/en/', $thisUrl);
    }
 @endphp

และคุณสามารถเปลี่ยนเส้นทางไปที่ $newYrl ได้ดังนี้:

<a class="dropdown-item" href="{{ $newUrl }}">

2- อีกวิธีหนึ่งคือการแบ่งปันตัวแปรส่วนกลางให้กับมุมมองทั้งหมดของคุณดังต่อไปนี้ใน AppServiceProvider ของคุณ:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    //
}

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $thisUrl = url()->current().'/';
    if (app()->getlocale() == 'en') {
        $newUrl  = str_replace('/en/', '/it/', $thisUrl);
    }else{
        $newUrl  = str_replace('/it/', '/en/', $thisUrl);
    }
    View::share('newUrl', $newUrl);
}
}

และคุณสามารถเปลี่ยนเส้นทางในเบลดได้เหมือนเมื่อก่อน:

<a class="dropdown-item" href="{{ $newUrl }}">

ขอให้มีความสุขในการเขียนโค้ด!

person Marinario Agalliu    schedule 13.01.2021