이 글은 주로 Laravel Collections 클래스를 사용하여 코드를 작성하는 방법을 소개합니다. 이제 이를 여러분과 공유합니다. 도움이 필요한 친구들이 참조할 수 있습니다.
Laravel은 몇 가지 멋진 구성 요소를 제공합니다. 현재의 모든 웹 프레임워크 중에서 최고의 구성 요소 지원. 이는 즉시 사용 가능한 보기, 인증, 세션, 캐싱, Eloquent, 대기열, 데이터 유효성 검사 및 기타 구성 요소를 제공할 뿐만 아니라 개발 도구도 제공됩니다(Valet 및 Homestead).
그러나 이 프레임워크의 가장 강력한 기능인 Collection 클래스는 초보자들에 의해 종종 무시됩니다. 이 문서에서는 컬렉션을 사용하여 코딩 효율성을 높이고, 코드 줄을 읽을 수 있게 하며, 간결한 코드를 작성하는 방법을 살펴보겠습니다.
컬렉션 사용에 대한 초기 노출은 Eloquent를 사용하여 데이터베이스 쿼리를 실행하고 foreach 문을 사용하여 반환된 데이터에서 모델 컬렉션을 탐색하는 개발자로부터 나왔습니다.
그러나 초보자는 컬렉션이 기본 데이터에 대해 작동하는 90개 이상의 메서드를 제공한다는 사실을 눈치채지 못할 수도 있습니다. 더 좋은 점은 거의 모든 메서드가 연결 작업을 지원하여 코드를 산문처럼 읽을 수 있다는 것입니다. 이렇게 하면 귀하와 다른 사용자 모두가 코드를 더 쉽게 읽을 수 있습니다.
아직 요점을 파악하지 못하셨나요? 자, 간단한 코드 조각을 검토하고 컬렉션을 사용하여 두껍고 빠르며 강력한 코드를 작성하는 방법을 살펴보겠습니다.
실제 세계를 만들어 봅시다. 일부 API 인터페이스를 쿼리하고 배열에 저장된 다음 결과 세트를 얻었다고 가정해 보겠습니다.
<?php // API 请求返回的结果 $data = [ ['first_name' => 'John', 'last_name' => 'Doe', 'age' => 'twenties'], ['first_name' => 'Fred', 'last_name' => 'Ali', 'age' => 'thirties'], ['first_name' => 'Alex', 'last_name' => 'Cho', 'age' => 'thirties'], ];
배열에 이름, 성, 연령 범위가 포함되어 있는 것을 볼 수 있습니다. 이제 레코드에서 age가 30세(30대)인 사용자를 가져온 후 성(last name)을 기준으로 sort을 수행한다고 가정합니다. 마지막으로, 반환된 결과가 단일 문자열이기를 바랍니다. 따라서 각 사용자는 독점적인 새 줄을 갖게 됩니다. 마지막으로 반환된 결과가 다음과 같기를 바랍니다.
이 요구 사항은 달성하기 어렵지 않은 것 같습니다. 이제 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줄로 늘어났습니다. 이제 코드가 훨씬 더 원활하게 실행될 뿐만 아니라 어떤 문제를 다루고 있는지 알려주는 주석이 필요 없이 메소드가 구현됩니다.
그러나 우리의 코드가 완벽한 무대만큼 좋아지는 것을 방해하는 한 가지 문제가 있습니다... 이름과 성을 비교하는 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줄로 줄었고, 코드가 깔끔하고, 누구나 바로 이해할 수 있는 명확한 기능을 갖고 있습니다.
이제 두 번째 예를 살펴보겠습니다. 사용자 목록이 있다고 가정하고 역할을 기준으로 필터링한 다음 등록 시간이 5년 이상이고 성을 시작하는 사용자인 경우 추가로 필터링해야 합니다. A-M 문자를 사용하면 첫 번째 사용자만 얻을 수 있습니다.
데이터는 다음과 같습니다.
<?php // API 请求返回的结果 $users = [ ['name' => '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)
참고: 두 번째 if 문을 첫 번째 문 안으로 이동할 수 있지만 저는 개인적으로 조건문이 2개 이상 있으면 코드를 읽기가 어려워지기 때문에 단일 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 컬렉션 클래스를 사용하여 코드를 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!