2016-05-13 100 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' –