Класс 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 во время создания массива, потому что это даты, которые я получаю (с $date, установленной на 2015-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>

Кто-нибудь знает, что я делаю не так?

Ответ 1

Когда вы запускаете эти методы для объекта Carbon, он обновляет сам объект. Поэтому addDay() перемещает значение Carbon на один день вперед.

Вот что вам нужно сделать:

$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/

Ответ 2

Проблема заключается в том, что вы предполагаете, что subDay()/addDay() не меняют объект даты, тогда как они... они просто обтекают метод DateTime object modify():

DateTime:: modify - date_modify - Изменяет временную метку

(мой акцент)

Вместо этого используйте

$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()
];

Ответ 3

Доко говорит

Вы также можете создать копию() существующего экземпляра Carbon. Как и ожидалось, все значения даты, времени и часового пояса копируются в новый экземпляр.

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

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