簡體   English   中英

Laravel約會表單模型綁定

[英]Laravel dates on form model binding

我正在使用Laravel 5.1

我有一個模型:

class ExampleModel extends Model {

    // ....
    protected $dateFormat = 'Y.m.d';
    protected $dates = ['first_date', 'second_date'];

    // ...
}

因此,當我索引ExampleModel元素時,日期格式是正確的(ex 2015.07.31)

但在編輯表單中,它使用默認格式:2015-07-31 00:00:00

我正在使用Form::model()綁定。

我知道我可以使用getFirstDateAttribute()但它不是我正在尋找的解決方案。 因為它根本不優雅,一旦我定義了$dates數組,它應該在每種情況下自動工作。

這可能是個錯誤嗎? 或者我做錯了什么?

我通過覆蓋Carbon的默認日期格式解決了我的問題:

Carbon\Carbon::setToStringFormat('Y.m.d');

但凱利的回答更好,更優雅,我也發布了這個,也許有人會發現這個有用一次。

我以前從未這樣做過,但它似乎與我放在一起的一個基本例子有關。 請注意,我只是在表單開始標記中調用模型上的toArray方法。

{!! Form::model($exampleModel->toArray(), ['route' => ['example-models.update', $exampleModel->id]]) !!}
    {!! Form::label('first_date', 'First Date') !!}
    {!! Form::text('first_date') !!}
{!! Form::close() !!}

文檔說dateFormat屬性確定將對象dateFormat轉換為json或數組時的日期格式。

我沒有完全建議將其作為修復,因為當您更新核心時,您將失去此修復程序,但也許這應該作為拉動請求發布到Laravel的下一個版本。

在\\ Illuminate \\ Database \\ Eloquent \\ Concerns \\ HasAttributes中更新asDate函數,如下所示。 從注釋中可以看出,asDate函數仍然返回時間戳,即使它是00:00:00。

/**
     * Return a timestamp as DateTime object with time set to 00:00:00.
     *
     * @param  mixed  $value
     * @return \Illuminate\Support\Carbon
     */
    protected function asDate($value)
    {
        $date = $this->asDateTime($value)->startOfDay();
        $date->setToStringFormat($this->getDateFormat());
        return $date;
    }

這允許您從模型中控制日期的格式(注意我區分日期和日期時間)。 然后使用casts變量將變量轉換為日期格式。

protected $casts = [
    'start_date' => 'date',
    'end_date' => 'date'
  ];
  protected $dateFormat =  'Y-m-d';

$ dates變量無法區分日期和日期時間。

更新真正的問題是表單模型綁定跳過了FormBuilder類的輔助函數。 如您所見,檢查\\ Collective \\ Html \\ FormBuilder :: date

/**
 * Create a date input field.
 *
 * @param  string $name
 * @param  string $value
 * @param  array  $options
 *
 * @return \Illuminate\Support\HtmlString
 */
public function date($name, $value = null, $options = [])
{
    if ($value instanceof DateTime) {
        $value = $value->format('Y-m-d');
    }

    return $this->input('date', $name, $value, $options);
}

正確地將日期格式化為HTML格式中指定的'Ymd'。 但是在這一點上,$ value實際上是null。 所以你必須更新通用輸入功能。

/**
 * Create a form input field.
 *
 * @param  string $type
 * @param  string $name
 * @param  string $value
 * @param  array  $options
 *
 * @return \Illuminate\Support\HtmlString
 */
public function input($type, $name, $value = null, $options = [])
{
    ...

    //$value is null here
    if (! in_array($type, $this->skipValueTypes)) {

        //$value is fetched based on hierarchy set by
        $value = $this->getValueAttribute($name, $value);

        //necessary duplicate code to format date value
        if ($type == 'date' && $value instanceof DateTime) {
            $value = $value->format('Y-m-d');
        }
    }

    ...
}

更新無需更新供應商代碼。 查看FormModelAccessors

https://laravelcollective.com/docs/5.2/html#form-model-binding

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM