web-dev-qa-db-fra.com

Le carbone change ma variable d'origine

J'essaie de créer quelques boutons de navigation dans un type d'agenda que je crée et d'utiliser carbone pour créer les dates.

C'est le code dans le contrôleur:

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

et puis je pense que je fais ceci:

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

Ce problème est que carbone semble changer la date $ lors de la création du tableau, car ce sont les dates à obtenir (avec $ date étant défini sur 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>

Est-ce que quelqu'un sait ce que je fais mal?

Cordialement Johan

16
Johan Björklund

Lorsque vous exécutez ces méthodes sur un objet Carbon, celui-ci est mis à jour. Par conséquent, addDay() fait avancer la valeur de Carbon d'un jour.

Voici ce que vous devez faire:

$now = Carbon::now();

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

La méthode copy crée essentiellement un nouvel objet Carbon auquel vous pouvez appliquer les modifications sans affecter la variable $now d'origine.

Consultez la documentation: https://carbon.nesbot.com/docs/

27
diggersworld

Le problème est que vous supposez que subDay ()/addDay () ne modifie pas l'objet de date, alors qu'ils le font .... ils enveloppent simplement la méthode DateTime object modify():

DateTime :: modify - date_modify - Modifie l'horodatage

(mon emphase)

Au lieu de cela, utilisez

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

Doco dit

Vous pouvez également créer un copy () d'une instance Carbon existante. Comme prévu, les valeurs de date, heure et fuseau horaire sont toutes copiées dans la nouvelle instance.

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

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