2017-07-17 68 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); 
    }