2016-02-19 2 views
2

Я хочу удалить элемент. Для этого я передаю id элемента из html-формы функции контроллера destroy(). т. е. public function destroy (Request $request, Item $item){...}. Item - это модель. Но я не получаю модель в функции, как я проверил по этой строке, dd($item). Он содержит null attribute. Уверен, что $item в функциональных параметрах contains the value of product id i.e, public function destroy (Request $request, $item){...}. Но когда я использую Model в параметрах, в массиве атрибутов ничего нет. (Проверено dd($item)). Я также реализую Policy in Model. Короче говоря, я следую this tutorial. Но я не могу выполнять операцию удаления, поскольку он содержит модель без атрибутов. Если кто-нибудь знает ответ, ответ будет оценен. Вот мой код.Как получить модель в функции контроллера в Laravel 5.2?

Модель

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'); 
    } 
} 

Политика

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'); 
}); 

Если я прав, то нет какой-либо вопрос, связанный с политикой и видом, как я m получает значение идентификатора товара в $ item.

+0

Вы можете разместить код для ваших маршрутов, а также форму, а? – Donkarnash

+1

Я получаю контроль над методом destroy() элемента ItemController даже со значением $ item. Поэтому в этих сценариях не должно быть никаких проблем.Но по вашему запросу я отправляю сообщение. –

+0

Итак, из формы вы просто передаете идентификатор элемента $ в качестве параметра, поэтому, когда в вашем ItemController вы пытаетесь получить доступ (Model) $ item, он показывает null, потому что параметр содержит только идентификатор, а не полную модель. – Donkarnash

ответ

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\[email protected] |   | 
|  | GET|HEAD | list    | list.index | App\Http\Controllers\[email protected] |   | 
|  | GET|HEAD | list/create  | list.create | App\Http\Controllers\[email protected] |   | 
|  | DELETE | list/{list}  | list.destroy | App\Http\Controllers\[email protected] |   | 
|  | PUT|PATCH | list/{list}  | list.update | App\Http\Controllers\[email protected] |   | 
|  | GET|HEAD | list/{list}  | list.show | App\Http\Controllers\[email protected] |   | 
|  | GET|HEAD | list/{list}/edit | list.edit | App\Http\Controllers\[email protected] |   | 
+--------+-----------+------------------+--------------+------------------------------------------------+------------+ 

Так есть вы можете видеть, что мой URI имя моих параметров {список} для модели маршрута привязки к работе, ваше имя переменной на контроллере должен быть точно такой же.

Так что вы либо переименовать ваши маршруты, или на контроллере вместо использования Item $item, вы должны использовать Item $items

Смежные вопросы