>  기사  >  백엔드 개발  >  자동 로드된 번역을 사용하여 Laravel에서 다형성 번역 가능 모델 구축

자동 로드된 번역을 사용하여 Laravel에서 다형성 번역 가능 모델 구축

WBOY
WBOY원래의
2024-08-11 18:35:32867검색

Building a Polymorphic Translatable Model in Laravel with Autoloaded Translations

다국어 콘텐츠를 처리할 때 각 속성에 대한 개별 행보다 JSON 열에 번역을 저장하는 것이 더 효율적인 경우가 많습니다. 이 접근 방식은 번역을 단일 열로 통합하여 데이터 관리 및 검색을 단순화합니다.

번역 시스템 설정

번역 저장에 JSON 열을 사용하도록 번역 모델과 테이블을 향상하겠습니다. 여기에는 JSON 데이터를 처리하기 위해 테이블 ​​스키마를 업데이트하고 Translatable 특성을 수정하는 작업이 포함됩니다.

1단계: 번역 테이블 마이그레이션 생성

번역 테이블이 아직 존재하지 않는 경우 새 마이그레이션을 생성하세요.

php artisan make:migration create_translations_table

2단계: 테이블 구조 정의

데이터베이스/마이그레이션에서 생성된 마이그레이션 파일을 엽니다. 새 테이블의 경우 다음과 같이 정의합니다.

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTranslationsTable extends Migration
{
    public function up()
    {
        Schema::create('translations', function (Blueprint $table) {
            $table->id();
            $table->string('locale'); // Stores the locale, e.g., 'en', 'fr'
            $table->string('translatable_type'); // Stores the related model type, e.g., 'Post', 'Product'
            $table->unsignedBigInteger('translatable_id'); // Stores the ID of the related model
            $table->json('translations'); // Stores all translations as a JSON object
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('translations');
    }
}

3단계: 마이그레이션 실행
데이터베이스에 마이그레이션을 적용합니다.

php artisan migrate

4단계: 번역 모델 생성

다음으로 다형성 관계를 처리하는 번역 모델을 만듭니다.

php artisan make:model Translation

번역 모델에서 다형성 관계를 정의합니다.

class Translation extends Model
{
    protected $fillable = ['locale', 'translatable_type', 'translatable_id', 'translations'];

    protected $casts = [
        'translations' => 'array',
    ];

    public function translatable()
    {
        return $this->morphTo();
    }
}

JSON 저장소로 번역 가능한 특성 구현

여러 모델에서 번역 처리를 재사용할 수 있도록 하기 위해 사용자가 선택한 로케일에 따라 번역된 콘텐츠를 자동으로 로드하는 Translatable 특성을 생성합니다. 또한 선택한 로캘에 대해 번역이 제공되지 않는 경우 기본 로캘에서 콘텐츠를 로드하는 대체 메커니즘을 추가할 예정입니다.

1단계: JSON 처리로 번역 가능한 특성 생성

namespace App\Traits;

use App\Models\Translation;
use Illuminate\Support\Facades\App;

trait Translatable
{
    public static function bootTranslatable()
    {
        static::retrieved(function ($model) {
            $model->loadTranslations();
        });
    }

    public function translations()
    {
        return $this->morphMany(Translation::class, 'translatable');
    }

    public function loadTranslations()
    {
        $locale = App::getLocale();
        $defaultLocale = config('app.default_locale', 'en'); // Fallback to the default locale

        // Try to load translations for the current locale
        $translation = $this->translations()->where('locale', $locale)->first();

        if (!$translation && $locale !== $defaultLocale) {
            // If no translations are found for the current locale, fallback to the default locale
            $translation = $this->translations()->where('locale', $defaultLocale)->first();
        }

        if ($translation) {
            $translations = $translation->translations;
            foreach ($translations as $key => $value) {
                $this->{$key} = $value;
            }
        }
    }

    public function addTranslations(array $translations, $locale = null)
    {
        $locale = $locale ?? App::getLocale();
        return $this->translations()->updateOrCreate(
            ['locale' => $locale],
            ['translations' => $translations]
        );
    }
}

2단계: 번역 가능한 특성을 모델에 적용
번역 지원이 필요한 모든 모델에 Translatable 특성을 추가하세요.

namespace App\Models;

use App\Traits\Translatable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use Translatable;

    protected $fillable = ['title', 'content'];
}

예: 변환된 모델 생성

번역을 JSON 개체로 추가:

$post = Post::create(['title' => 'Default Title', 'content' => 'Default Content']);

// Adding translations
$post->addTranslations([
    'title' => 'Hello World',
    'content' => 'Welcome to our website'
], 'en');

$post->addTranslations([
    'title' => 'Bonjour le monde',
    'content' => 'Bienvenue sur notre site Web'
], 'fr');

번역된 모델 검색

Post 모델을 검색하면 현재 로캘을 기반으로 번역된 콘텐츠가 자동으로 로드되거나 필요한 경우 기본 로캘로 대체됩니다.

App::setLocale('fr');
$post = Post::find(1);
echo $post->title; // Displays "Bonjour le monde" if French translation exists

App::setLocale('es');
$post = Post::find(1);
echo $post->title; // Displays "Hello World" as it falls back to the English translation

뷰에 번역된 콘텐츠 표시

블레이드 보기에서는 다른 모델 속성과 마찬가지로 번역된 콘텐츠를 표시할 수 있습니다.

<h1>{{ $post->title }}</h1>
<p>{{ $post->content }}</p>

결론

JSON 열을 사용하여 번역을 저장하고 대체 메커니즘을 구현하면 Laravel 애플리케이션에서 다국어 콘텐츠 관리가 간소화됩니다. 이 접근 방식은 번역을 단일 열로 통합하여 데이터 처리를 단순화하고 코드베이스를 보다 쉽게 ​​유지 관리할 수 있도록 합니다. 블로그, 전자 상거래 사이트 또는 다국어 애플리케이션을 구축하는 경우 이 방법을 사용하면 원활하고 효율적인 사용자 경험을 보장할 수 있습니다.

즐기세요!

위 내용은 자동 로드된 번역을 사용하여 Laravel에서 다형성 번역 가능 모델 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.