2016-05-13 99 views
1

我正嘗試在Laravel模型中創建一個自定義屬性。這個屬性對於所有的Model實例都是一樣的(static?)。目標是在創建Model實例時使用此屬性填充選擇下拉列表。例如:在Laravel模型中創建自定義變量/屬性

class User extends Model 
{ 
    protected $table = 'users'; 
    protected $guarded = [ 'id' ]; 
    public $timestamps = true; 

    protected $genders = ['male'=>'Male', 'female'=>'Female']; //custom 

    public static function getGenderOptions() { 
     return $genders; 
    } 
} 

然後建立表單時,我可以這樣做:

// UserController.php 
$data['select_options'] = User::getGenderOptions(); 
return view('user.create', $data); 

// create.blade.php 
{!! Form::select('gender', $select_options) !!} 

這使我得到的錯誤:

Undefined variable: genders 

我試圖避免雜亂我的控制器與所有的選擇選項,因爲還有一些我沒有包括在內。

謝謝。

回答

1

修改您的protected $genders元素並將其設爲public + static。那麼你可以像這樣直接訪問它:User::$genders

但是......我個人的決定是將常量移動到配置文件或某種幫助程序。

+0

謝謝,這個工作。現在,這些選項僅用於用戶,但如果它們開始在別處使用,那麼我打算將它們移動到某種配置。 – Stetzon

0

我想這應該是

public function getGenderOptions() { 
    return $this->genders; 
} 

或者乾脆聲明$genders作爲一個靜態變量和使用return self::$genders

檢查文檔 - Variable scopeStatic Keyword

+0

此外,可見性和範圍解析文檔可能會對您有所幫助: http://docs.php.net/language.oop5.visibility http://docs.php.net/language.oop5.paamayim-nekudotayim –

+0

不要以爲'$ this-> genders'可以在模型中工作,因爲它必須位於對象實例中,對嗎?但是,在@ $ genders'聲明爲'public static'之後,我最終使用'self :: $ genders',正如@GiedriusKiršys – Stetzon

+0

所建議的那樣,'$ this-> genders'可以用作'$ data ['select_options'] =(new User()) - > getGenderOptions();' 但是如果你想靜態使用它,那麼是的,你應該把'$ genders'聲明爲'static'。 順便說一句,如果你要擴展你的類'User'並在一個新類中改變'$ genders'的值,那麼你應該使用'static'而不是'self':'return static :: $ gender' –