Laravel雄辩与存储库/服务设计模式的关系

时间:2015-01-09 21:44:58

标签: php laravel eloquent repository-pattern service-layer

我目前正在开发一个使用存储库/服务层设计模式设置的Web应用程序,即我在运行存储库中的任何方法之前具有执行任何必要业务逻辑的服务层。我的每个模型都有外观,可以访问各自的服务层,这在大多数情况下都很好。然而,现在我正试图建立雄辩的关系,外墙似乎引起了巨大的麻烦,因为我不确定我应该走向哪个方向。

请使用以下代码:

class Account extends Eloquent {

    // Our table name
    protected $table = "accounts";

    // Our primary key
    protected $primaryKey = "id";

    /**
     *  Role Relationship
     *
     *  Returns a list of roles associated with 
     *  this account
     */
    public function roles() {
        return $this->hasMany('Role');
    }

}

这不会按原样运行,因为它不是使用Role的实体类,而是使用Role Facade。我已经找到了解决方法,通过为Entity设置一个名称略有不同的别名,例如RoleEntity,以便

    public function roles() {
        return $this->hasMany('RoleEntity');
    }

可行,但这似乎不是最佳解决方案。

我的问题是,练习好吗?或者更好的是,这应该发生吗?如果没有,我该如何解决?我哪里出错?

1 个答案:

答案 0 :(得分:1)

在同一名称空间中有两个具有相同名称的类。使用不同的名称空间,以便您可以使用相同的类名。

我通常使用\ Models来定位我的模型类。

在每个模型文件的顶部:

namespace Models;

在您的控制器或应用的任何部分:

\Models\Role::first();

请注意,更改模型上的命名空间将要求您添加其他类的名称空间,即Str,Eloquent,Url,Redirect等。

use Eloquent;
use URL;

在您的模型中,您还必须在关系函数中传递名称空间,即:

public function roles() {
    return $this->hasMany('\Models\Role');
}