我想删除项目。为此,我将项目的id从html表单传递给控制器函数destroy()。即,public function destroy (Request $request, Item $item){...}
。 Item
是一个模型。但是我没有得到函数模型,因为我已经通过这一行检查了dd($item)
。它包含null attribute
。确保$item
在函数参数contains the value of product id
中,即public function destroy (Request $request, $item){...}
。但是当我在参数中使用Model时,属性数组中没有任何内容。 (由dd($item)
检查)。我也在实施Policy in Model
。简而言之,我正在关注this tutorial。但我无法执行删除操作,因为它包含没有属性的模型。如果有人知道答案,答案将不胜感激。这是我的代码。
模型
namespace App;
use Illuminate\Database\Eloquent\Model;
class Item extends Model
{
protected $fillable = ['col1', 'col2'];
public $timestamps = false;
public function user()
{
return $this->belongsTo('App\User', 'user');
}
}
政策
namespace App\Policies;
use App\User;
use App\Item;
use Illuminate\Auth\Access\HandlesAuthorization;
class ItemPolicy
{
use HandlesAuthorization;
public function destroy(User $user, Item $item)
{
return $user->id === $item->user;
}
}
AuthServiceProvider
protected $policies = ['App\Client' => 'App\Policies\ClientPolicy'];
ItemController
use App\Item;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Repositories\ItemRepository;
public function destroy(Request $request, Item $item)
{
dd($item); //This shows empty attribute in item
$this->authorize('destroy', $item);
// Delete The Task...
$client->delete();
return view('/clients');
}
查看
<form action="{{ url('items/'.$item->id) }}" method="POST">
{!! csrf_field() !!}
{!! method_field('DELETE') !!}
<button type="submit" id="delete-item-{{ $item->id }}" class="btn btn-danger">
<i class="fa fa-btn fa-trash"></i>Delete
</button>
</form>
路线
Route::get('/', function ()
{
return view('welcome');
});
Route::group(['middleware' => ['web']], function ()
{
Route::auth();
Route::resource('items', 'ItemController');
});
如果我是对的,那么就没有与Policy和View相关的任何问题,因为我在$ item中获得了商品ID的价值。
答案 0 :(得分:3)
快速回答只需将您的路线资源重命名为单数:
Route::resource('item', 'ItemController');
你想要的是Route Model Binding并且为了实现最简单的方式php artisan routes:list
这是一个小例子供你理解,我的路线文件:
Route::get('/', function () {
return view('welcome');
});
Route::resource('list', 'ListingController');
当我运行php artisan routes:list
时,我明白了:
+--------+-----------+------------------+--------------+------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+------------------+--------------+------------------------------------------------+------------+
| | GET|HEAD | / | | Closure | |
| | POST | list | list.store | App\Http\Controllers\ListingController@store | |
| | GET|HEAD | list | list.index | App\Http\Controllers\ListingController@index | |
| | GET|HEAD | list/create | list.create | App\Http\Controllers\ListingController@create | |
| | DELETE | list/{list} | list.destroy | App\Http\Controllers\ListingController@destroy | |
| | PUT|PATCH | list/{list} | list.update | App\Http\Controllers\ListingController@update | |
| | GET|HEAD | list/{list} | list.show | App\Http\Controllers\ListingController@show | |
| | GET|HEAD | list/{list}/edit | list.edit | App\Http\Controllers\ListingController@edit | |
+--------+-----------+------------------+--------------+------------------------------------------------+------------+
因此,您可以看到我的 URI 我的参数名称 {list} ,以便路由模型绑定正常工作,您控制器上的变量名称必须完全是相同。
因此,无论是重命名路线,还是在控制器上而不是使用Item $item
,都必须使用Item $items