我正在使用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返回一个值。
答案 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。问题解决了。