laravel 5.7 notificaciones database pusher

1) ir a pusher.com y registrarse

2) crear una new app

donde 
frontend: vanilla js
backend: laravel
cluster: us2

3) instalar pusher en nuestra aplicacion

composer require pusher/pusher-php-server
4) ir a la pestana de App Keys
y tomar la informacion de alli para completar los datos en .env

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=


y en resources/js/bootstrap.js

import Echo from 'laravel-echo'

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'XXXXXX',
    cluster: 'us2',
    encrypted: true
});


5)Crear en resource/components NotificationComponent.vue

<template>
<li class="nav-item d-md-down-none">
                <a class="nav-link" href="#" data-toggle="dropdown">
                    <i class="icon-bell"></i>
                    <span class="badge badge-pill badge-danger">{{notifications.length}}</span>
                </a>
                <div class="dropdown-menu dropdown-menu-right">
                    <div class="dropdown-header text-center">
                        <strong>Notificaciones</strong>
                    </div>
                    <li v-for="notification in notifications" :key="notifications.id">
                    <a class="dropdown-item" href="#">
                        <i class="fa fa-envelope-o"></i> {{notification.data.datos.articulos.titulo}}
                        <span class="badge badge-success">{{notification.data.datos.articulos.activos}}</span>
                    </a>
                    
                    </li>
                </div>
            </li>
</template>
<script>
export default {
props: ['notifications'],
        data(){
            return {
            }
        }
    }
</script>


6) agregar este componente en resources/js/app.js

Vue.component('notification', require('./components/NotificationComponent.vue'));

const app = new Vue({
    el: '#app',
    data:{
    menu:0,
    notifications:[]
    },
    created(){
    let me = this;
    axios.get('/notifications').then(function(response){
    console.log(response.data)
    me.notifications=response.data;
    }).catch(function(error){
    console.log(error);
    });
    }
});

7) en la plantilla principal reemplazar el codigo de cabecera donde se mostrabalas notificaciones por este componente:

principal.blade.php

<notification :notifications="notifications"></notification>  

8) vamos a usar  el canal "database" que es donde la informacion de las notificaciones se guardan en una tabla

php artisan notifications:table

php artisan migrate

como en laravel cada notificacion es representada por una simple clase, vamos a crear una

php artisan make:notification NotifyAdmin
lo que creara la carpeta Notifications dentro de App y dentro la clase NotifyAdmin

class NotifyAdmin extends Notification
{
   
    public $GlobalDatos;

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct(Array $datos)
    {
      $this->GlobalDatos = $datos;
    }

    public function via($notifiable)
    {
        return ['database'];
    }

    public function toDatabase($notifiable)
    {
        return ['datos' => $this->GlobalDatos];
    }


8) creamos NotificationController:

public function getAllByUser()
    {
    $user =  \Auth::user();
       
       //return Notification::where('notifiable_id','=',$user->id)->get();
       

        return $user->notifications;
     
    }
9)
creamos la ruta de este metorod en web.php

Route::get('/notifications','NotificationController@getAllByUser')->middleware('auth');


10) en este ejemplo cada vez que se crea un nuevo producto se va a crear una notificacion por cada usuario con la cantidad de articulos activos (condicion=1)

entonces en ArticuloController->store

...despues del save

$numActivos = DB::table('articulos')->where('condicion','=','1')->count();
       
        $arregloDatos = [
            'articulos' => [
                'activos' =>$numActivos,
                'titulo' => 'Articulos activos'
            ]
        ];
        $users = \App\User::all();
        foreach ($users as $user) {
            \App\User::findOrFail($user->id)->notify(new \App\Notifications\NotifyAdmin($arregloDatos));
        }

Abrir varias terminales de Ubuntu en Windows

instalar TMUX

1)

sudo apt-get install tmux

2)

tipear tmux

3)

por ejemplo podemos ir al disco C

cd /mnt/c

y desde ahi

