#¿Pero y el manejo de errores? Si por
1 messages · Page 1 of 1 (latest)
Si es ese caso si, estaba asumiendo que siempre iba a encontrar un usuario autenticado.
Ojo: tienes un mensaje de error diciendo que ocurrio un error internet, podría ser más especifico diciendo que no existe un usuario autenticado.
y la pregunta del millon es, ¿ese caso existe? ¿el caso de que no encuentre un usuario autenticado?
Cuando el token expira ¿Podría ser un caso?
Los trycatch si los estoy usando siempre para registrar cual quier error en un log ¿Lo ves buena práctica?
Es decir, usar los trycatch para el manejo de cualquier tipo de error
Porque podría crear una utilidad y simplemente llamar esa función
Insisto, no trabajo con APIs,pero veo que tu estas manejando esos error, Laravel ya te hace todo ese trabajo y no deberías encargarte de eso.
Se asume que tienes un FormRequest que va maneja tus validaciones, si por cualquier motivo esa validación falla, laravel se encarga de responder eso con un json con los mensajes de errores listos.
¡Claro!, por ejemplo el de la contraseña incorrecta, laravel ya tiene un mensaje para eso y yo ya lo tengo traducido al español.
a parte en la request ya lo tengo validado
si la quieres en español, la puedes hacer dentro del FormRequest y no tiene porqué estar en el controlador.
A esto te refieres
Claro.
Es que no tenga nada de experiencia en producción y me siento muy inseguro de que no le retorne nada útil al usuario cuando suceda una falla y con el trycatch me asegurada de por lo menos registrarlo en un log. ¿Cuándo me recomendarías usar trycatch?
@hollow magnet
no tengo respuesta exacta con el try catch, pero lo he usado cuando se hace una consulta a un servicio externo a un servicio, ya que nunca sabes si esa api esta estable o no, entonces lo puedes capturar con el try catch.
en ese caso, si te sientes inseguro, te sugiero trabajar con pruebas unitarias y con eso puedes quedarte más tranquilo.
aunque siempre recomendare realizar testing a tus aplicaciones.
Nunca he hecho testing ni siquiera en front, supongo que esa es la principal razón y no es la primera vez que escucho algo así. @hollow magnet Agradezco tu tiempo, lo valoro mucho, lo voy a aplicar 🤝
Para lo del usuario, para eso le metes un middleware que compruebe que está autenticado
de hecho, así deberían de estar protegidas todas las rutas que requieran que hay un usuario autenticado
Es cierto, incluso el router es el que verifica la autenticación. por lo tanto ese caso no existiría
Para eso son las rutas protegidas
@minor garnet $request->validared() ¿toma todos los atributos que tengo en la request o como funciona?
regresa todos los campos que se validaron
¡Interesante! pero en algunos casos necesito separarlos (ej. datos de usuario, credenciales) ¿Cómo se aplicaría para ese caso?
cómo que datos de "usuario, credenciales" ?
si tienes un UpdateUserRequest, los campos que validas ahí son todos los datos que se van a actualizar del usuario
Nota que aquí separo la request en $authProfile y $profile
En mis bases de datos siempre pretendo normalizar las credenciales de los usuarios porque algunos usuario son datos del sistema
por ejemplo hay administradores y hay donadores de reciclaje
los donadores simplemente son datos del sistema
pero es solo un ejemplo para saber si hay alguna manera de separarlo como indicas o directamente como lo estoy haciendo
pues en caso que necesites separarlo, pues sí tendrías que meter un only()
pero sigo sin entender por qué tienes que separarlo ahí
Este es el código completo
lo único que se me ocurre es que estás queriendo actualizar diferentes cosas en una misma request
lo que hago es actualizar únicamente los datos del perfil ya que no siempre actualizan el correo o la contraseña
no voy a ponerle null al password 😅
para eso pones que el campo no sea requerido (? 🤷
claro, pero aplicando la técnica que sugieres con el $user->update($request->validated());
haz la prueba imprimiendo lo que te regrese $request->validated()
hasta donde recuerdo, regresa los campos validados
si algo es opcional y no se envió, no sale ahí
por otro lado, dudo mucho que tu campo en la DB se llame currentPassword o newPassword, así que igual no es como que modificaría algo
tampoco creo que valides directamente currentPassword en el form request
a menos que estés guardando el password en texto plano 
pues ahí estás enviando el password
El otro colega, también mencionó algo sobre 'form request' ¿Qué es exactamente?
no es lo mismo no enviarlo, a enviarlo vácio
ya pero, el address sí paso como null
pero si, según tu código, estás usando un from request 
la request es una cosa, los form request extienden request
para hacer la validaciones ahí
ciertoo, ahí dice form request
quita el nullable de los passwords y no los envíes
y $request->validated() no debería de regresarlos
bueno, el current supongo que siempre se debería de enviar, no?
o cómo lo estás haciendo?
No, el current es únicamente cuando van a cambiar la contraseña como autorización
Ahí le quité los nullables
cuando envío la solicitud desde el front, la api responde
pero entonces el current le deberías de poner que es requerida si existe newPassword
te podría asegurar que sigues enviando newPassword 
bueno, también current está ahí 
¿Te refieres a que la quite del fetching?
sí, solo envía los datos que se vayan a actualizar
como dije, validated() regresa los campos que se validaron (y se enviaron)
si a las passwords le pones que pueden ser null, y las envías
pues eso, las validó y las regresa
Yo siempre envío todos los datos y me imagino que la query del update solo actualizará los que son diferentes
sí, eso hace
Me tocaría realizar la lógica para que cada formulario envíe solo los atributos que actualizaron
y por cierto, para sacar ciertos datos de los validados es con $request->safe()->only(...);
pero como dije, dudo mucho que tu campo en la DB se llame currentPassword o newPassword
así que, en teoría, no debería de afectar en nada que se incluyan
y el $fillable debería de hacer que se excluyeran de la query
Correcto
y podría hacer que si el newPassword es diferente de null, agregarlo en los campos
pero pues yo diría que los passwords no deberían de ser nullable, pero sí opcionales
y pues eso, si no los vas a actualizar, pues no los envías 🤷
¿safe() podría ser un "sanitizador"?
también podrías separar lo de actualizar los datos de usuarios y cambiar contraseña en diferentes request
Entiendo, así libero espacio en el controlador
ahí, un poco abajo, está eso:
https://laravel.com/docs/10.x/validation#form-request-validation
bueno, con eso más bien me refiero a que si newPassword es diferente de null, agregar password a los campos del request
para que se incluya en el update
Sí, con eso evito este fragmento de código y la query
simplemente actualiza la clave si ya está en la request
qué no se supone que para eso es el current_password en la validación? 🤔
Es que no lo sabía antes de aprender que existe current_password 
pero pues eso, current_password supondría que prácticamente no te sirve de nada si le pones que pueda ser nullable
bueno, sí, pero pues también pasaría si tiene null
Estoy haciendo lo de la request no sé como puedo puedo obtener cierto campos, mira:
qué estás intentando hacer ahí?
Lo que intento es construir el arreglo con las validaciones que requiero validar
pero no sé como obtener atributos especificos
y por cierto, eso más que $validated sería $rules
public function rules(Request $request): array
{
$rules = [
"name" => 'required|string|min:3|max:50',
"lastname" => 'required|string|min:3|max:50',
"address" => 'nullable|string|min:3|max:100',
"phone" => 'nullable|string|min:10|max:15',
"birthdate" => 'nullable|date',
"email" => 'required|email|max:100',
];
if ($request['newPassword'] !== null) {
$rules[] = [
"currentPassword" => 'required|current_password',
"newPassword" => ['required', 'confirmed', Password::defaults()],
];
}
return $rules;
}
y por cierto, así como lo tienes, $validated tendría una estructura como:
[
[
'currentPassword' => 'required|current_password',
'newPassword' => ['required', 'confirmed', Password::defaults()],
],
[
'name' => /* ... */,
'lastname' => /* ... */,
// ...
],
]
fatal
con esto ya sería algo como:
[
'name' => /* ... */,
'lastname' => /* ... */,
// ...
[
'currentPassword' => 'required|current_password',
'newPassword' => ['required', 'confirmed', Password::defaults()],
],
]
public function rules(Request $request): array
{
$rules = [
"name" => 'required|string|min:3|max:50',
"lastname" => 'required|string|min:3|max:50',
"address" => 'nullable|string|min:3|max:100',
"phone" => 'nullable|string|min:10|max:15',
"birthdate" => 'nullable|date',
"email" => 'required|email|max:100',
];
if ($request['newPassword'] !== null) {
$rules += [
"currentPassword" => 'required|current_password',
"newPassword" => ['required', 'confirmed', Password::defaults()],
];
}
return $rules;
}
y por cierto, no creo que rules() reciba un request
Esa es mi duda, ahí requiero tu sabiduría para no parar a irme a buscar en la doc
mejor ve a buscar a la doc
eso es lo que deberías de haber hecho desde el inicio 
solo te voy a decir, que ahí mismo estás en un Request
Vale, sí, lo hice por intentar algo, dame un par de minutos
por cierto, lo que yo te decía era algo diferente 
ya que ahí sigues sin agregar password a los campos
No lo entiendo
Mira ¿debería hacer el condicional así?
Vale lo tengo, es un objeto:
public function rules(): array
{
$rules = [
"name" => 'required|string|min:3|max:50',
"lastname" => 'required|string|min:3|max:50',
"address" => 'nullable|string|min:3|max:100',
"phone" => 'nullable|string|min:10|max:15',
"birthdate" => 'nullable|date',
"email" => 'required|email|max:100',
];
if ($this->newPassword !== null) {
$rules += [
"currentPassword" => 'required|current_password',
"newPassword" => ['required', 'confirmed', Password::defaults()],
];
}
return $rules;
}
pues eso serviría más si no los enviaras cuando no se van a actualizar
Sí deseo enviar todos los atributos porque de lo contrario tendría que hacer cierta lógica en el front para comparar cada campo y saber si ha sido actualizado. ¿Tendría algún tipo repercusión en la api?
Aunque podría crear una función que reciba los valores iniciales y los nuevos para extraer solo los diferentes 🤔
de hecho, hasta donde veo, lo único que tendrías que verificar es si el campo newPassword tiene algo
si tiene algo, lo incluyes junto con currentPassword
si no, no
de hecho, hasta ahí mismo podrías enviar password en lugar de newPassword
y ya no tendrías que andar modificando nada en el back
es que newPassword se entiende que es la nueva clave y no simplemente la clave
si estás actualizando, password se entiende que es el password 
y si estás enviando currentPassword, se entiende que ese es el actual 🤷♂️
aunque sí, entiendo que con newPassword podría ser más específico en que esa es la nueva. Pero pues eso, tendrás que poner algo para agregar password a los campos
No, tienes razón.
Finalmente lo deje como antes
sin los nullables
¿Hasta ahí lo ves bien?
Estoy aprendiendo un montón, de verdad te agradezco el tiempo
ahí lo único que diría es que currentPassword sea requerido si existe password
si mal no recuerdo, hay una condición para eso
creo que es required_with
Efectivamente, ya mire las demás alternativas pero ese es el apropiado, hice la lógica para que en front solo envíe los campos que fueron alterados y le añadí también el required_with
Pero olvidé percatarme que esas reglas también la quería usar para el store
entonces por ejemplo no puedo quitarle el required a los campos requeridos
crea otro form request 
¿Podría ser mala práctica esto?
pues es más limpio que tengas tu requests separados
de hecho, si mal no recuerdo, si al crear un modelo le pones que te cree los request, te crea 2
uno para store y otro para update
Pero los nombres funcionarían para ambos casos
¿Cómo puedo hacerlo?
Sólo me funciona con este
sí, la única vez que lo he usado desde ahí, si mal no recuerdo, fue con all
supondría que, quizás, un -r 🤷
-r = resource
entonces ni idea
revisa la ayuda a ver qué dice 🤷
pero pues igual también puedes crear los request individualmente
Le mostré mi rules al gpt y le pregunté sobre una profesional
definitivamente seguiré tu sugerencia, gracias @minor garnet
@minor garnet una última duda por favor. solo me queda el asunto del controlador, voy a aprender testing más adelante pero por ahora no sé si es necesario usar un trycatch o tal vez sobra?
Me has dado un respiro increíble
y el try para qué era? 🤔
Por si ocurre cualquier tipo de fallo que desconozca a la hora de hacer el update
Te refieres a esto?:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* The list of the inputs that are never flashed to the session on validation exceptions.
*
* @var array<int, string>
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*/
public function register(): void
{
$this->reportable(function (Throwable $e) {
//
});
}
}
por lo que vi, sí
y pues, si mal no recuerdo, Laravel ya te regresa un mensaje de error si ocurre algo
eso es solo por si quieres presonalizar alguno
o interceptarlo