Laravel结合了两条路线,拥有简单的网址

时间:2018-05-20 17:29:36

标签: laravel laravel-5.6

在laravel我有这条路线:

Route::get('/', 'HomeController@index')->name('home');
Route::get('/showContent/{content}', 'HomeController@showContent');

首先是show主页,secode是show single post,现在我正在尝试将它们组合成一条路线:

Route::get('/{content?}', 'HomeController@index')->name('home');

如果content不为空,则Web应用程序必须显示单个帖子,否则显示主页与此控制器一样

public function index($slug)
{
    if ($slug != null) {
        $this->showContent($slug);
    } else {
        return view('layouts.frontend.content');
    }
}

但我得到了index函数的错误,我该如何解决?

2 个答案:

答案 0 :(得分:3)

您需要在方法签名中将$slug的默认值设置为null,如下所示:

public function index($slug = null)
{
    if ($slug != null) {
        $this->showContent($slug);
    } else {
        return view('layouts.frontend.content');
    }
}

这允许参数在控制器端是可选的,因为Laadvel路由器在访问根/时将调用控制器操作方法而没有任何参数。

  

您应该记住,将路由定义为/{parameter?}本质上是一个全部捕获,意味着任何URL 与另一个路由定义不匹配或者不是磁盘上的物理文件与此路线匹配(例如/ foo,/ bar等),因此在选择此方法时请考虑到这一点,因为您始终会为不匹配的URL执行showContent()部分。

答案 1 :(得分:2)

您可以在功能参数

中指定null作为默认值
  public function index($slug=null)
  {
     if (!$slug) {
         return view('layouts.frontend.content');
     }
     $this->showContent($slug);
  }