我正在尝试按名称创建搜索方法,但它显示此错误
Posted
技术标签:
【中文标题】我正在尝试按名称创建搜索方法,但它显示此错误【英文标题】:i'm trying to create a search method by name but it showing this error 【发布时间】:2021-08-25 21:59:10 【问题描述】:我很困惑,我需要你的帮助,这是错误:
[Route: single.temp] [URI: singlepost/name] [Missing parameter: name] 缺少必需参数。 (查看:C:\Users\Toshiba\Desktop\working\mouhawla\resources\views\index.blade.php)
搜索栏:
<div class="search">
<form role="form" action="route('single.temp')">
<i class="fa fa-search"></i>
<div class="field-toggle">
<input type="text" name="name" class="search-form" autocomplete="off" placeholder="Search">
</div>
</form>
</div>
方法:
public function getPostByName($name)
$products = DB::table('templates')
->where('name', $name)
->first();
return view('singlepost', compact('products'));
路线:
Route::get('/singlepost/name', 'App\http\controllers\TemplatesController@getPostByName')->name('single.temp');
最终视图:
<h1 style="text-align: center;">ACH-template</h1>
<table>
<tr>
<td><img src="/storage/$products->image_path"></td>
<td><img src="/storage/$products->image_path2"></td>
<td><img src="/storage/$products->image_path3"></td>
<td>
<p>
<h2 style="text-align:center;">$products->name</h2>
</br>
<p>$products->description</p>
</p>
</td>
</tr>
</table>
<a href="/storage/$products->file_path" class="btn btn-primary">
<button class="btn" style="width:100%">
<i class="fa fa-download"></i> Download
</button>
</a>
【问题讨论】:
您尝试过什么来解决此错误?据我所知,这不涉及 html 或 jQuery(因为您尚未共享任何与 jQuery 相关的代码),因此请分享有关连接的更多详细信息,或删除这些标签 【参考方案1】:您定义了一个需要参数的路由:$name
。您还使用了route
帮助器生成了一个URL
,它将路由名称作为第一个参数,并将参数数组作为可选的第二个参数。
当您在 action
表单中使用 route('single.temp')
时,您还没有指定任何参数,因此 Laravel 会抛出您所看到的错误。要解决此错误,您需要将$name
参数指定为第二个参数(即route('single.temp', ['name' => 'something'])
)。这并不理想,就像您使用 $name
作为搜索词一样,您不知道页面首次呈现时的值,因此无法提供该值。
有几种方法可以实现搜索记录的目标,下面是一个基本示例,说明如何做到这一点。
web.php
定义两个路由,第一个返回带有表单的视图,另一个处理表单提交并显示结果。
Route::get('/templates', [TemplateController::class, 'index'])
->name('templates.index');
Route::get('/templates/search', [TemplateController::class, 'search')
->name('templates.search');
TemplateController.php
定义当请求上面定义的路由之一时将使用的两个函数。
class TemplateController extends Controller
// return a view
public function index()
return view('templates.search', ['templates' => []]);
// process the form submission
// perform a search for the $request search term
// return a view with the results
public function search(Request $request)
$request->validate([
'term' => ['required', 'string']
]);
$templates = Template::where('name', $request->term)->get();
return view('templates.search', ['templates' => $templates]);
templates/search.blade.php
-- create a form which will submit to the search route --
-- note I use GET rather than POST here, explained later --
<form action=" route('templates.search') " method="GET">
@csrf
<input type="text" id="term" name="term" />
<button type="submit">
__('Search')
</button>
-- loop over and show results if there are any --
@forelse ($templates as $template)
$template->name
@empty
__('Empty')
@endforelse
</form>
以上内容应该是不言自明的。我在search
中使用GET
而不是POST
的原因是因为该值将作为查询字符串参数添加到URL
,这意味着它可以轻松添加书签或共享。
【讨论】:
【参考方案2】:这个错误很容易解释。您正在尝试使用/singlepost/name
路由,但在您的刀片文件上,您正在执行route('single.temp')
,它告诉您它需要参数name
,否则它无法创建URL,因为它是一个缺少的参数。
你应该有类似的东西:
<form role="form" action="route('single.temp', ['name' => VALUE'])">
但这并不能解决您的问题,因为您正在尝试进行搜索,所以您想要/singlepost/John
之类的内容,而John
将由用户在input
字段中输入。所以你必须做一个 AJAX 调用,因为 route('single.temp')
将由 PHP 渲染并提供给用户,所以它总是会错过所需的参数。
您还可以从Request
而非 URL 参数中获取该值。
【讨论】:
可以举个例子吗? 那里有很多很好的教程,已经多次解释了这个简单的主题,而且我可以在几分钟内完成更详细的说明。所以谷歌他们,但这里有一些我发现可以帮助你,有些更先进:this is advanced,here another one but simpler以上是关于我正在尝试按名称创建搜索方法,但它显示此错误的主要内容,如果未能解决你的问题,请参考以下文章