在多个模型中使功能可用的正确方法

时间:2017-02-15 15:37:54

标签: php laravel laravel-5

在Laravel我有以下模型:

class Product extends Model {}

包含函数:

public function setThumbnailAttribute($value) {}

我有多个模型应该包含相同的setThumbnailAttribute()函数。使用Laravel或基本PHP功能执行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

创建一个扩展Model的基础模型,并将该函数添加到此。

use Illuminate\Database\Eloquent\Model;
class BaseModel extends Model
{
    public function setThumbnailAttribute($value) 
    {
        // code here
    }
}

然后,您可以使用新的基本模型扩展任何模型,以访问此功能。

class Product extends BaseModel 
{

}

在访问全局函数的基础上,同样的逻辑也可以应用于控制器。

答案 1 :(得分:3)

  1. 如果此模型具有此方法的多个实现,请使用多态。但是,如果模型的方法是通用的,则选择第二个。

    class Product extends AbstractThumbnailedModel
    {
        public function setThumbnailAttribute(Thumbnail $thumb)
        {
            // implement setter for Product
        }
    } 
    
    class AnotherProduct extends AbstractThumbnailedModel
    {
        public function setThumbnailAttribute(Thumbnail $thumb)
        {
            // implement setter for AnotherProduct
        }
    } 
    
    abstract class AbstractThumbnailModel extends Model 
    {
        abstract public function setThumbnailAttribute(Thumbnail $thumb);
    }
    
  2. 使用特征。创建特征Thumbnailed并在模型中需要时使用它。

    trait Thumbnailed 
    {
         public function setThumbnailedAttribute(Thumbnail $thumb)
         {
             // here implementaition which will share with needed models
         }
    }
    
    class Product extends Model
    {
        use Thumbnailed;
        // Use it!
    } 
    
    class AnotherProduct extends Model
    {
        use Thumbnailed;
        // same method implementation. Just use it!
    
    } 
    
  3. P.S。对不起谷歌翻译