Here is a list of a few basic tmux commands:
  • Ctrl+b " — split pane horizontally.
  • Ctrl+b % — split pane vertically.
  • Ctrl+b arrow key — switch pane.
  • Hold Ctrl+b, don’t release it and hold one of the arrow keys — resize pane.
  • Ctrl+b c — (c)reate a new window.
  • Ctrl+b n — move to the (n)ext window.
  • Ctrl+b p — move to the (p)revious window.
Other thing worth knowing is that scrolling is enabled by pressing Ctrl+b PgUp/PgDown

instalar ubuntu 16.04 en windows



1) ir a Settings -> Update & Security -> For Developers

2) habilitar Developer Mode

3) ir a Control Panel -> Programs -> Turn Windows features on or off

4) buscar y habilitar la opcion Windows Subsystem for Linux

5) reinicar la PC.

6) ir al Windows Store buscar Ubuntu e instalar Ubuntu 16.04 LTS

7) abrir Ubuntu e indicar el usuario y password para Ubuntu (no es necesario que coincidan con los de windows)

ubuntu 16.04 instalar php7.x

sudo apt-add-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.x

ubuntu 16.04 instalar npm

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs

laravel login y logout

Route::group(['middleware' => ['guest']], function () {
Route::get('/', 'Auth\LoginController@showLoginForm');
Route::match(['get','post'],'/login', 'Auth\LoginController@login')->name('login');
});

Route::match(['get','post'],'/logout','Auth\LoginController@logout')->name('logout')->middleware('auth');

Route::match(['get','post'],'/ se uso en vez de post
para evitar la exception MethodNotAllowedHttpException que dispara cuando, estando logueado, se tipea en la url /login

laravel maneja "automaticamente" a traves del middleware RedirectIfAuthenticated que cuando se esta logueado y se tipee en la url
la barra "/" o "/login" te redireccione a la ruta que hayas denominado como "home"


aunque el logout se puede  manejar para evitar ataques Cross se va a manejar a traves del method POST, entonces en la vista

<div class="dropdown-menu dropdown-menu-right">
                    <div class="dropdown-header text-center">
                        <strong>Cuenta</strong>
                    </div>
                    <a class="dropdown-item" href="#"><i class="fa fa-user"></i> Perfil</a>
                    <a class="dropdown-item" href="#" onclick="event.preventDefault(); document.getElementById('frm-logout').submit();"><i class="fa fa-lock"></i> Cerrar sesión</a>
                </div>
                <form id="frm-logout" action="{{ route('logout') }}" method="POST" style="display: none;">
                  {{ csrf_field() }}
                </form>

y en el controller:

 public function logout(Request $request)
    {
        if ($request->isMethod('post')) {
             Auth::logout();
             $request->session()->invalidate();
             return redirect('/');
        }
        return back();
     
    }




laravel crear data de prueba

por ejemplo para crear usuarios

1) creamos una clase seeder
php artisan make:seeder UsersTableSeeder

(la cual se creara dentro de database/seeds)

2) editamos el cuerpo de la clase USersTableSeeder
para indicar que modelo usaremos para crear registros y la cantidad de registros a crear

use Illuminate\Database\Seeder;
use App\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
        factory(User::class, 5)->create();
    }
}

3) ahora debemos crear la clase factory que se encuentra en database/factories
use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});

4) EN la clase DatabaseSeeder, indicamos las llamadas a los seeders que se invocaran con una llamada general

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
         $this->call(UsersTableSeeder::class);

    }
}

5)
para llamar al run de databaseSeeder
php artisan db:seed
para llamar al run del seeder en particular

php artisan db:seed --class=UsersTableSeeder

laravel localization language


modificar

config/app.php

'locale' => 'es'

debe existir, sino hay que crearla, la carpeta

resources/lang/es

si usamos en un controller por ejemplo la siguiente
return back()->withErrors(['usuario'=>trans('auth.failed')]);
     
quiere decir que existe el archivo auth.php en resources/lang/es
con la sgt estructura:

