Ver Mensaje Individual
  #6 (permalink)  
Antiguo 06/07/2017, 23:38
Avatar de ArturoGallegos
ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 1 mes
Puntos: 1146
Respuesta: continue y/o brake en foreach

@xerifandtomas tienes toda toda la razón, un return me detiene todo el ciclo, lo descarte en su momento porque extrañamente un scope que utilizo en laravel mediante terminal al retornar null o false me retorna un bucle que me saturaba la memoria.

Pero después de tantas vueltas caí en cuenta que no tiene porque ser false o null, le retorne un -1 y me funciona.


@alvaro_trewhela entiendo tu punto y tienes toda la razón, para el ejemplo expuesto funciona y es valido, creo que minimice demasiado el caso y el ejemplo, debiendo explicar que usaba laravel y sus scope mediante cronjobs.

Por si a alguien le sirve, al ejecutar un cronjob en laravel (5.4) para enviar correos tenia esto

Scope: aquí es donde no podía retornar null, false o 0 porque entra en un bucle muy extenso que satura la memoria del servidor. y al utilizar continue o break arrojaba un error que detenía todo.
PHP Fatal error: 'continue' not in the 'loop' or 'switch' context in
Código PHP:
Ver original
  1. public function scopeTemplate($query, $type, $version, $data){
  2.         $result = $query->where('type', $type)->where('version', $version)->first();
  3.         if(is_null($result)){
  4. // este return es el que no me dejaba avanzar
  5.             return -1;
  6.         }
  7.  
  8.         $parsed = preg_replace_callback('/{{(.*?)}}/', function ($matches) use ($data) {
  9.             list($shortCode, $index) = $matches;
  10.             if( isset($data[trim($index)]) ) {
  11.                 return $data[trim($index)];
  12.             } else {
  13.                 throw new Exception("Shortcode {$shortCode} not found in template", 1);
  14.             }
  15.  
  16.         }, $result->template);
  17.  
  18.         return ['content' => $parsed, 'from' => $result->from, 'from_name' => $result->from_name, 'subject' => $result->subject];
  19.     }


y este es el controlador que lo llama:
Código PHP:
Ver original
  1. public function SendEmail($type, $version, $data){
  2.         $datos = User::where('id', $data['xxxx'])->first();
  3.         $xxxx_data = array(
  4.             'xxx_nombre' => $datos ->name,
  5.             'xxx_info' => $datos->firma
  6.         );
  7.         $email_data = emails_template::Template($type, $version, array_merge($data, $xxxx_data));
  8.         if($email_data == -1){
  9.             return false;
  10.         }
  11.        
  12.         Mail::send([], [], function($message) use ($email_data, $data)
  13.         {
  14.             $message
  15.                 ->to('xxxxx', 'xxxx')
  16.                 ->from('xxxxx', 'xxxx')
  17.                 ->subject($email_data['subject'])
  18.                 ->setBody($email_data['content'], 'text/html');
  19.         });
  20.     }

Dado que el scope entraba en un bucle, al validar $email_data no conseguía una respuesta o bien contenía los datos producidos durante el bucle, que no tenían relación con el valor esperado.... cualquiera que fuera el caso continuaba hasta llegar a la función Mail que hacia tronar todo el sistema de envió, de un controlador principal arriba de este.