W Lavel mam następujący model:

class Product extends Model {}

Który zawiera funkcję:

public function setThumbnailAttribute($value) {}

Mam wiele modeli, które powinny zawierać tę samą funkcję setThumbnailAttribute(). Jaki jest właściwy sposób, aby wykonać to za pomocą funkcjonalności Lavel lub Basic PHP?

2
Gilbert 15 luty 2017, 18:37

2 odpowiedzi

Najlepsza odpowiedź
  1. Użyj polimorfizmu, jeśli modele te mają wiele realizacji tej metody. Jednak jeśli metoda uniwersalna dla modeli, wybierz sekundę.

    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. Użyj cech. Utwórz cechę thumbnained i użyj go w razie potrzeby w modelach.

    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!
    
    } 
    

Str.s. Przepraszam za tłumaczenie google

3
maches 15 luty 2017, 16:55

Utwórz model podstawowy, który rozszerza model i dodać tę funkcję.

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

Następnie możesz przedłużyć dowolne modele za pomocą nowych modeli bazowych, aby uzyskać dostęp do tej funkcji.

class Product extends BaseModel 
{

}

Ta sama logika może być stosowana do kontrolerów, na podstawie dostępu do funkcji globalnej.

6
mbozwood 15 luty 2017, 16:03