我正在使用一些数据库多态来通过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函数吗?
我如何创建这样的界面?
答案 0 :(得分: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 +。
答案 1 :(得分: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
}
希望能帮助你指明正确的方向。