Laravel - 使用数据库字符串创建动态URL

时间:2017-07-17 09:28:52

标签: php sql laravel laravel-5

我在这里有点捣蛋。我设法使用以下代码创建动态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页面。

4 个答案:

答案 0 :(得分:1)

您可以通过多种方式执行此操作

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

    该示例显示了nummeric([0-9]+

    Route::get('{norad_cat_id}', 'Satellite@show')->where(['norad_cat_id' => '[0-9]+']);
    
    1. 使用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);
}