douzi4724 2018-05-20 00:22
浏览 24
已采纳

too long

I'm getting the error Trying to get property 'slug' of non-object (View: C:\laragon\www\midesesources\views\products\edit.blade.php)

In the Model,

class Product extends Model
{
    // protected $primaryKey = 'slug';

    // public $incrementing = false;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'slug', 'description', 'image', 'user_id',
    ];

    /**
     * Get the route key for the model.
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return 'slug';
    }
}

In Controller,

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

        return view('products.edit')->with('product', $product);
    }

public function show(Product $product)
    {
        $product = Product::where('slug', '=', $product)->first();

        return view('products.show')->with('product', $product);
    }

In the view, (edit.blade.php)

<form role="form" method="POST" action="{{ route('products.update', $product->slug) }}">

In routes/web.php,

Route::prefix('/account')->group(function () {
    Route::get('/products', 'AccountController@products');
    Route::get('/add-product', 'ProductController@create');
    Route::get('/edit-product-{slug}', 'ProductController@edit');
    Route::put('/update-{slug}', 'ProductController@update');
});

Route::resource('products', 'ProductController');

As you can see, instead of using default CRUD resource URL, I define my own URL to go into the specific CRUD action. I'm also tried to change the $product->slug to $product->id but the results is same, I got that error.

What I'm missing here? Btw, I'm new to Laravel.

Thanks in advance.

  • 写回答

1条回答 默认 最新

  • duanji5746 2018-05-20 00:27
    关注

    If you want to use route model binding, you have to match the route parameter name to the method argument (or use explicit binding)

    Change this:

    Route::get('/edit-product-{slug}', 'ProductController@edit');
    

    To this:

    Route::get('/edit-product-{product}', 'ProductController@edit');
    

    And then the found product will be passed to the controller method, so no need to query it:

    public function edit(Product $product)
    {
        return view('products.edit')->with('product', $product);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c