产品删除时,Laravel Route Model Binding返回id null

时间:2016-01-18 17:14:07

标签: laravel

我正在使用laravel 5.1.28。在这里,我只想创建一个可以添加,删除和编辑产品的简单应用程序,但我注意到在使用绑定模型时,$ product实例只返回null。我接下来会解释,但首先是完整的代码(没有刀片):

在我的route.php中,我有以下产品路线:

Route::model('products', 'App\Product'); 

Route::group(array('prefix' => 'admin', 'middleware' => 'SentinelAdmin'), function ()
{

# Product Management admin backend
Route::group(array('prefix' => 'products'), function () {
    Route::get('/', array('as' => 'products', 'uses' => 'ProductController@index'));
    Route::get('create', 'ProductController@create');
    Route::post('create', 'ProductController@store');
    Route::get('{productId}/delete', array('as' => 'delete/product', 'uses' => 'ProductController@destroy'));
    Route::get('{productId}/confirm-delete', array('as' => 'confirm-delete/product', 'uses' => 'ProductController@getModalDelete'));
    Route::get('{productId}/restore', array('as' => 'restore/product', 'uses' => 'ProductController@getRestore'));
    Route::get('{productId}', array('as' => 'products.show', 'uses' => 'ProductController@show'));
});

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

});

所以,这是我简单的数据库迁移:

class CreateProductsTable extends Migration
{

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->increments('id');
        $table->string('user_id');
        $table->string('name');
        $table->string('description')->nullable();
        $table->string('category')->nullable();
        $table->decimal('price')->nullable(); 
        $table->integer('quantity')->nullable(); 
        $table->tinyInteger('in_stock')->nullable(); //0 - no, 1 - yes
        $table->string('photos')->default('default_product_photo.jpg')->nullable(); //add one first
        $table->timestamps();
    });
}
public function down()
{
    Schema::table('products', function (Blueprint $table) {

    });
}
}

在我的Product.php模型中,我有这个:

**class Product extends Model
 {
   protected $table = 'products';
   protected $guarded = ['id'];
   protected $fillable = [
    'user_id',
    'name',
    'description',
    'category',
    'price',
    'quantity',
    'in_stock',
    'photos',
];
}**

这是我在ProductController.php中的两个函数

对于下面的第一个FUNCTION getModalDelete,它将找到产品ID,并显示一个删除产品的确认框。如果单击确认按钮,将调用路径delete / product / {id},然后将destroy方法称为(第二功能)。第二个功能是问题:

class ProductController extends Controller
{
  //1st FUNCTION
  public function getModalDelete(Request $request, $id) 
  {
    $product_id = Product::where('id', '=', $id)->firstOrFail();
    $model = 'products'; ////testing s
    $confirm_route = $error = null;
    try {
        $confirm_route = route('delete/product', ['id' => $product_id]);
        return View('admin/layouts/modal_confirmation', compact('error', 'model', 'confirm_route'));
    } catch (ProductNotFoundException $e) {

        $error = trans('product/message.error.delete', compact('id'));
        return View('admin/layouts/modal_confirmation', compact('error', 'model', 'confirm_route'));
    }
  }

  //2nd FUNCTION
  public function destroy(Product $product)
  {
    Product::destroy($product);
   // $product->forceDelete(); //doesn't work either

    //dd($product); //Weird that it returns null.

    //$success = Lang::get('products/message.success.delete');

    //return Redirect::route('admin.products.index')->with('success', $success);

  }
}

但是如果我从

更改了函数的参数
public function destroy(Product $product)
{
}

public function destroy($id)
{
}

它有效。但我不知道为什么参数(Product $ product)在这里使用路径模型绑定不起作用。 $ product只返回null。但是$ id返回一个值。

1 个答案:

答案 0 :(得分:0)

发现它是前端模板上的问题:

实际上我尝试从

改变
Route::model('products', 'App\Product'); 

Route::model('product', 'App\Product'); 

在尝试发布此问题之前,由于我正在使用的前端模板问题,它无法正常工作。所以,来自@Mark Davidson的答案改变了

Route::model('products', 'Product');

Route::model('product', 'Product');

并更改

的参数
{productId} 

{product}

完美无缺。

在前端删除产品的路线有一些问题。我可以使用URL浏览器删除产品,但是没有弹出单击删除按钮,我无法调试该值。不知何故,如果我改变了

,就会出现按钮弹出窗口
Route::model('product', 'App\Product'); 

Route::model('products', 'App\Product');

但它将$ product实例返回null。问题解决了。