Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

como optimizar el siguiente codigo

Estas en el tema de como optimizar el siguiente codigo en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Les explico en que consiste la aplicación que estoy desarrollando: Tengo 20 crud y los cree con Laravel-4-Generators, por lo tanto tengo 20 controladores, 20 ...
  #1 (permalink)  
Antiguo 06/06/2014, 15:56
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 13 años, 7 meses
Puntos: 6
como optimizar el siguiente codigo

Les explico en que consiste la aplicación que estoy desarrollando:

Tengo 20 crud y los cree con Laravel-4-Generators, por lo tanto tengo 20 controladores, 20 modelos, y 20 directorios con sus respectivas vistas
Autenticacion de usuarios y permisos y estoy utilizando sentry.

Un requerimiento que me hicieron es que dependiendo del usuario tendrá acceso a diferentes datos.

entonces es acá donde veo que se me repite mucho el código, en cada método de cada controlador yo valido que usuario esta autenticado y dependiendo de su perfil y a la entidad a la que pertenece hago diferentes consultas a la base de datos.

cada crud tiene su entrada (osea pagina donde listo todos los registros de dicha entidad o tabla)y lo hago mediante este método

Código PHP:
Ver original
  1. //controlador
  2.  
  3. public function index()
  4.     {
  5. //obtengo el valor de la variable de sesion para obtener el perfil del usuario
  6. $perfil =Session::get('perfil');
  7. //obtener el usuario logeado
  8. $user = Sentry::getUser();
  9. //obtengo el un objeto al que pertenece el usuario logeado
  10. $observatorio = Observatory::find($user->observatorio_id);
  11. //en esta variable concateno el perfil y una cadena para saber a que entidad pertenece el usuario
  12. $perfilObservatorio = $perfil.$observatorio->alias;
  13. //este codigo lo hago en todos los metodos de los 20 controladores
  14.  
  15. //continua el switch
  16.  
  17.             switch ($perfilObservatorio) {
  18.             case 'Superadministradorovsm': //Superadministrador
  19.             $stations = Station::with('volcan')->orderBy('id', 'Asc')->get();
  20.             $submenuObservatorios = 'todos';
  21.             break;
  22.             case 'Coordinador Proyectoovsm'://Coordinador Proyecto OVSM
  23.             case 'Coordinador Proyectoovsp'://Coordinador Proyecto Ovsp
  24.             case 'Coordinador Proyectoovspop'://Coordinador Proyecto Ovspop
  25.             $stations = Station::with('volcan')->orderBy('id', 'Asc')->get();
  26.             $submenuObservatorios = 'todos';
  27.             break;
  28.             case 'Administrador Observatorioovsm': //Administrador Observatorio ovsm
  29.             case 'Administrador Observatorioovsp': //Administrador Observatorio ovsp
  30.             case 'Administrador Observatorioovspop': //Administrador Observatorio ovspop
  31.             case 'Superadministradorovsp':
  32.             case 'Superadministradorovspop':
  33.             case 'Coordinador Observatorioovsm':
  34.             case 'Coordinador Observatorioovsp':
  35.             case 'Coordinador Observatorioovspop':
  36.             case 'Tematicoovsm':
  37.             case 'Tematicoovsp':
  38.             case 'Tematicoovspop':                 
  39.             $stations = Station::with('volcan')->where('observatorio_id', '=', $user->observatorio_id )->orderBy('id', 'Asc')->get();
  40.             $submenuObservatorios ='uno';
  41.             break;
  42.             default:
  43.             break;
  44.             }
  45.  
  46. //y tengo que realizar estas consultas que no dependen del perfil o la entidad a la que pertenece el usuario
  47. //estas consultas tambien las tengo que repetir en cada uno de los metodos de los 20 controladores
  48.  
  49.                         $transmisiones = Connectivity::all();
  50.             $volcanes =Volcano::all();  
  51.             $numeroEstaciones = Station::all()->count();
  52.             $menu = 'menu.menu'.Session::get('perfil');
  53.             $nombreModulo = 'Estaciones';
  54.             $observatorios = Observatory::orderBy('id', 'Asc')->get();
  55.             $areas = Area::where('monitoreo','=','TRUE')->get();
  56.             $tiposEstaciones = Station_type::all();
  57.             return View::make('stations.index', compact('tiposEstaciones','volcanes','transmisiones','areas','observatorio','observatorios','submenuObservatorios','perfilObservatorio','stations', 'nombreModulo','perfilObservatorio','menu'));
  58.  
  59. }


