Deletar
Boa noite, professor.
Para o usuário deletar apenas o que ele inseriu no banco, o mais simples seria no request fazer uma regra de validação? Tipo required|... {id}, id
Olá, "Alzcla"!
Tudo bem?
Existem muitas formas segura de garantir isso.
Uma delas (que usei nos cursos de multi-tenancy) foi usando Scopes, que filtra os registros pelo tenant_id (ou id do usuário)
Outra forma de fazer, é usando os Gates (ensino isso no curso LaraFood).
Outra maneira de fazer isso é fazer um filtro na query mesmo, manual:
->where('user_id', auth()->user()->id)
Show!
O site está ficando legal rodando...Aprendi muito com meus erros...
Valeu!
Professor, boa tarde.
Se fosse usar o authorize na agência de turismo, no aeroporto do seu código, para proibir que outros usuários editassem ou deletassem o que foi feito por outro usuário, como ficaria?
Abç
Olá, tudo bem?
Você finalizou esse ticket, tudo certo?
Acreditei que estava tudo certo, mas...fui testar uns dias depois...ele não autoriza para o usuário que fez o registro...Continuei daqui para manter o mesmo assunto...
public function surveysDestroy($idCompany, $id)
{
Gate::authorize('surveysDestroy', $id)
$survey = $this->survey->find($id);
...
}
Bom dia! Complementando...
Eu cadastro uma "companhia". Na view da companhia, eu clico em cadastrar "reclamações" da companhia.
Na tabela da companhia não há coluna user_id, mas na tabela de reclamações, tenho a coluna user_id.
Fiz "use App\Models\Companhia e vou (amanhã) tentar pegar o $user_id
Como está passando o $id e não um objeto, lá no Provider deve estar assim:
Gate::define('surveysDestroy', function (User $user, $id) {
return $user->id === $id;
});
----------
Mas o ideia seria:
// Provider
Gate::define('surveys-destroy', function (User $user, $survey) {
return $user->id === $survey->user_id;
});
// Controller
$survey = $this->survey->find($id);
Gate::authorize('surveys-destroy', $survey);
-------
DICA: O LaraFood tem um complexo sistema de ACL no projeto, pode ser muito útil para você.
Boa noite professor!
Eu estava passando $survey, mas vi que, quando tentava deletar (editar), estavam sendo visualizados os detalhes de outra empresa (ou reclamações). Lembrei que havia feito um teste e voltei o id e visualizei corretamente.
Como está passando o $id e não um objeto, lá no Provider deve estar assim:
Gate::define('surveysDestroy', function (User $user, $id) {
return $user->id === $id;
});
Testei a ideia acima e cai na página de erro... vi que lá na url... estava /site/empresa//survey(reclamações)/17 aí comecei a verificar o id da empresa...
Mas voltei para o ideal:
// Provider
Gate::define('surveys-destroy', function (User $user, $survey) {
return $user->id === $survey->user_id;
});
// Controller
$survey = $this->survey->find($id);
Gate::authorize('surveys-destroy', $survey);
Volta a cair na página de erro...
A minha tabela surveys tem user_id e empresa_id e os relacionamentos...
As tabelas empresas e users não possuem relacionamentos com chaves estrangeiras...
Se eu tivesse tabela pivô, eu iria para o "attech e detach"...
Criei uma coluna user_id na tabela empresas. Vou salvar um auth()->user() e tentar salvar na outra tabela de reclamações...
O LaraFood tem um complexo sistema de ACL no projeto, pode ser muito útil para você:
Eu segui o curso da agência de Turismo e qdo veio a origem e destination, fiquei confuso em adaptar... Mais a frente, há a visualização do voo e depois é creado e feita a reserva...mais ou menos isso. Aí é que acontece a mágica de salvar tudo no mesmo usuário...
Certo!?
Abç
Se isso daqui está gerando uma página de erro (403), é porque o user_id de survey está diferente do id do usuário autenticado:
$survey = $this->survey->find($id);
// faça o teste
dd($survey->user_id == auth()->user()->id);
Gate::authorize('surveys-destroy', $survey);
-----------------
Sobre essa parte aqui:
As tabelas empresas e users não possuem relacionamentos com chaves estrangeiras...
Se eu tivesse tabela pivô, eu iria para o "attech e detach".
RE: Sinceramente não entendi nada do que quis dizer. É o que eu sempre te oriento amigo, eu estou fora do seu projeto, não faço ideia de como implementou e menos ainda da lógica que usou.
---------------------
Mais a frente, há a visualização do voo e depois é creado e feita a reserva...mais ou menos isso. Aí é que acontece a mágica de salvar tudo no mesmo usuário...
RE: Também não entendi o que quis dizer...
Professor,
Sinceramente não entendi nada do que quis dizer. É o que eu sempre te oriento amigo, eu estou fora do seu projeto, não faço ideia de como implementou e menos ainda da lógica que usou
Minha referência são seus cursos. Seu código. Lembra plans, details, tenant, profiles, permissions? Para vincular os detalhes de um plano, foi usado "attech" e "detach". Usei entre aspas pq não lembrei a grafia correta... Sobre esses métodos, li na documentação do láravel que se usa uma tabela pivô...mas deve ser um caso particular...
Também não entendi o que quis dizer...
Sobre isso segui as suas aulas do curso de agência de turismo...mas não entrei na aula de reservas... Agora a pouco, assisti essas aulas até a aula de cadastro de reservas... e já tirei umas dúvidas nessas aulas...
Posta o código, e diga exatamente onde está o problema. É porque sem ver o seu código e entender o real problema não consigo te ajudar.
No aguardo amigo.
Professor! Um momento...Eu troquei o HD para o de SSD. Só não achei ainda o arquivo do projeto.
Ok, se possível faça um vídeo também, porque fica mais fácil de te entender o problema.
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!