如何在Laravel 5.2中获得控制器功能的模型?

时间:2016-02-19 09:29:55

标签: php laravel 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){...}。但是当我在参数中使用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的价值。

1 个答案:

答案 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