ホームページ >バックエンド開発 >PHPチュートリアル >Laravel Collectionsクラスを使用したコードの書き方

Laravel Collectionsクラスを使用したコードの書き方

不言
不言オリジナル
2018-07-10 14:02:341320ブラウズ

この記事では主に、Laravel Collections クラスを使用したコードの書き方を紹介します。これには特定の参照値があります。今、共有します。必要な友人は参照してください。

Laravel は、いくつかの素晴らしいコンポーネントを提供します。私の意見では、これは現在のすべての Web フレームワークの中で最高のコンポーネント サポートを提供するフレームワークです。すぐに使えるビュー、認証、セッション、キャッシング、Eloquent、キュー、データ検証、その他のコンポーネントを提供するだけではありません。開発ツール (Valet および Homestead) も提供されています。

しかし、このフレームワークの最も強力な機能である Collection (コレクション) クラスは、初心者には無視されがちです。この記事では、コレクションを使用してコーディング効率を向上させ、コード行を読みやすくし、より無駄のないコードを作成する方法について説明します。

プレビュー

コレクションの使用について最初に知ったのは、開発者が Eloquent を使用してデータベース クエリを実行し、foreach ステートメントを使用して返されたデータからモデル コレクションを走査したことでした。

ただし、初心者は、コレクションが基礎となるデータを操作するための 90 以上のメソッドを提供していることに気づかないかもしれません。さらに優れているのは、ほとんどすべてのメソッドが操作の連鎖をサポートしているため、コードが散文のように読めることです。これにより、あなたと他のユーザーの両方にとって、コードが読みやすくなります。

まだ本題に到達していませんか?それでは、簡単なコード スニペットを確認し、コレクションを使用して太くて高速かつ強力なコードを作成する方法を見てみましょう。

コード例

現実の世界を構築しましょう。いくつかの API インターフェイスをクエリし、配列に保存された次の結果セットを取得するとします。

<?php
// API 请求返回的结果
$data = [
    [&#39;first_name&#39; => 'John', 'last_name' => 'Doe', 'age' => 'twenties'],
    ['first_name' => 'Fred', 'last_name' => 'Ali', 'age' => 'thirties'],
    ['first_name' => 'Alex', 'last_name' => 'Cho', 'age' => 'thirties'],
];

配列には、名、姓、および年齢範囲が含まれていることがわかります。ここで、レコードから 30 歳 (30 代)age(age) ユーザーを取得し、姓(姓)に基づいて続行します#名前) ##ソート(並べ替え)。最後に、返される結果が 単一の文字列 であることを望み、各ユーザーが排他的な 改行を持てるようにします。最後に、返される結果が

であることを望みます。この要件を達成するのは難しくないようです。次に、PHP を使用してこの関数を実装する方法を見てみましょう。

// 依据姓氏排序
usort($data, function ($item1, $item2) {
    return $item1['last_name'] <=> $item2['last_name'];
});

// 依据年龄范围分组
$new_data = [];

foreach ($data as $key => $item) {
    $new_data[$item['age']][$key] = $item;
}

ksort($new_data, SORT_NUMERIC);

// 从年龄为 30 岁组里获取用户全名
$result = array_map(function($item) {
    return $item['first_name'].' '.$item['last_name'];
}, $new_data['thirties']);

// 将数组转换为字符串并以行分隔符分隔
$final = implode("\n", $result);

// 译注:原文是 $final = implode($results, "\n"); implode函数接收两种顺序的参数,为了保持与文档一致所以我这边做了调整。
実装コードは 20 行を超えています。そしてとても品がない。コメントや改行関連のコードを削除すると、このコードが読みにくくなります。さらに、一時変数と、PHP に組み込まれている不親切な並べ替えメソッドも使用する必要があります。

ここで、Collection クラスがいかに簡単かを見てみましょう:

collection($data)->where('age', 'thirties')
                 ->sortBy('last_name')
                 ->map(function($item){
                    return $item['first_name'].' '.$item['last_name'];
                 })
                 ->implode("\n");
すごい!コードは 20 行から 6 行になりました。コードがよりスムーズに実行されるだけでなく、どのような問題に対処しているのかをコメントで知らせる必要もなくメソッドが実装されます。

しかし、コードが完璧な段階に達することを妨げる問題がまだ 1 つあります。それは、姓と名を比較するために使用される

map メソッドです。率直に言って、これは大したことではありませんが、マクロの概念を探求する動機となります。

コレクションの拡張

Collection クラスは、他の Laravel コンポーネントと同様にマクロをサポートしています。つまり、メソッドを追加して後で使用することができます。

ヒント: 新しいメソッドをどこでも利用できるようにするには、そのメソッドをサービス プロバイダーに追加する必要があります。この関数を実装するための MacroServiceProvider を任意に作成したいと思います。
配列によって提供される任意の数のフィールドを連結し、文字列の結果を返すメソッドを追加しましょう:

Collection::macro('toConcatenatedString', function ($fields = [], $separator = ' ') {
    return $this->map(function($item) use ($fields, $separator) {
        return implode($separator, array_map(function ($el) use ($item) {
                return $item[$el];
            }, $fields)
        );
    })->implode("\n");
});
このメソッドを追加すると、コードは基本的に完璧になります:

collect($data)->where('age', 'thirties')
              ->sortBy('last_name')
              ->toConcatenatedString(['first_name', 'last_name']);
コードは 20 行以上あった混沌とした 3 行に整理され、すっきりと整理され、誰でもすぐに理解できる明確な機能を備えています。

別の例

次に 2 番目の例を見てみましょう。ユーザーのリストがあると仮定して、ロールに基づいてユーザーをフィルターし、登録期間が 5 年の場合はさらにフィルターする必要があります。またはそれより古い、

が A ~ M の文字で始まる場合、最初のユーザーのみが取得されます。

データは次のようになります:

<?php
// API 请求返回的结果
$users = [
    [&#39;name&#39; => 'John Doe', 'role' => 'vip', 'years' => 7],
    ['name' => 'Fred Ali', 'role' => 'vip', 'years' => 3],
    ['name' => 'Alex Cho', 'role' => 'user', 'years' => 9],
];
PHP 実装を使用している場合、コードは次のようになります:

$subset = [];
foreach ($users as $user) {
    if ($user['role'] === 'vip' && $user['years'] >= 5) {
        if (preg_match('/\s[A-Z]/', $user['name'])) {
            $subset[] = $user;
        }
    }
}
return reset($subset)
注: 2 番目の if ステートメントは最初のステートメント内に移動されますが、条件が 2 つを超えるとコードが読みにくくなると思うので、個人的には 1 つの if ステートメント内で使用する条件は 2 つまでにしたいと考えています。
このコードはそれほど悪くありませんが、それでも一時変数を使用する必要があり、

reset 関数を使用してポインターを最初のユーザーにリセットする必要もあります。私たちのコードには 4 レベルのインデントもあり、コードの解析がさらに難しくなります。

代わりに、コレクションがこの問題をどのように処理するかを見てみましょう:

collect($users)->where('role', 'vip')
              ->map(function($user) {
                  return preg_match('/\s[A-Z]/', $user['name']);
              })
              ->firstWhere('years', '>=', '5');

我们将代码简化到了之前的一般左右,每一步过滤处理清晰明了,并且我们不需要引入临时变量。

遗憾的是目前集合还不支持正则匹配,所以我们使用 map 方法,不过我们可以为这个功能创建一个宏:

Collection::macro('whereRegex', function($expression, $field) {
    return $this->map(function ($item) use ($expression, $field) {
        return preg_match($expression, $item[$field]);
    })
});

得益于宏方法,我们的代码现在看起来如下:

collect($users) -> where('role', 'vip')
                -> whereRegex('/\s[A-Z]/', 'name')
                -> firstWhere('years', '>=', 5);
注意:  为了简单起见,我们的红仅仅适用于数组集合。如果你计划让它们可以在 Eloquent 集合上使用,你需要在此场景下做相应的代码处理才行。

不同的视角

我们可以继续列出无数的示例,但仍然无法涵盖所有可用的集合方法,并且这从来都不是本文的真正目的。

需要注意的是,通过使用 Collection 类,您不仅可以获得一个方法库来简化编程工作,还可以选择一种从根本上改善代码的方法。

你会情不自禁的将你的代码结构从代码块重构简化成一行,同时减少代码的缩进,临时变量的使用和技巧性方法,另外你还可以使用链式编程方法,这让你的代码更加便于阅读和解析,此外最重要的是减少了编码工作!

查看官方文档获取更多这个迷人的类库的使用细节:https://laravel.com/docs/coll...

提示: 你还可以获取这个 Collection 类独立安装包,在使用非 laravel 项目是会非常有帮助。感谢 Tighten Co 团队做出的努力 https://github.com/tightenco/...。

感谢阅读,快乐编码!

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于Laravel的Eloquent ORM的解析

以上がLaravel Collectionsクラスを使用したコードの書き方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。