Aviso de notificaciones en laravel

publicado por: Anonymous

Me gustaria desarrollar, un sistema de avisos con el que pueda saber cuantas solicitudes hay pendientes de tramitar, en este caso, quiero hacer esto:

introducir la descripción de la imagen aquí

(Ya se que el estilo no esta muy alla, no es prioritario ahora)

Código:

<span id="notifications" class="tag tag tag-primary tag-pill float-xs-right mr-2">5</span>
<script type= text/javascript>

    var notice = <?= $data ?>;
    console.log(notice)

    $.ajax({
        url: notifications
    }).done(function(data) {
        console.log(data);
        var response = $.parseJSON(data);
        console.log(response);
            $document.getElementById(“notifications).value = "response"; 

        });
</script>

Como pueden ver la notificación es de bootstrap, y el numero simplemente esta escrito a mano.

He escrito este método en el controlador, que simplemente hace la consulta y devuelve los datos:

public function alertas()
{
    $data = DB::table('vacations')->select('*')->count();
    print_r($data);
    return $data;
}

web.php:

 Route::get('/notifications', '[email protected]');

Mi problema esta en que;

1 – Aunque tenga definida la url o ruta en el archivo web.php no me coge la ruta el ajax.

2 – La otra manera que intente ha sido pasándole directamente los datos como parámetro al cargar la vista:

public function index()
{
    $notifications = $this->alertas();
    return view('home')->with('notifications',$notifications);   
}

Pero claro, tendría que duplicar esto para todos los controladores para que me cargue las notificaciones correctamente, ya que donde quiero mostrar las notificaciones es en el layout padre, y la verdad me ha dejado un poco dudoso, ya que no le envio datos al layout principal nunca, solo a los hijos que son los que cargan al padre, si no me equivoco claro…

He estado viendo que existe el metodo View::share, pero no me termina de funcionar ya que no obtengo los datos en la vista.

Edito:

He conseguido enviar los datos a través del AppServiceProvider, pero a la hora de implementar mi método en el boot me descuadra el estilo de las vistas.

El código que use en el AppServiceProvider es este:

View::composer('*', function($view){
        $view->with('data', $this->alertas());
});

He probado con el View::share tambien, pero no logra pasarle la variable.

Edito2: Aplicando el middleware como me propusieron he añadido en kernel el middleware, y he dejado el metodo del middleware asi:

public function handle($request, Closure $next)
{
    $data = DB::table('vacations')->select('*')->count();
    view()->share(compact('data'));
    return $next($request);
}

ruta:

    Route::get('/notifications', '[email protected]')->middleware('notif');

Metodo alertas()

public function alertas()
{
    $data = DB::table('vacations')->select('*')->where(['vacations.aceptado' => '0'])->count();
    return $data;
}

y me devuelve este error:

Undefined variable: data (View: /var/www/html/sistemalaravel/resources/views/layouts/app.blade.php) (View: /var/www/html/sistemalaravel/resources/views/layouts/app.blade.php)

No se que puedo estar haciendo mal, por lo que entiendo no esta llegando el parámetro del middleware a la vista padre. La ruta debe apuntar al middleware o algo así? Gracias.

solución

Para hacer notificaciones lo ideal sería usar WebSockets para poder recibir los datos en tiempo real, Laravel ya viene con soporte de 2 drivers, Pusher y Redis, recomendaría usar redisya que pusher es de paga, para esto también necesitarás instalar NodeJS y normalmente vas a ocupar un servidor dedicado ya que en los compartidos casi nunca te dan permisos para poder instalar librerías tales como Node.

Ahora que si quieres que se muestren las notificaciones aunque se tenga que recargar la página podrías crear un middleware y aplicarlo a las rutas que ocuparán esa variable de notificación.

1. Crear Middleware

En tu terminal ejecuta el comando

php artisan make:middleware NotificacionesMiddleware

2. Registra el Middleware creado en tu AppHttpKernel.php

En el array llamado $routeMiddleware agrégale un alias al middleware con el que lo usarás en las rutas y especifícale la ruta:

'notif' => AppHttpMiddlewareNotificacionesMiddleware::class,

3. Escribe el código que obtendrá las notificaciones

Dentro de tu middleware recién creado comparte con las vistas las variables que deseas usar:

public function handle($request, Closure $next){
   $num_notificaciones = 4;
   $otra_notificacion = 'Nuevo Mensaje';

   view()->share(compact('num_notificaciones', 'otra_notificacion'));
   return $next($request);
}

4. Aplica el middleware a la ruta, rutas o grupo de rutas que lo usarán

Una vez que ya tienes la lógica que te devolverán el número de notificaciones, debes de asignar el middleware a las rutas que te desplegarán las vistas que usarán esas variables.

Puedes hacerlo de una en una:

Route::get('/admin', '[email protected]')->name('prueba')->middleware('notif');

De esta forma, la o las vistas que ocupe, en este caso, el método index del controlador estarán disponibles.

O también, puedes aplicar el middleware a un grupo de rutas:

Route::middleware('notif')->group(function () {
   Route::get('/admin', '[email protected]')->name('prueba');
});

En ese caso, cualquier ruta dentro de ese grupo de rutas aplicará el middleware ya explicado y podrán usar las variables que está compartiendo.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *