Relações polimórficas de Laravel: Passando o modelo ao controlador

Eu quero usar um único controlador para salvar meus comentários para vários modelos. Então criei o CommentController, com o seguinte método de loja:

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

Na minha opinião, eu tenho:

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

Isso está funcionando. Se eu quiser usar o mesmo CommentController para armazenar os comentários para uma escola, como devo modificar o método da loja do controlador?

Não tenho certeza se esta é a convensão Laravel, mas eu fiz o seguinte:

Feito uma rota:

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

Em seguida, no controlador, obtenha o modelo e verifique contra uma série de modelos permitidos, passe o id e anexe:

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

Como eu disse, há muito provavelmente uma maneira muito melhor de realizar, mas é assim que eu fiz isso. Mantém-lo curto e doce e verifica se o modelo pode fazer um comentário.

A solução de Adão é excelente, mas eu não codificaria o espaço de nomes do modelo desse jeito. Em vez disso, o que eu faria é fazer uso da Relation::morphMap() Laravel Relation::morphMap() , você pode verificá-la aqui: https://laravel.com/docs/5.6/eloquent Relation::morphMap()

Dessa forma, você também tornará suas inputs de database mais legíveis. Eu recomendo usar um provedor de serviços para mapear os morphs.