Heim  >  Artikel  >  Backend-Entwicklung  >  So schreiben Sie Code mit der Laravel Collections-Klasse

So schreiben Sie Code mit der Laravel Collections-Klasse

不言
不言Original
2018-07-10 14:02:341301Durchsuche

Dieser Artikel stellt hauptsächlich vor, wie man Code mit der Laravel Collections-Klasse schreibt. Jetzt kann ich ihn mit Ihnen teilen.

Laravel bietet einige großartige Komponenten. Meiner Meinung nach ist es dasjenige, das unter allen aktuellen Web-Frameworks die beste Komponentenunterstützung bietet. Es bietet nicht nur sofort einsatzbereite Ansichten, Authentifizierung, Sitzungen, Caching, Eloquent, Warteschlangen, Datenvalidierung und andere Komponenten. Es werden sogar Entwicklungstools bereitgestellt (Valet und Homestead).

Allerdings wird eine der mächtigsten Funktionen dieses Frameworks von Neulingen oft übersehen – die Klasse Collection . In diesem Artikel erfahren Sie, wie Sie mithilfe von Sammlungen die Codierungseffizienz, die Lesbarkeit von Codezeilen und das Schreiben schlankeren Codes verbessern können.

Vorschau

Der erste Kontakt mit der Verwendung von Sammlungen kam von Entwicklern, die Eloquent zum Ausführen von Datenbankabfragen verwendeten und die foreach-Anweisung verwendeten, um die Modellsammlung anhand der zurückgegebenen Daten zu durchlaufen.

Einsteiger bemerken jedoch möglicherweise nicht, dass Sammlungen mehr als 90 Methoden zur Manipulation der zugrunde liegenden Daten bieten. Noch besser ist, dass fast alle Methoden Verkettungsoperationen unterstützen, sodass sich Ihr Code wie Prosa liest. Dadurch wird Ihr Code sowohl für Sie als auch für andere Benutzer leichter lesbar.

Sie kommen immer noch nicht auf den Punkt? Okay, schauen wir uns einen einfachen Codeausschnitt an und sehen, wie wir Sammlungen verwenden können, um dicken, schnellen und leistungsstarken Code zu schreiben.

Codebeispiel

Lassen Sie uns eine reale Welt aufbauen. Angenommen, wir fragen eine API-Schnittstelle ab und erhalten die folgende Ergebnismenge in einem Array gespeichert:

<?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'],
];

Wir sehen, dass das Array Vorname, Nachname und Altersgruppe enthält. Nun gehen wir davon aus, dass wir aus dem Datensatz einen Benutzer erhalten, dessen Alter (age) 30 Jahre (dreißig) ist, und dann basierend auf dem Nachnamen (last) fortfahren Name) 🎜> Sortieren . Schließlich hoffen wir auch, dass das zurückgegebene Ergebnis ein String (einzelner String) ist, sodass jeder Benutzer eine exklusive Zeile (neue Zeile) hat. Abschließend hoffen wir auch, dass das zurückgegebene Ergebnis

Diese Anforderung scheint nicht schwer zu erreichen zu sein scheint. Lassen Sie uns nun sehen, wie diese Funktion mit PHP implementiert wird:

// 依据姓氏排序
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函数接收两种顺序的参数,为了保持与文档一致所以我这边做了调整。
Unser Implementierungscode überschreitet 20 Zeilen. und sehr unelegant. Entfernen Sie Kommentare und Zeilenumbruch-bezogenen Code, da dieser Code dann schwer lesbar wird. Darüber hinaus müssen wir auch temporäre Variablen und die in PHP integrierte unfreundliche Sortiermethode verwenden.

Jetzt sehen wir uns an, wie einfach es mit der Collection-Klasse ist:

collection($data)->where('age', 'thirties')
                 ->sortBy('last_name')
                 ->map(function($item){
                    return $item['first_name'].' '.$item['last_name'];
                 })
                 ->implode("\n");
Wow! Unser Code wurde von 20 Zeilen auf 6 Zeilen erweitert. Der Code läuft jetzt nicht nur viel reibungsloser, sondern die Methoden werden auch implementiert, ohne dass Kommentare erforderlich sind, um uns mitzuteilen, um welches Problem es sich handelt.

Es gibt jedoch ein Problem, das unseren Code daran hindert, so perfekt zu sein, wie er war: die

map-Methode zum Vergleich von Vor- und Nachnamen. Ehrlich gesagt ist das keine große Sache, aber es motiviert, das Makro-Konzept zu erkunden.

Erweitern von Sammlungen

Die Collection-Klasse unterstützt wie andere Laravel-Komponenten Makros, was bedeutet, dass Sie ihr Methoden hinzufügen und sie später verwenden können.

Tipp: Wenn Sie möchten, dass neue Methoden überall verfügbar sind, sollten Sie diese beim Dienstanbieter hinzufügen. Ich erstelle gerne einen MacroServiceProvider, um diese Funktionalität zu implementieren, je nachdem, was Sie möchten.
Fügen wir eine Methode hinzu, die eine beliebige Anzahl von Feldern verkettet, die vom Array bereitgestellt werden, und ein String-Ergebnis zurückgibt:

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");
});
Nachdem wir diese Methode hinzugefügt haben, ist unser Code im Grunde perfekt:

collect($data)->where('age', 'thirties')
              ->sortBy('last_name')
              ->toConcatenatedString(['first_name', 'last_name']);
Unser Code wurde von einem Durcheinander von mehr als 20 Zeilen auf 3 Zeilen reduziert. Der Code ist sauber und aufgeräumt und verfügt über klare Funktionen, die jeder sofort verstehen kann.

Noch ein Beispiel

Schauen wir uns nun das zweite Beispiel an. Angenommen, wir haben eine Liste von Benutzern, müssen wir sie nach Rolle herausfiltern und dann weiter, wenn ihre Registrierungszeit 5 Jahre beträgt oder höher und

Nachname mit den Buchstaben A-M beginnt, erhält nur der erste Benutzer.

Die Daten ähneln den folgenden:

<?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],
];
Wenn wir eine PHP-Implementierung verwenden, sieht unser Code wie folgt aus:

$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)
Hinweis: Sie can Die zweite if-Anweisung wird innerhalb der ersten verschoben, aber ich persönlich verwende gerne nicht mehr als zwei Bedingungen in einer einzigen if-Anweisung, weil ich denke, dass mehr als zwei Bedingungen den Code schwer lesbar machen.
Dieser Code ist nicht so schlecht, aber wir müssen immer noch temporäre Variablen verwenden und wir müssen auch die Funktion

reset verwenden, um den Zeiger auf den ersten Benutzer zurückzusetzen. Unser Code verfügt außerdem über vier Einrückungsebenen, was das Parsen des Codes schwieriger macht.

Sehen wir uns stattdessen an, wie Sammlungen mit diesem Problem umgehen:

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的解析

Das obige ist der detaillierte Inhalt vonSo schreiben Sie Code mit der Laravel Collections-Klasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn