如何在 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 idpublic 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