我开发了一个多语言网站。它在数据库中同时使用了4种以上的语言。它始终遵循以下方案: field_%郎%
离。 id | title_en | title_de | description_en | description_de
因为它非常简单,我想写一个我可以在控制器和视图中使用的函数(全局实体?),以保持我的代码DRY。
//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
问题是我不知道在没有制动惯例的情况下在哪里实施它。我在考虑实体,但据我所知,没有"全球"适用于所有模型的实体?
欢迎所有的想法和建议!
麦克
答案 0 :(得分:2)
AppEntity
是所有实体的基类,你不会修改内置的CakePHP类,但没有什么能阻止你创建自己的超类。
我们称之为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 {
} ;
?>
:
char readrc(char* array, int r, int c, int n, int m)
{
return (r > 0 && r <= n && c > 0 && c <= m) ?
array[n * (r - 1) + (c - 1)] : '\0';
}
void read_down_right(char* array, int n, int m, vector<string>& list)
{
for (int sc = 2 - n; sc <= m - 1; sc++)
{
string str = "";
for (int r = 1, c = sc; r <= n; r++, c++)
{
char chr = readrc(array, r, c, n, m);
if (chr != '\0')
str += chr;
}
list.push_back(str);
}
}
void read_down_left(char* array, int n, int m, vector<string>& list)
{
for (int sc = 2; sc <= m + n - 2; sc--)
{
string str = "";
for (int r = 1, c = sc; r <= n; r++, c--)
{
char chr = readrc(array, r, c, n, m);
if (chr != '\0')
str += chr;
}
list.push_back(str);
}
}