CakePHP 3.x - Получение полей базы данных в зависимости от настроек Locale

Мне нужно разработать многоязычный веб-сайт. В базе данных одновременно используется более 4 языков. Схема всегда следующая: field_%lang%

бывший. идентификатор | title_ru | title_de | description_ru | description_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

Дело в том, что я понятия не имею, где это реализовать, не нарушая условностей. Я думал о сущностях, но, насколько я понимаю, нет «глобальной» сущности, которая работает для всех моделей?

Все идеи и предложения приветствуются!

Майк


person Mike    schedule 09.07.2015    source источник
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