0

我正在使用一些数据库多态性通过 eloquent/laravel 连接表关系。(注意下面的例子已经被简化了,这两个对象已经在扩展一个基类,所以我不能扩展另一个可以实现我想要的行为的基类,它们扩展的基类与其他与我正在尝试的类无关的类共享在下面做)

class Pageable{
  public function table() {
    return $this->morphTo();
  }
}

class User {
  public function pageable() {
    return $this->morphOne('Pageable', 'table');
  }

  public function returnUrl() {
    return "http://...";
  }
}

class Company {
  public function pageable() {
    return $this->morphOne('Pageable', 'table');
  }

  public function returnUrl() {
    return "http://...";
  }  
}

我遍历 pageable,然后可以检索 User 或 Company 对象,但是我需要一个通用函数,例如 returnUrl,我可以调用任何可能被多态化为该关系的对象。有什么方法可以清理上面的内容,或者至少创建一些故障安全检查,以确保所有必需的方法都在类中实现,例如它们实现 PeageableInterface。例如,我可以在界面中设置需要此 returnUrl 函数的要求吗?

我将如何创建这样的界面?

4

2 回答 2

3

尝试使用特征。

在您的课程中,只需执行以下操作:

use TraitWithReturnUrl;

然后...

trait TraitWithReturnUrl {
    function returnUrl() {
        // do stuff like it's on the object itself
    }
}

答对了!:)

还可以查看我的 Fatty 库,它对类似的东西也很有用:https ://github.com/kirkbushell/fatty

在这两种情况下,您都需要 PHP 5.4+。

于 2013-08-16T15:56:23.717 回答
1

Traits 可能是一种更好的方法(php 5.5 中的新方法),但您可以直接使用接口,我认为在您的情况下可能如下所示:

1)创建接口:

interface Pageable {

    public function pageable();

}

2) 实现接口

class User extends Model implements UserInterface, RemindableInterface, Pageable {

    ... other methods ...

    public function pageable() {
        return $this->morphOne('Pageable', 'table');
    }

}

但是,如果该方法pageable()在每个实现中都是完全相同的代码,您可能希望创建一个定义它的抽象类,然后将其用作模型的基类:

use Illuminate\Database\Eloquent\Model as BaseModel;

abstract class NewModel extends BaseModel implements Pageable {

    public function pageable() {
        return $this->morphOne('Pageable', 'table');
    }

}

然后你的课程:

class User extends NewModel implements UserInterface, RemindableInterface {

    // You now have the pageable() method available

}

希望这可以帮助您指出正确的方向。

于 2013-08-16T18:26:37.997 回答