2016-11-02 13 views
1

Я хочу использовать один контроллер для сохранения комментариев для нескольких моделей. Таким образом, я создал CommentController со следующим методом магазина:Полиморфные отношения Laravel: Передача модели контроллеру

public function store(Teacher $teacher, Request $request) 
    {  
     $input = $request->all(); 

     $comment = new Comment(); 

     $comment->user_id = Auth::user()->id; 
     $comment->body = $input['body']; 

     $teacher->comments()->save($comment); 

     return redirect()->back(); 
    } 

На мой взгляд, у меня есть:

{!! Form::open([ 
    'route' => ['teachers.comments.store', $teacher->id] 
]) !!} 

Это работает. Если я хочу использовать тот же CommentController для хранения комментариев для школы, как мне изменить метод хранения контроллера?

ответ

1

Я не уверен, если это convension Laravel, но я сделал следующее:

Сделано маршрут:

Route::post('/Comment/{model}/{id}', [ 
    // etc 
]); 

Тогда в контроллере получить модель и проверить на массив разрешенных модели, передать идентификатор через и прикрепить:

public function store(Request $request, $model, $id) { 
    $allowed = ['']; // list all models here 

    if(!in_array($model, $allowed) { 
     // return redirect back with error 
    } 

    $comment = new Comment(); 
    $comment->user_id = $request->user()->id; 
    $comment->commentable_type = 'App\\Models\\'.$model; 
    $comment->commentable_id = $id; 
    $comment->body = $request->body; 
    $comment->save(); 

    return redirect()->back(); 
} 

как я говорю, там, скорее всего, гораздо лучший способ достигнуть, но это, как я сделал это. Он держит его коротким и сладким и проверяет, может ли модель сделать комментарий.

+0

Благодарим вас за решения! Мне пришлось изменить «App \\ Models \\». $ model; 'to' 'App \\'. $ model; ' – user3253002

+1

Ах да, извините, я обычно ставил все свои модели в каталоге моделей. Рад, что это сработало для вас :) – Adam

0

Решение Адама замечательно, но я бы не стал жестко кодировать пространство имен модели таким образом. Вместо этого я бы воспользовался Laravel Relation::morphMap(), вы можете посмотреть здесь: https://laravel.com/docs/5.6/eloquent-relationships#polymorphic-relations

Таким образом, вы также сможете сделать записи в вашей базе данных более удобочитаемыми. Я рекомендую использовать поставщика услуг для отображения морфов.

Кроме того, Model базовый класс имеет getMorphClass() метод, поэтому вместо $comment->commentable_type = 'App\\Models\\'.$model; я хотел бы использовать $comment->commentable_type = $model->getMorphClass();

Таким образом, вы интегрировать логику Laravel в ваш код.

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