2015-05-28 28 views
5

Ho un setter personalizzato che sto utilizzando un metodo __construct sul mio modello.Una __costruzione su un modello eloquente di Laravel

Questa è la proprietà che desidero impostare.

protected $directory; 

mio Constructor

public function __construct() 
    { 
     $this->directory = $this->setDirectory(); 
    } 

Il setter:

public function setDirectory() 
    { 
     if(!is_null($this->student_id)){ 
      return $this->student_id; 
     }else{ 
      return 'applicant_' . $this->applicant_id; 
     } 
    } 

mio problema è che dentro il mio setter la, $this->student_id (che è un attributo del modello di essere tirato dal database) sta tornando null. Quando I dd($this) dall'interno del mio setter, noto che il mio #attributes:[] è un array vuoto.
Quindi, gli attributi di un modello non vengono impostati fino a quando non viene attivato __construct(). Come posso impostare l'attributo $directory nel mio metodo construct?

risposta

19

È necessario modificare il costruttore per:

public function __construct(array $attributes = array()) 
{ 
    parent::__construct($attributes); 

    $this->directory = $this->setDirectory(); 
} 

La prima linea (parent::__construct()) verrà eseguito proprio metodo costrutto l'Eloquente Model s' prima del tuo codice viene eseguito, che impostare tutti gli attributi per voi. Anche la modifica alla firma del metodo del costruttore è di continuare a supportare l'utilizzo che Laravel si aspetta: $model = new Post(['id' => 5, 'title' => 'My Post']);

La regola empirica è in realtà ricordare sempre, quando si estende una classe, per verificare che non si sta eseguendo l'override di un metodo esistente, quindi che non funziona più (questo è particolarmente importante con i metodi magici __construct, __get, ecc.). Puoi controllare la fonte del file originale per vedere se include il metodo che stai definendo.

+0

Questo è esattamente ciò di cui avevo bisogno !! Grazie –

Problemi correlati