Doctrine 1.2自动加入i18n?

Zol*_*aKt 7 php oop orm doctrine internationalization


我想扩展i18n行为,以便它在任何类型的查询(DQL,relations,getTable)上自动加入转换表.
此外,它需要定义默认语言参数,因此当我在没有语言设置的情况下进行查询时,它会回退到默认语言.
注意:我正在寻找一个通用行为,因此这适用于所有i18n模型对象,而不是为每个类编写和覆盖.

这是一个例子:
table product- > id,category_id,price ...
table product_translation- > id,lang,name,description ...

使用当前的解决方案,当我做这样的事情时:Doctrine_Core::getTable('Product')->findAll()它获得所有产品而不加入翻译.
所以在控制器中我必须循环遍历所有记录并重新应用翻译的值$product->name = $product->Translation['en']->name

我想要这样的东西:

  • Doctrine_Core::getTable('Product')->findAll() 它应该得到lang ='en'的连接值
  • Doctrine_Core::getTable('Product)->findAll('en') 与上述相同
  • 它也应该与关系一起使用,例如,如果我有一个具有许多产品的类User,$user->Products它应该返回包含翻译的集合.
  • $user->Products('en')应该返回其他(非默认)语言的集合
  • 魔术功能也很好(如果可能的话)......就像 Doctrine_Core::getTable('Product')->getByCategoryAndLang(1,'en')

有人可以帮忙吗?我正在研究模板和行为,我认为这是要走的路,但不知道如何实现这一点

编辑:我看到对此没什么兴趣,所以让我尝试一个更简单的问题.你通常如何通过关系获得i18n领域.例如,我如何调用$user->Products并获取带有加载翻译的产品?

sha*_*yyx 1

我认为您不需要扩展标准的 Doctrine 行为,除非您想要全自动。但你仍然可以尝试像我们一样这样做 - 我们使用 DAO(数据访问对象)来返回具体的 Doctrine 实体(Doctrine 表表示):

\DAO::get('Some\Namespace\Classname')
Run Code Online (Sandbox Code Playgroud)

其中Classname代表 PHP 类模型描述的表。Classname我们的 DAO 类创建了封装的实例proxy(请参阅设计模式)。

除了表类模型之外,我们还为此表创建另一个类,该类位于表模型之上并使用该模型进行操作。在这个类中,我们编写诸如getProducts($args)getProduct($id)等方法getProductsByCategory($catId)

我认为这就是您正在寻找的......

在方法中,getProducts($args)您可以在 DQL 中实现,通过参数中的给定标识符->leftJoin()连接转换表。简单示例(未测试):$lang$args

class Products extends \DAO {
    public function save($item) {
        $item->save();
    }

    public function getProducts($args = array()) {
        $order = array('p.id');

        $result = \Doctrine_Query::create()
            ->from('Some\Namespace\Product p')
            ->where('1 = 1');

        if(!empty($args['lang'])) {
            $result = $result->leftJoin('Some\Namespace\ProductTranslation pt ON pt.product_id = p.id AND pt.language = ?', $args['lang']);
        }

        $result = $result->orderBy($order);

        $result = $result->execute();

        return $result;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后通过调用

$products = DAO::get('Some\Namespace\Product')->getProducts(array('lang' => 1));
Run Code Online (Sandbox Code Playgroud)

您将获得所有已加载英文翻译的产品...

它不是那么自动化,您必须为每个模型编写自己的 DAO 类,但这是一个很好的方法,因为您有 MVC/MVP 面向对象的应用程序架构所需的不同数据定义类(模型)和数据操作类(控制器) ...