【问题标题】:Creating custom variables/attributes in Laravel Model在 Laravel 模型中创建自定义变量/属性
【发布时间】:2016-09-10 00:26:16
【问题描述】:

我正在尝试在 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

我正在努力防止我的控制器被所有选择选项弄乱,因为还有一些其他选项我没有包括在内。

谢谢。

【问题讨论】:

    标签: php laravel model laravel-5 blade


    【解决方案1】:

    修改您的 protected $genders 元素并将其设为 public+static。那么你可以像这样直接访问它:User::$genders.

    但是......我个人的决定是将常量移动到配置文件或某种帮助程序。

    【讨论】:

    • 谢谢,这行得通。目前这些选项仅用于用户,但如果它们开始在其他地方使用,那么我会计划将它们移动到某种配置中。
    【解决方案2】:

    我想应该是

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

    或者简单地将$genders声明为静态变量并使用return self::$genders

    查看文档 - Variable scopeStatic Keyword

    【讨论】:

    • 可见性和范围解析文档也可能会有所帮助:docs.php.net/language.oop5.visibilitydocs.php.net/language.oop5.paamayim-nekudotayim
    • 不要认为$this->genders 可以在模型中工作,因为它必须在对象实例中,对吗?但我确实最终使用了self::$genders,在将$genders 声明为public static 之后,正如@Giedrius Kiršys 所建议的那样
    • 好吧,$this->genders 可以用作$data['select_options'] = (new User())->getGenderOptions();,但如果您想静态使用它,那么是的,您应该将$genders 声明为static。顺便说一句,如果您要扩展您的类 User 并在新类中更改 $genders 值,那么您应该使用 static 而不是 selfreturn static::$gender
    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多