Laravel URL 使用 GET 过滤
Laravel URL Filtering with GET
我正在构建一个简单的 Laravel 路由,以便在有人访问 http://127.0.0.1:8000/planets
时显示一个数组
但我需要制作一个过滤器来检查数组,了解 URL 上发送的请求。例如:http://127.0.0.1:8000/planets?planet=mars
我需要确保如果存在 GET 参数,您可以根据行星名称是否在其中来过滤数组。这样我们可以更快地过滤页面的结果。
我目前的代码Web.php:
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/planets', function () {
$planets = [
[
'name' => 'Mars',
'description' => 'Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System, being larger than only Mercury.'
],
[
'name' => 'Venus',
'description' => 'Venus is the second planet from the Sun. It is named after the Roman goddess of love and beauty.'
],
[
'name' => 'Earth',
'description' => 'Our home planet is the third planet from the Sun, and the only place we know of so far thats inhabited by living things.'
]
];
return view('welcome', ['planets'=>$planets]);
});
还有我的欢迎之刃:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">
<style>
html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-t{border-top-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.dark\:text-gray-500{--tw-text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--tw-text-opacity))}}
</style>
<style>
body {
font-family: 'Nunito', sans-serif;
font-weight: bolder;
}
</style>
</head>
<body class="antialiased">
@foreach ($planets as $planet)
<ul>
<li>{{$planet['name']}}</li>
<p>{{$planet['description']}}</p>
</ul>
@endforeach
</body>
</html>
试试这个代码:
$uri_path = $_SERVER['REQUEST_URI'];
$uri_parts = explode('=', $uri_path);
$request_url = end($uri_parts);
dd($request_url);
在您的后端,您可以通过
查看您是否有 GET 参数
isset($_GET["planet"])
或通过
Input::get('start')
假设您有一个默认为 null
的 $planet
对象,如果为真,则由 GET 参数覆盖。
if (!!$planet) {
$planets = [$planet]
}
上面的 Laravel Illuminate\Http\Request
object has a query
方法允许您访问查询字符串参数。
$request->query('param');
因此对于您的场景并给定 URL example.com/planets?names=mars,earth
,您将按如下方式获取行星名称:
$names = $request->query('names');
这将导致 $names
变量具有字符串值 mars,earth
。
从这里您想使用 explode
来分隔各个名称:
$names = explode(',', $request->query('names');
这次$names
是一个有两个元素的数组,mars
和earth
。
然后您可以使用 whereIn
method available on Laravel Collections
将您的行星过滤为仅在 $names
数组中找到的行星。
$planets = collect($planets)
->whereIn('name', array_map(fn($name) => strtolower($name), $names))
->all();
请注意,为了使上述工作正常,我做了两件事。
- 我把你的
$planets
数组中的所有行星名称都小写了
- 我使用
array_map
将查询参数值转换为小写,以便与 $planets
数组进行比较
这应该可以缓解大小写问题(因此应该正确捕获输入 mars
、MARS
或其他变体的人)。
把它们放在一起,你应该有类似下面的东西:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::get('/planets', function (Request $request) {
$planets = [
[
'name' => 'mars',
'description' => 'Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System, being larger than only Mercury.'
],
[
'name' => 'venus',
'description' => 'Venus is the second planet from the Sun. It is named after the Roman goddess of love and beauty.'
],
[
'name' => 'earth',
'description' => 'Our home planet is the third planet from the Sun, and the only place we know of so far thats inhabited by living things.'
]
];
if ($request->query('names')) {
$names = explode(',', $request->query('names'));
$planets = collect($planets)->whereIn('name', array_map(fn($name) => strtolower($name), $names))->all();
}
return view('welcome', compact('planets'));
});
我正在构建一个简单的 Laravel 路由,以便在有人访问 http://127.0.0.1:8000/planets
但我需要制作一个过滤器来检查数组,了解 URL 上发送的请求。例如:http://127.0.0.1:8000/planets?planet=mars
我需要确保如果存在 GET 参数,您可以根据行星名称是否在其中来过滤数组。这样我们可以更快地过滤页面的结果。
我目前的代码Web.php:
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/planets', function () {
$planets = [
[
'name' => 'Mars',
'description' => 'Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System, being larger than only Mercury.'
],
[
'name' => 'Venus',
'description' => 'Venus is the second planet from the Sun. It is named after the Roman goddess of love and beauty.'
],
[
'name' => 'Earth',
'description' => 'Our home planet is the third planet from the Sun, and the only place we know of so far thats inhabited by living things.'
]
];
return view('welcome', ['planets'=>$planets]);
});
还有我的欢迎之刃:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">
<style>
html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-t{border-top-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.dark\:text-gray-500{--tw-text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--tw-text-opacity))}}
</style>
<style>
body {
font-family: 'Nunito', sans-serif;
font-weight: bolder;
}
</style>
</head>
<body class="antialiased">
@foreach ($planets as $planet)
<ul>
<li>{{$planet['name']}}</li>
<p>{{$planet['description']}}</p>
</ul>
@endforeach
</body>
</html>
试试这个代码:
$uri_path = $_SERVER['REQUEST_URI'];
$uri_parts = explode('=', $uri_path);
$request_url = end($uri_parts);
dd($request_url);
在您的后端,您可以通过
查看您是否有 GET 参数isset($_GET["planet"])
或通过
Input::get('start')
假设您有一个默认为 null
的 $planet
对象,如果为真,则由 GET 参数覆盖。
if (!!$planet) {
$planets = [$planet]
}
上面的 Laravel Illuminate\Http\Request
object has a query
方法允许您访问查询字符串参数。
$request->query('param');
因此对于您的场景并给定 URL example.com/planets?names=mars,earth
,您将按如下方式获取行星名称:
$names = $request->query('names');
这将导致 $names
变量具有字符串值 mars,earth
。
从这里您想使用 explode
来分隔各个名称:
$names = explode(',', $request->query('names');
这次$names
是一个有两个元素的数组,mars
和earth
。
然后您可以使用 whereIn
method available on Laravel Collections
将您的行星过滤为仅在 $names
数组中找到的行星。
$planets = collect($planets)
->whereIn('name', array_map(fn($name) => strtolower($name), $names))
->all();
请注意,为了使上述工作正常,我做了两件事。
- 我把你的
$planets
数组中的所有行星名称都小写了 - 我使用
array_map
将查询参数值转换为小写,以便与$planets
数组进行比较
这应该可以缓解大小写问题(因此应该正确捕获输入 mars
、MARS
或其他变体的人)。
把它们放在一起,你应该有类似下面的东西:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::get('/planets', function (Request $request) {
$planets = [
[
'name' => 'mars',
'description' => 'Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System, being larger than only Mercury.'
],
[
'name' => 'venus',
'description' => 'Venus is the second planet from the Sun. It is named after the Roman goddess of love and beauty.'
],
[
'name' => 'earth',
'description' => 'Our home planet is the third planet from the Sun, and the only place we know of so far thats inhabited by living things.'
]
];
if ($request->query('names')) {
$names = explode(',', $request->query('names'));
$planets = collect($planets)->whereIn('name', array_map(fn($name) => strtolower($name), $names))->all();
}
return view('welcome', compact('planets'));
});