web-dev-qa-db-ja.com

PHP元の変数値を変更するCarbonクラス

作成しているカレンダータイプのものにいくつかのナビゲーションボタンを作成しようとしています。日付を作成するためにカーボンを使用しています。

これはコントローラーのコードです:

if ($date == null) {
    $date = \Carbon\Carbon::now();
} else {
    $date = \Carbon\Carbon::createFromFormat('Y-m-d', $date);
}
$navDays = [
    '-7Days' => $date->subDay('7')->toDateString(),
    '-1Day'  => $date->subDay('1')->toDateString(),
    'Today'    => $date->today()->toDateString(),
    '+1Day'  => $date->addDay('1')->toDateString(),
    '+7Days' => $date->addDay('7')->toDateString()
];

そして私は私の見解です、私はこれをしています:

@foreach($navDays as $key => $i)
    <li>
        <a href="/planner/bookings/{{ $i }}" class="small button">
            {{ $key }}
        </a>
    </li>
@endforeach

この問題は、カーボンが配列の作成中に$ dateを変更するように見えることです。これは、これらが私が取得している日付であるためです($date2015-11-29に設定されています)。

<ul class="button-group even-5">
    <li><a href="/planner/bookings/2015-11-22" class="small button">-7Days</a></li>
    <li><a href="/planner/bookings/2015-11-21" class="small button">-1Day</a></li>
    <li><a href="/planner/bookings/2015-12-22" class="small button">Today</a></li>
    <li><a href="/planner/bookings/2015-11-22" class="small button">+1Day</a></li>
    <li><a href="/planner/bookings/2015-11-29" class="small button">+7Days</a></li>
</ul>

誰かが私が間違っていることを知っていますか?

32

これらのメソッドをCarbonオブジェクトに対して実行すると、オブジェクト自体が更新されます。したがって、addDay()は、Carbonの値を1日進めます。

これはあなたがする必要があることです:

$now = Carbon::now();

$now->copy()->addDay();
$now->copy()->addMonth();
$now->copy()->addYear();
// etc...

Copyメソッドは基本的に新しいCarbonオブジェクトを作成し、元の$now変数に影響を与えずに変更を適用できます。

要約すると、Carbonインスタンスをコピーする方法は次のとおりです。

  • copy
  • clone-copyのエイリアス

ドキュメントをチェックしてください: https://carbon.nesbot.com/docs/

38
diggersworld

問題は、subDay()/ addDay()は日付オブジェクトを変更しないと仮定しているのに対し、それらは変更する... DateTimeオブジェクトをラップしているだけですmodify() 方法:

DateTime :: modify-date_modify — Altersタイムスタンプ

(私の強調)

代わりに、

$navDays = [
    '-7Days' => (clone $date)->subDay('7')->toDateString(),
    '-1Day'  => (clone $date)->subDay('1')->toDateString(),
    'Today'  => (clone $date)->today()->toDateString(),
    '+1Day'  => (clone $date)->addDay('1')->toDateString(),
    '+7Days' => (clone $date)->addDay('7')->toDateString()
];
12
Mark Baker

Doco は言う

既存のCarbonインスタンスのcopy()を作成することもできます。予想どおり、日付、時刻、タイムゾーンの値はすべて新しいインスタンスにコピーされます。

$dt = Carbon::now();
echo $dt->diffInYears($dt->copy()->addYear());  // 1

// $dt was unchanged and still holds the value of Carbon:now()
0