2017-07-17 71 views
1

我在这里有点笨拙。我设法使用下面的代码来创建动态网址:Laravel - 使用数据库字符串创建动态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}', '[email protected]'); 

控制器

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

好,你把任何norad_cat_id呈现网页。您应该实际从数据库加载对象并将其传递给模板。 laravel还可以检查ID是否存在。在文档中查找它。 –

回答

1

在展示方法添加从数据库中获取,如果没有记录只是中止

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:放弃将自动重定向到你的资源/视图/错误/404.blade。PHP

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 
    ]); 
} 

我觉得你的想法。

1

为此,您可以多种方式

  1. 创建一个正则表达式为norad_cat_id

的例子显示nummeric([0-9]+

Route::get('{norad_cat_id}', '[email protected]')->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'); 
    } 
    
  • 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); 
    }