Help us understand the problem. What is going on with this article?

Laravel5.3でArr::first()に渡す引数の順番が変わった

More than 3 years have passed since last update.

影響あるのはCollectionのfirst()やarray_first()。

ここで変えてるけどなんで変えたのかは不明…他と揃えるため?
https://github.com/laravel/framework/commit/99ca947f7362a105d61f401d3e45dc928bab783c

単純な使い方なら影響なし

$value = collect([1, 2, 3])->first();
//1

変わるのはコールバック関数使ってる時。

5.2

    public static function first($array, callable $callback = null, $default = null)
    {
        if (is_null($callback)) {
            return empty($array) ? value($default) : reset($array);
        }

        foreach ($array as $key => $value) {
            if (call_user_func($callback, $key, $value)) {
                return $value;
            }
        }

        return value($default);
    }
$array = [100, 200, 300];

$value = array_first($array, function ($key, $value) {
    return $value >= 150;
});

5.3

    public static function first($array, callable $callback = null, $default = null)
    {
        if (is_null($callback)) {
            return empty($array) ? value($default) : reset($array);
        }

        foreach ($array as $key => $value) {
            if (call_user_func($callback, $value, $key)) {
                return $value;
            }
        }

        return value($default);
    }
$array = [100, 200, 300];

$value = array_first($array, function ($value, $key) {
    return $value >= 150;
});

動かなくなってる実例

Cashierのここでkey, valueの順で使ってるので5.3だと落ちる:bomb:
https://github.com/laravel/cashier/blob/6.0/src/Billable.php#L179

    public function subscription($subscription = 'default')
    {
        return $this->subscriptions->sortByDesc(function ($value) {
            return $value->created_at->getTimestamp();
        })
        ->first(function ($key, $value) use ($subscription) {
            return $value->name === $subscription;
        });
    }

これどう修正するんだろ…。value, keyにするだけだと5.2で動かなくなる。
Laravelのバージョン見るのは違う。
instanceofで確認するのが一時的な対応かな。
最終的には5.3以上のみ対応にすればいいけど。

修正待ち

基本的な機能部分なのでちょっとの変更が意外と広範囲に影響ありそう。
これを英語で説明できないので誰か気付いて修正されるのを待つしかない…。

追記

互換残して一時対応することなく7.0にメジャーバージョン上げて5.3のみ対応にしてた。
5.2の最初では確か5.0だったはずだけど途中で6.0になって5.3は6.0で行くのかと思ってたけどsemverに従って互換性のない時は躊躇なくバージョン上げるんだなぁ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away