在laravel中创建新的Facade实例时调用函数

时间:2017-05-24 17:03:28

标签: php laravel laravel-facade

基本上我要说我有一个名为'Window'的模型。我知道laravel为模型的新实例提供了创建的事件,问题是我并不总是首先创建新的数据库记录以便调用该方法,但我有时需要先创建一个Facade实例。我的意思是:

$window = App\Window::create(); //this creates a new record in the 
//database and the 'created' event is being called in laravel, 
//so I can assign some properties. Everything is ok
$window = new App\Window;//but this only creates an instance of the facade 
//which is not being saved until `$window->save();` is called.

到目前为止,在我的代码中,我避免直接​​在数据库中创建新的空记录,所以我使用了第二种方法。但是现在我想处理new App\Window的创建,以便以编程方式为每个窗口分配自定义默认属性。有没有办法实现它?

2 个答案:

答案 0 :(得分:2)

这应该有效。如果它们尚未传入,它将仅应用默认值。我还将默认值设置为常量,因此如果您以后需要修改它们,它们很容易找到。

const COLUMN_DEFAULT = 'some default';

const SOME_OTHER_COLUMN_DEFAULT = 'some other default';

public function __construct(array $attributes = [])
{
    if (! array_key_exists('your_column', $attributes)) {
        $attributes['your_column'] = static::COLUMN_DEFAULT;
    }

    if (! array_key_exists('some_other_column_you_want_to_default', $attributes)) {
        $attributes['some_other_column_you_want_to_default'] = static::SOME_OTHER_COLUMN_DEFAULT;
    }

    parent::__construct($attributes);
}

答案 1 :(得分:0)

你可以做到

new Window($request->all());
// Or
new Window($request->only(['foo', 'bar']));
// Or immediately create the instance
Window::create($request->all());

但您应首先将所需属性添加到$fillable模型中的Window属性

class Window extends Model {
    protected $fillable = ['foo', 'bar'];
}