我在这里有点捣蛋。我设法使用以下代码创建动态URL:
主页控制器
$satellites = DB::table('satellites')->get();
return view('pages/home', ['satellites' => $satellites]);
刀片文件
@foreach($satellites as $satellite)
<a href="{{$satellite->norad_cat_id}}"><li>{{$satellite->satname}}</li></a>
@endforeach
web.php
Route::get('{norad_cat_id}', 'Satellite@show');
控制器的
public function show($norad_cat_id)
{
return view('pages/satellite');
}
生成的URL是:mysite.com/12345(其中12345是norad_cat_id)。
此代码设法使用数据库中的norad_cat_id创建动态URL - 这就是我想要的。问题是我可以用任何东西替换URL,它仍然会创建一个页面(即用不是来自数据库的东西替换12345并且仍然创建一个页面)。
我想要的只是仅使用norad_cat_id生成的URL,如果数据库中没有匹配的norad_cat_id,则显示404页面。
答案 0 :(得分:1)
您可以通过多种方式执行此操作
该示例显示了nummeric([0-9]+
)
Route::get('{norad_cat_id}', 'Satellite@show')->where(['norad_cat_id' => '[0-9]+']);
使用findOrFail()
并在失败时显示404。
try
{
$user = Satellites::findOrFail($id);
return view('norad_cats');
}
// catch(Exception $e) catch any exception
catch(ModelNotFoundException $e)
{
return view('404');
}
答案 1 :(得分:1)
在show方法中,如果没有记录只是中止,则从数据库中添加一个提取
public function show($norad_cat_id)
{
$satellite = DB::table('satellites')->where('norad_cat_id', $norad_cat_id)->first();
if( ! satellite){
return abort(404);
}
return view('pages/satellite');
}
PS:abort会自动重定向到您的资源/ views / errors / 404.blade.php
答案 2 :(得分:0)
你可以在控制器中抛出404(例如)。只检查数据库中是否存在记录 - 如果不存在则返回错误。
示例:强>
public function show($cat_id)
{
$sattelites = DB::table('sattelites')->where('norad_cat_id', $cat_id)->get();
if ($satellites === NULL)
{
\App::abort(404);
}
return view('pages/sattelite', [
'satellites' => $satellites
]);
}
我想你明白了。
答案 3 :(得分:0)
以下是使用查询构建器的示例,这是我假设您正在使用的:
public function show($norad_cat_id)
{
$norad_cat_data = DB::table('satellites')->where('norad_cat_id', $norad_cat_id)->get();
if (!is_null($norad_cat_id)
{
return view('pages/satellite');
}
\App::abort(404);
}