CakePHP 3.x - รับฟิลด์ฐานข้อมูลขึ้นอยู่กับการตั้งค่า Locale

ฉันต้องพัฒนาเว็บไซต์หลายภาษา มีมากกว่า 4 ภาษาที่ใช้ในฐานข้อมูลในเวลาเดียวกัน เป็นไปตามรูปแบบเสมอ: field_%lang%

อดีต. รหัส | title_en | title_de | description_th | คำอธิบาย_de

เนื่องจากมันค่อนข้างง่าย ฉันคิดว่าจะเขียนฟังก์ชันที่ฉันสามารถใช้ได้ทั้งในคอนโทรลเลอร์และมุมมอง (เอนทิตีส่วนกลาง?) เพื่อรักษาโค้ดของฉันให้แห้ง

//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

ประเด็นก็คือฉันไม่รู้ว่าจะนำไปปฏิบัติที่ไหนหากไม่มีแบบแผนการเบรก ฉันกำลังคิดถึงเอนทิตี แต่อย่างที่ฉันเข้าใจไม่มีเอนทิตี "สากล" ที่เหมาะกับทุกรุ่นใช่ไหม

ยินดีต้อนรับทุกความคิดและข้อเสนอแนะ!

ไมค์


comment
ทำไมไม่ใส่สิ่งนี้ลงในซูเปอร์คลาสบางประเภทในเอนทิตีทั้งหมดของคุณล่ะ? ฉันไม่เข้าใจว่าทำไมมันถึงทำลายแบบแผน   -  person Holt    schedule 09.07.2015
comment
ใช่ แต่มีซูเปอร์คลาสของเอนทิตีทั้งหมดบ้างไหม? ที่ไหน?   -  person Mike    schedule 09.07.2015


คำตอบ (1)


\Cake\ORM\Entity เป็นคลาสพื้นฐานของเอนทิตีทั้งหมดของคุณ คุณจะไม่แก้ไขคลาส CakePHP ในตัว แต่ไม่มีสิ่งใดขัดขวางไม่ให้คุณสร้างซูเปอร์คลาสของคุณเอง

เรียกมันว่า AppEntity กันดีกว่า เพียงสร้างไฟล์ AppEntity.php ใต้ src/Model/Entity แล้วใส่โค้ดของคุณเข้าไปข้างใน:

<?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');
        }

    }

}

จากนั้น เมื่อคุณสร้างคลาสเอนทิตี แทนที่จะขยาย \Cake\ORM\Entity คุณจะขยาย AppEntity:

<?php

namespace App\Model\Entity;

class User extends AppEntity {

} ;

?>
person Holt    schedule 09.07.2015