【问题标题】:Laravel route optional parameter issueLaravel 路由可选参数问题
【发布时间】:2016-09-21 12:34:37
【问题描述】:

我的路线是:

Route::get('members/{name?}/{id}', 'Sample1Controller@sampleFn1');
Route::get('members/{id}/edit', 'Sample2Controller@sampleFn2');

当我点击刀片中的 url 链接时,

<a href="members/1/edit">Edit</a>

它转到第一个路由并调用 Sample1Controller@sampleFn1。为什么??请帮忙..

当我单击链接时..我想走第二条路线并调用 Sample2Controller@sampleFn2。有什么帮助吗?

提前致谢。

【问题讨论】:

  • 当你访问members/1/edit时,因为它可以匹配你在那里的任何一条路线,它会选择第一个,1 = $name 和edit = $id。始终将带有参数的路由放在最后,将带有静态文本的路由放在首位。您还可以在路线上执行过滤器或 where 子句,例如下面的一些答案

标签: laravel routes blade restful-url


【解决方案1】:

您需要将路由条件添加到参数。我的第一个问题是针对 stings,第二个是针对整数:

Route::get('members/{name?}/{id}', 'Sample1Controller@sampleFn1')->where([
    'name' => '[a-z]+',
    'id' => '[0-9]+',
]);
Route::get('members/{id}/edit', 'Sample2Controller@sampleFn2')->where([
    'id' => '[0-9]+'
]);

【讨论】:

    【解决方案2】:
    Route::get('members/{name?}/{id}', 'Sample1Controller@sampleFn1');
    

    对于 laravel,两个 URL 看起来都一样,在这种情况下,$name 被设置为“1”,而 $id 被设置为“edit”。 您需要通过将可选参数移到末尾来避免歧义 并且状态文本向后一级,在这种情况下:

    Route::get('members/edit/{id}', 'Sample2Controller@sampleFn2');
    Route::get('members/{id}/{name?}', 'Sample1Controller@sampleFn1');
    

    【讨论】:

      【解决方案3】:

      它不会针对任何特定约束验证名称或 ID,因此您 /1/edit 有资格...使用相同的路由定义,您可以简单地颠倒定义的顺序。

      【讨论】:

        【解决方案4】:

        尝试以下方法:

        Route::get('members/{id}/edit', 'Sample2Controller@sampleFn2');
        Route::get('members/{name?}/{id}', 'Sample1Controller@sampleFn1');
        

        【讨论】:

          【解决方案5】:
                Route::get('/post-delete/{post_id}',[
          'uses' => 'PostController@getDeletePost',
          'as' => 'post.delete',
          'middleware' => 'auth'
          ]);
          

          我的控制器是这样的

          public function getDeletePost($post_id)
          {
              $post = Post::where('id',$post_id)->first();
              if(Auth::user() != $post->user)
              {
                  return redirect()->back();
              }
              $post->delete();
              return redirect()->route('dashboard')->with(['message' => 'Sucessfully Deleted Taunt']);
          }
          

          而我的blade.php是这样的

            <a href="{{ route('post.delete',['post_id' => $post->id]) }}">Delete</a>
          

          上面的代码是删除你可以尝试编辑

          【讨论】:

            猜你喜欢
            • 2020-02-08
            • 2015-02-05
            • 1970-01-01
            • 2014-10-13
            • 1970-01-01
            • 1970-01-01
            • 2018-01-08
            相关资源
            最近更新 更多