2015-05-28 22 views
5

Tôi có một setter tùy chỉnh mà tôi đang chạy trong một phương pháp __construct trên mô hình của tôi.Một __construct trên một mô hình Eloquent Laravel

Đây là tài sản tôi muốn đặt.

protected $directory; 

My Constructor

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

Các setter:

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

Vấn đề của tôi là bên trong setter của tôi, $this->student_id (đó là một thuộc tính của mô hình được kéo ra từ cơ sở dữ liệu) đang quay trở lại null. Khi tôi dd($this) từ bên trong thiết lập của tôi, tôi nhận thấy rằng #attributes:[] của tôi là một mảng trống.
Vì vậy, các thuộc tính của mô hình không được đặt cho đến sau khi __construct() được kích hoạt. Làm cách nào để tôi có thể đặt thuộc tính $directory trong phương pháp xây dựng của mình?

Trả lời

19

Bạn cần thay đổi nhà xây dựng của bạn để:

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

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

Dòng đầu tiên (parent::__construct()) sẽ chạy phương pháp xây dựng riêng hùng hồn Model 's trước khi mã của bạn chạy, mà sẽ thiết lập tất cả các thuộc tính cho bạn. Ngoài ra, thay đổi đối với chữ ký phương thức của hàm tạo là tiếp tục hỗ trợ việc sử dụng Laravel: $model = new Post(['id' => 5, 'title' => 'My Post']);

Quy tắc chung là luôn nhớ rằng bạn không ghi đè phương thức hiện có rằng nó không còn chạy nữa (điều này đặc biệt quan trọng với các phương pháp ma thuật __construct, __get, v.v.). Bạn có thể kiểm tra nguồn của tệp gốc để xem liệu nó có chứa phương thức mà bạn đang định nghĩa hay không.

+0

Đó chính xác là những gì tôi cần !! Cảm ơn bạn –

Các vấn đề liên quan