<?php

return [
    'failed' => 'Los datos ingresados no coinciden con nuestros registros.',
];

no olvidar limpiar la cache de la config:

php artisan config:cache


se puede descargar la carpeta es desde este repositorio
https://github.com/hosmelq/lang-spanish

react native 0.57 crear y ejecutar una primer aplicacion

1)
desde la consola

react-native init MiAplicacion

2) ir a la carpeta creada de la aplicacion y desde ahi:

npm add @babel/runtime

3) ir a android Studio

file->open

ir hasta la carpeta del proyecto y click en el archivo "android"

4) abrir AVD Manager

del listado de Your Virtual Devices click en el boton verde de play para lanzar ese emulador

5) desde la consola y dentro de la carpeta de la aplicacion creada:

react-native run-android


6) Si todo esta ok deberia aparecer en la pantalla del emulador el siguiente texto de prueba:

   Welcome to React Native!
   To get started, edit App.js
   Double tap R on your keyboard to reload,
   Shake or press menu button for dev menu


el cual se encuentra en App.js en la raiz del proyecto

react native 0.57 seteos iniciales

informacion obtenida de
https://facebook.github.io/react-native/docs/getting-started.html


1) instalar chocolatey, un administrador de paquetes para windows:

desde la consola

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"


2) instalar dependencias necesarias

choco install -y nodejs.install python2 jdk8

3) instalar el react cli (command line interface)

npm install -g react-native-cli

4) instalar android studio

5) al instalar android studio se instalara el ultimo sAndroid dk disponible pero para esta version de react native vamos a necesitar la

Android 8.0 (Oreo)

entonces vamos al SDK Manager
click en la pestana de SDK Platforms

(click en el checkbox inferior-derecha de "show package details")

check en Android 8.0 desplegar y verificar que esten tambien marcadas las opciones

  • Android SDK Platform 26 
  • Google APIs Intel x86 Atom_64 System Image


click en "Apply".

6)setear en las variables de entorno android_home con el valor del sdk de android

ANDROID_HOME
usalmente se encuentra en esta direccion:

c:\Users\YOUR_USERNAME\AppData\Local\Android\Sdk

7) crear un nuevo AVD android virtual device

click en el icono de AVD MAnager

click en +new Virtual Device

seleccionar el tab de Phone y click en Next

luego Select the "x86 Images" tab, then look for the Oreo API Level 26, x86_64 ABI image with a Android 8.0 (Google APIs) target.

listo
habra tambien que Install HAXM que seguramente te pedira al momento de hacerle clik en el boton triangular vede de play





ubuntu error cuando ejecutamos php.exe PHP Startup: Unable to load dynamic library '/usr/lib/php/20160303/php_mbstring.dll

PHP Startup: Unable to load dynamic library '/usr/lib/php/20160303/php_mbstring.dll



editar el php.ini

comentar con un punto-y-coma al inicio, la siguiente linea

extension=php_mbstring.dll
;extension=php_mbstring.dll ; commented out

para saber donde se encuentra este archivo:

php -i | grep -i "Loaded Configuration File"

a veces si no se tiene permisos de escritura hay que modificarlo asi

sudo chmod 755 /etc/php/7.1/cli/php.ini

sublime3 psr2 plugin

1) Ctrl+shift+p

y buscamos "instALL PACKAGE"

2) luego buscamos "codeFormatter" le damos enter para que se instale

3) vamos a

preferences->package settings->Codeformatter->Settings default

y editar la variable

  "php_path": "",

con la ruta donde se tiene instalado el php.exe

esto se puede averiguar tipeando en consola

whereis php

en mi caso es /usr/bin/php7.1

quedaria 

  "php_path": "/usr/bin/php7.1",

listo!

4) como usarlo?  

abrir el archivo que quieras formatear 

ctrl+shift+p

tipear "format code" y enter 


(para archivos php esta por default seteado para que lo formatee en psr-2)

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable