경로에서 현지화를 무시하는 Livewire를 수정하는 방법

5585 단어 laravellivewire
최근에 다른 로케일이 필요한 TALL 스택을 사용하여 Laravel 웹 사이트에서 작업하고 있습니다. 이러한 로케일은 다음과 같은 다양한 URL에 따라 다릅니다.
  • en-gb (영국/국제)
  • en-au (호주)
  • en-us (미국)

  • 프로젝트는 구성 파일sites.php을 사용하여 번역 파일에서 관리할 수 없는 각 사이트의 데이터를 관리합니다. 이 데이터는 사용자 정의 파사드를 통해 액세스할 수 있습니다.

    LocaleSettings::get('default_currency');
    


    후드 아래에서 이것은 다음을 수행합니다.

    return config('sites')[app()->getLocale()][$key];
    


    이러한 각 로케일에는 서로 다른 통화가 있습니다.


    노선
    통화
    기본


    en-gb
    GBP, USD, ZAR, 유로
    GBP

    en-au
    호주 달러
    호주달러

    en-us
    미국 달러, 영국 파운드
    미화


    통화 또는 로캘이 변경되면 해당 통화에 대한 올바른 가격을 표시하도록 페이지의 카트 및 제품 구성 요소가 새로 고쳐집니다.

    이것은 Livewire를 통해 통화를 변경할 때 잘 작동합니다.

    그러나 로케일을 전환할 때 통화를 초기 로드 시 잘 작동하는 기본 통화로 설정하지만 Livewire가 구성 요소가 업데이트될 때 POST 요청을 수행할 때(예: 장바구니에 추가할 때) GBP의 대체 통화로 다시 재설정됩니다. .

    이것은 경로의 로케일이 변경되고 있기 때문입니다. 이는 Livewire가 서버에 POST 요청을 할 때 지역화된 경로를 사용하지 않기 때문에 발생합니다.

    이를 위해 다음 코드를 사용하여 LocalizationLivewire라는 새 미들웨어를 만들었습니다.

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    
    class LocalizationLivewire
    {
        public function handle(Request $request, Closure $next)
        {
            if ($request->route()->getName() === 'livewire.message') {
                app()->setLocale($request->request->get('fingerprint')['locale']);
    
                return $next($request);
            }
    
            return $next($request);
        }
    }
    


    그리고 이것을 Localization 의 내 Kernel.php 미들웨어 위에 추가했습니다.

    이 미들웨어는 구성 요소가 업데이트될 때 Livewire POST 요청에 대한 경로 이름인 경로 이름이 livewire.message인지 확인합니다.

    그런 다음 앱 로케일을 요청의 지문에 있는 로케일 값으로 설정합니다. 지문이 무엇인지 확실하지 않은 경우 다음은 Caleb Porzio의 블로그How Livewire Works (a deep dive)의 스니펫입니다.

    This is data associated with a component that makes it unique and provides essential non-changing information about it.



    "fingerprint": {
      "id": "44Njb4Yue0jBTzpzRlUf",
      "name": "counter",
      "locale": "en",
      "path": "",
      "method": "GET"
    },
    


    그리고 그것은 기본적으로 거기에서 예상대로 작동했습니다. 내 머리를 벽에 부딪힌 몇 시간 후 (그리고 나는 몇 시간을 의미합니다) 그런 쉬운 수정.

    좋은 웹페이지 즐겨찾기