CakePHP 3.x - Mendapatkan field database tergantung pada pengaturan Lokal

Saya harus mengembangkan situs web multi bahasa. Ini memiliki lebih dari 4 bahasa sekaligus yang digunakan dalam database. Skemanya selalu berikut: field_%lang%

mantan. identitas | judul_en | judul_de | deskripsi_en | deskripsi_de

Karena ini cukup sederhana, saya berpikir untuk menulis fungsi yang dapat saya gunakan di pengontrol dan tampilan (Entitas global?) untuk menjaga kode saya KERING.

//function
public function __($field, $language = null){

    if( $language === null ){

        list( $language ) = split('_', I18n::Locale());

    }

    $newField = $field . '_' . strtolower( $language );

    if( $this->has( $newField ) ){
        return $this->{ $newField };
    }else{
        throw new NotFoundException('Could not find "' . $newField . '" field');
    }

}

//usage
$result->__('title'); //returns title_en depending on Locale
$result->__('title', 'de'); //always returns title_de

Masalahnya adalah saya tidak tahu di mana menerapkannya tanpa konvensi pengereman. Saya sedang memikirkan tentang Entitas tetapi setahu saya tidak ada Entitas "global" yang berfungsi untuk semua model?

Semua ide dan saran dipersilakan!

Mike


person Mike    schedule 09.07.2015    source sumber
comment
Mengapa tidak menempatkan ini dalam semacam superclass dari seluruh entitas Anda? Saya tidak mengerti mengapa hal itu melanggar konvensi.   -  person Holt    schedule 09.07.2015
comment
Ya, tapi apakah ada superclass dari semua entitas? Di mana?   -  person Mike    schedule 09.07.2015


Jawaban (1)


\Cake\ORM\Entity adalah kelas dasar dari semua entitas Anda, Anda tidak akan memodifikasi kelas CakePHP bawaan tetapi tidak ada yang menghalangi Anda untuk membuat superkelas Anda sendiri.

Sebut saja AppEntity, cukup buat file AppEntity.php di bawah src/Model/Entity dan masukkan kode Anda ke dalamnya:

<?php

namespace App\Model\Entity;
use Cake\I18n\I18n;
use Cake\Network\Exception\NotFoundException;

class AppEntity extends \Cake\ORM\Entity {

    public function __($field, $language = null){

        if( $language === null ){

            list( $language ) = split('_', I18n::Locale());

        }

        $newField = $field . '_' . strtolower( $language );

        if( $this->has( $newField ) ){
            return $this->{ $newField };
        }else{
            throw new NotFoundException('Could not find "' . $newField . '" field');
        }

    }

}

Lalu, saat Anda membuat kelas entitas, alih-alih memperluas \Cake\ORM\Entity, Anda memperluas AppEntity:

<?php

namespace App\Model\Entity;

class User extends AppEntity {

} ;

?>
person Holt    schedule 09.07.2015