如何在 Laravel 5.2 中获取具有控制器功能的模型?
How to get a Model in function of controller in Laravel 5.2?
我想删除项目。为此,我将项目的 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){...}
。但是当我在参数中使用模型时,属性数组中没有任何内容。 (由 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'];
物品控制器
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');
});
如果我是对的,那么就没有任何与策略和视图相关的问题,因为我在 $item 中获取项目 ID 的值。
快速回答只需将您的路线资源重命名为单数即可:
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
我想删除项目。为此,我将项目的 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){...}
。但是当我在参数中使用模型时,属性数组中没有任何内容。 (由 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'];
物品控制器
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');
});
如果我是对的,那么就没有任何与策略和视图相关的问题,因为我在 $item 中获取项目 ID 的值。
快速回答只需将您的路线资源重命名为单数即可:
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