Para explicar vamos ver o código abaixo:
public function edit(CadastroProdutos $produto) //lembrando que ele passa
{
return view('produtos.edit')->with('produtos', $produto);
}
Estamos assumindo que seu resource opera em produtos, correto? E que $produto é um parâmetro de URL na sua url nomeada que opera assim:
/produtos/edit/{$produto} e que na verdade vai ficar assim na sua url oficial:
http(OU https)://localhost (ou um domínio ou ip)/produtos/22/edit
Esse 22 é fictício.
A magia por baixo do capô é interessante, o Laravel coloca no singular a sua url de base, no caso /produtos ele vai entender por /produtos/id/edit e o argumento VEM NO SINGULAR ao ponto que produto no argumento da função pode ser também ao invés do tipo CadastroProdutos ser apenas um int $produto porque vem um ID inteiro no padrão.
A Sacada de usar a model CadastroProdutos como tipo de dado de $produto é que AUTOMAGICAMENTE o Elloquent vai buscar dessa model CadastroProdutos esse id que veio e já vai entregar uma instância dela com informações achadas daquele ID!
Isso evita que façamos uma chamada da classe e depois uma requisição de todos os dados para depois passarmos eles como parâmetro.
Quando digo CadastroProdutos $produto é literalmente o mesmo que dizer:
Instancie a classe CadastroProdutos, vá buscar toda informação pelo id $produto, sendo mais detalhista ainda ---> select * from CadastroProdutos where id=$produto;
O retorno é construído dentro de uma instância de objeto associativa, em resumo, ORM puro :).
E aí, na hora de chamarmos nossa view informar esse objeto associativo:
<form :action="route('produtos.update', $produto->id)" :nome="$produto->nome" />
Feito isso no form de atualização no exemplo da action update ele já tem as informações vitais do produto de id especificado :).
