在laravel 8中显示出ug弹而不是id的

问题描述

在我的laravel crud项目上做一个编辑部分。当我按下编辑键时,它将重定向edit.blade.PHP,它将调用子弹而不是其ID。我已经进行了处理,它显示Too few arguments to function App\Http\Controllers\ProductController::edit(),1 passed and exactly 2 expected

错误

我的路线

Route::get('edit/{slug}',$url. '\productController@update');
Route::get('edit',$url. '\productController@edit');

我的ProductController :: edit()

public function edit(Product $product,$slug)
    {
        return view('edit',compact('product'));
    }

我的ProductController :: update()

public function update(Request $request,Product $product,$slug)
    {
        Product::where('product_slug',$request->$slug)->update([
            'product_title' => $request->title,'product_slug'  => $request->slug,'product_image' => $request->image
            ]);

            // redirect
            return redirect('edit');
    }

我们将不胜感激,在此先感谢

解决方法

您无需担心任何事情。只需将以下代码添加到您的产品模型中:

public function getRouteKeyName()
{
    return 'slug';
}

Laravel 会处理剩下的事情。有关更多信息,请访问以下链接,他们在那里有很好的解释:

https://laravel.com/docs/8.x/routing#customizing-the-default-key-name

,

在您的编辑按钮中输入ID,而不是“ slug”

<a href="{{url('edit/'$id'')}}" class="btn btn-info btn-sm" />Edit</a>

并更改您的更新功能

public function update(Request $request,Product $product,$id)
{
    Product::where('id_column_name',$id)->update([
        'product_title' => $request->title,'product_slug'  => $request->slug,'product_image' => $request->image
        ]);

        // redirect
        return redirect('edit');
}
,

您收到此错误,因为方法中有2个参数:Product $product$slug。要解决此错误,您应该删除其中一个。

您还需要在slug路由中添加edit参数,以便在控制器中访问它。并且您的update路由应为PUTPATCH

类似这样的东西:

Route::get('products/{slug}/edit',[ProductController::class,'edit'])
Route::patch('products/{slug}','update'])

因此,您可以删除Product $product并使用$slug来获得产品:

public function edit($slug)
{
  $product = Product::where('product_slug',$slug);

  return view('edit',compact('product'));
}

public function update(Request $request,$slug)
{
  Product::where('product_slug',$slug)->update([
    'product_title' => $request->title,'product_image' => $request->image
  ]);

  // redirect
  return redirect('edit');
}

或者您可以通过将$slug设置为路由键并将路由参数更改为Product $product来删除slug并使用product

// Product model
public function getRouteKeyName()
{
  return 'slug'
}

// Product controller
public function edit(Product $product)
{
  return view('edit',Product $product)
{
  $product->update([
    'product_title' => $request->title,'product_image' => $request->image
  ]);

  // redirect
  return redirect('edit');
}

// Route
Route::get('products/{product}/edit','edit'])
Route::patch('products/{product}','update'])