yo lo que pienso hacer es una clase que valide el usuario y le entregue al controlador dicho valor y retorno la vista. estoy bien o estoy mal?

que me recomiendan?
  #2 (permalink)  
Antiguo 08/06/2014, 09:13
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: como optimizar el siguiente codigo

Vaya que tiene un problema. Una parte de tu problema es el uso de los CRUD en aplicaciones grandes crean muchas cosas que no necesitas. Esa parte la vas a tener que refactorizar para reducir el codigo que se debe de estar repitiendo en las vistas.

El uso de sentry lo vas a tener que integrar mas a Laravel. es decir usa sentry en combinación con Auth y Protección de rutas que supongo ya lo estas haciendo. La parte difícil es sacar todo lo que estas haciendo igual en los 20 controladores y para eso mi mejor recomendación es que crees la clase que comentas pero aprovecha el sistemas de eventos de laravel para sacar el código repetido. Con eso debes de reducir el tamaño de los controladores. Cuando tengas tiempo ve si puedes reducir el numero de controladores.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 08/06/2014, 15:04
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: como optimizar el siguiente codigo

hhs gracias por responde, podrias darme un ejemplo pequeño del sistema de eventos de laravel es que sinceramente no lo comprendo y lo peor no veo la utilidad.

los crud me han servido para separar las operaciones sobre cada tabla de la base de datos,ante los ojos del usuario el software tiene 20 modulos. un problema que veo es que a una vista le paso muchas objetos y colecciones
Código PHP:
Ver original
  1. return View::make('stations.index', compact('tiposEstaciones','volcanes','transmisiones','areas','observatorio','observatorios','submenuObservatorios','perfilObservatorio','stations', 'nombreModulo','perfilObservatorio','menu'));
con lo que me indicas de reducir el numero de controladores me pregunto no aumentaria el numero de cosas que envia a la vista?

Última edición por Montes28; 08/06/2014 a las 15:15
  #4 (permalink)  
Antiguo 09/06/2014, 16:41
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: como optimizar el siguiente codigo

Para ejemplos de eventos: http://www.craighooghiem.com/applica...aravel-events/.

Volviendo al tema, lo que necesitas hacer es mover el codigo que repites fuera del controlador las lineas 6-44 solo determinan detalles del usuario que ya debieras de saber cuando llega al controlador. Para lograr eso segun la documentación de Laravel puedes hacer uso de los filtros de esa forma puedes determinar el perfil, estaciones y el menú antes de que cargues el controlador correspondiente para detalles mira: http://laravel.com/docs/routing#route-filters para un ejemplo con sentry: http://laravelsnippets.com/snippets/...-route-filters.

En tu código no entiendo por que esta separado el perfil en una sesion el usuario por un lado y la entidad a la que pertenece por otro. No debieran de estar relacionados ? si ya tengo el usuario ya debiera de conocer su perfil y entidad. y no tener que determinarlos como lo haces en tu código.

Lo de los controladores no necesariamente. tu tienes 20 controladores y supongo que es uno por cada entidad de tu modelo debido al uso de los generadores de CRUD. Pero generalmente este tipo de herramientas te generan mucho código repetido y no reflejan el comportamiento real de los objetos de tu dominio.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 13/06/2014, 05:19
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: como optimizar el siguiente codigo

¿Pero no se podría haber hecho de otra manera más fácil? Pregunto, soy muy ignorante en cuanto a programación, pero creo que sí se podría haber hecho de otra manera mucho más fácil.
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 13/06/2014, 09:27
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: como optimizar el siguiente codigo

Cita:
Iniciado por guardarmicorreo Ver Mensaje
¿Pero no se podría haber hecho de otra manera más fácil? Pregunto, soy muy ignorante en cuanto a programación, pero creo que sí se podría haber hecho de otra manera mucho más fácil.
Siempre existe otra forma de manejar la complejidad, pero eso no tiene nada que ver con la programación, si no con el campo del análisis y diseño de los sistemas. Puedes ser un buen programador y eso no significa que abordes un proyecto complejo y lo hagas bien si no tienes el conocimiento necesario para analizar y diseñar software.
Lamentablemente es una practica común ir primero por las lineas de código y eso es lo mas sencillo de hacer.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: clase, laravel, objeto, siguiente, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:27.