Por aquí quería comentarte algo que considero muy importante que es la parte de modularizar tanto tus rutas como tus controladores entiéndase las funciones o métodos controladores como lo quieras llamar es decir el que procesa la solicitud en sí Entonces para eso quiero mostrarte mi versión anterior de desarrollo libre ya que es una comparación que tengo por aquí y fíjate el montón de rutas de tipo get que tengo por aquí perfecto pueden ser que tengan muchas cosas que consultar ya que es para la API pero fíjate que si agarro aquí:
Route::get('{tutorial:url_clean}', [\App\Http\Controllers\Api\TutorialController::class, 'show']);
Route::get('/coupon/check/{coupon}', [\App\Http\Controllers\Api\CouponController::class, 'active']);
Route::get('update-progress-by-user', [App\Http\Controllers\Api\TutorialController::class, 'update_progress_by_user']);
Route::get('/get-detail/{tutorial:url_clean}', [App\Http\Controllers\Api\TutorialController::class, 'getAllDetail']);
Route::get('/by-slug/{tutorial:url_clean}', [App\Http\Controllers\Api\TutorialController::class, 'by_slug']);
Route::get('/class/free/by-slug/{tutorial:url_clean}', [App\Http\Controllers\Api\TutorialController::class, 'class_free_by_slug']);
// detalle de las clases sin ID vimeo
Route::get('{id}/class/resume', [App\Http\Controllers\Api\TutorialController::class, 'get_class']);
Route::group(['middleware' => 'auth:sanctum'], function () {
Route::post('inscribe/{tutorial:url_clean}', [App\Http\Controllers\Api\TutorialController::class, 'inscribe']);
Route::get('user/my-courses', [App\Http\Controllers\Api\TutorialController::class, 'my_courses']);
});
El de tutorial fíjate que todas son prácticamente de tipo get todas estas que tenemos aquí y por por aquí hay otra y por aquí hay otra Entonces cuál es el el motivo aquí sé que esto es un poquito abstracto pero intenta bueno entenderme un poco la entidad de tutoriales para manejar las partes de los cursos en los cursos yo tengo secciones y también las clases como en Udemy tal cual está tenemos el curso principal curso al arabel a partir de ahí tenemos secciones ahí tenemos la relación y luego a partir de ahí tenemos lo que son las clases por lo tanto es una anidación de ese tipo también tengo con los post y demás pero eso no viene tanto al lío entonces a la final lo que yo estoy haciendo por aquí es obtener el detalle de un tutorial así de simple pero depende un poco del contexto ya que si el usuario compró el el curso entonces o el tutorial va a tener más información aparte de que es diferente se está consultando el tutorial desde lo que sería el detalle es decir como si fuera una publicación o ya está consultando todo lo que es el tutorial en sí es decir que tiene que cargar las secciones y clases por lo tanto por una parte yo voy a querer que me devuelva lo que es el tutorial en sí y por otra parte que me devuelva todo el anineamiento que te comentaba y es por eso que estaba creando este montón de rutas aparte de eso también tengo un detalle interesante ante de que es que se puede consultar de diversas formas similar a lo que sucede con el post que lo podemos hacer mediante el ID o para hacerlo así se amigo mediante el slug o URL clean que es la que yo llamé por aquí la más llamada URL clean entonces aquí puedes ver un poco todo el mareo con esto cuál es el problema con esto aparte de que quedan todas estas rutas bastante feas y bastante poco comprensibles ya que empiezo a colocar nombres nombres bastante extraños y con esto, se va complicando mucho el asunto y con esto perdemos la modularización que era lo que te comentaba al inicio Entonces por aquí Fíjate cómo simplifiquen son básicamente inclusive Lo hubiera podido simplificar en solamente dos rutas pero aquí lo principal:
Route::group(['prefix' => 'tutorial'], function () {
Route::get('', [App\Http\Controllers\Api\TutorialController::class, 'getAll']); //get-detail
Route::get('simple/get-by-slug/{tutorial:url_clean}', [\App\Http\Controllers\Api\TutorialController::class, 'getSimple']);
Route::get('simple/get-by-id/{tutorial}', [\App\Http\Controllers\Api\TutorialController::class, 'getSimple']);
Route::get('full/get-by-slug/{tutorial:url_clean}', [\App\Http\Controllers\Api\TutorialController::class, 'getFull']);
Route::get('full/get-by-id/{tutorial}', [\App\Http\Controllers\Api\TutorialController::class, 'getFull']);
});
Cosa muy importante que es el primer tip que te quiero dar es que si la quieres traer por el ID y el o el slug es básicamente el mismo controlador lo único que tienes que hacer es definir una ruta adicional tal cual estás viendo por acá:
Route::get('full/get-by-slug/{tutorial:url_clean}',
Route::get('full/get-by-id/{tutorial}',
Y por lo tanto aquí lo coloqué Recuerda que esto está agrupado por acá aquí les coloqué tutorial sería tutorial simple porque es la versión como quien dice sin las clases y secciones y por aquí get by loot para el loot y get by ID recuerda que siempre se puede emplear estos comodines creo que se llaman para indicar y si no le colocas aquí nada sería por defecto por la apk que sera el ID pero no hace falta colocarlo sería el funcionamiento normal por lo tanto aquí tienes el primer tip que es que aprendas o recuerdas que podemos emplear este tipo de parámetros para indicar que filtre por un campo en particular que en este caso es el slot y con esto podemos utilizar exactamente el mismo controlador entonces ya con eso me simplifié la mitad de las rutas y para y dijo que este lo pudiéramos fusionar porque a la final era un parámetro más el que me lo da full es decir con todas las secciones y clases perfectamente hubiera podido pasar un parámetro por aquí adicional pero lo quise manejar de esa forma porque para mí era más cómodo de esta forma; como te digo por ahí simplifiquen de rutas tan feas con estos nombres que tenía horribles aquí de tital aquí desde la raíz y todo lo que puedes ver por acá en este esquema que está mucho mejor cuál es el otro tip que aprovechas los parámetros en vez de estar definiendo rutas de este tipo puedes aprovechar a leer ya sea algo de la autenticación si el usuario está autenticado entonces aprovechas y muestras más detalles y por ejemplo el usuario compró el curso entonces simplemente es un condicional o simplemente un parámetro vía request:
public function getFull(Tutorial $tutorial) //show
{
$user = auth()->user() ?? auth('sanctum')->user();
if ($user) {
// do somethig
}else{
// do somethig more
}
}
En caso de que sea así algo no protegido por ejemplo Aquí yo estoy aprovechando esto no me termina de convencer mucho pero es la forma que he podido avanzar esto también lo utilizo para cuando el usuario va a comprar el curso que es cuando yo empleo solamente en la página de información del tutorial esto lo puedes ver en la web de Academia me al listado selecciono un curso y vas a ver que no te cargo lo que son las clases y secciones directamente te cargo información del tutorial entonces utilizo este recurso mientras que cuando ya el usuario lo compró va a ver el el detalle frío simplemente lo compró y utilizaría el de que full que me devuelve toda la información de las del tutorial Entonces por aquí en vez de crear un recurso adicional para que mira calcúlame el precio y demás simplemente lo paso por aquí si aquí recibo un parámetro llamado request que me indique Mira dame el precio extra aquí simplemente sol lo calculo y se lo lo devuelvo al igual que el precio exclusivo por clases y es básicamente lo que puedes aprovechar y un poco lo mismo por aquí aquí obtengo el usuario autenticado ya es que este recurso también lo dejé como opcional es decir la autenticación es opcional ya que lo empleo tanto para la vista free del detalle como para la vista de pago y esto no hace falta pasar un parámetro por request ni deberías por dios porque si no sería algo muy fácil de hackear si no lo hago mediante santum o la sesión o sea lo que sea que esté empleando por aquí entonces si el usuario está autenticado hago un proceso y si no está hago otro proceso claro los controladores quedan un poquito más complejos que también tú lo puedes modularizar a gusto por ejemplo aquí yo creo algunos métodos de ayuda creo que lo tengo por aquí para lo que es la petición a veces lo hago por ejemplo este pero ya eso depende un poco de ti o directamente emplear Facade que no lo recomiendo mucho o directamente desde el modelo te implementas algún método o algo por el estilo pero a lo que quería de llegar y esto ya con esto ya concluyo de la importancia de modularizar tu aplicación ya que por una parte yo no sé ni qué demonios me devolví a esto de diferente a esto porque te pierdes aparte que es mucho más difícil de seguir y sobre todo de mantener no solamente por lo que te acabo de comentar sino cuando quieras agregar un nuevo parámetro vas a tener que ir probando cada uno de ellos y modificando cada uno de los controladores que tenemos aquí definidos en este desastre que tenemos acá en vez de tener algo tan limpio como lo mostrado por acá Así que ese el mensaje que te quería dar y sin más que decir nos vemos en otro video.
- Andrés Cruz
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter
Acepto recibir anuncios de interes sobre este Blog.
!Cursos desde!
4$
En Academia
Ver los cursos!Libros desde!
1$
Ver los libros