Como generar una clave nueva para nuestra app de Laravel (APP_KEY) a través de web sin usar la linea de comandos

Para generar una clave nueva para nuestra app de Laravel (APP_KEY) a través de web sin usar la linea de comandos podemos crear una ruta que llame a Artisan:
El comando para generar la clave es «key:generate» y para poner argumentos se pone en forma de array a continuación. Conseguimos la salida de Artisan con «Artisan::output()» a la que solo nos falta limpiar con rtrim.

Route::get('/generate-key', function() {
    Artisan::call('key:generate',['--show' => true]);
    $key = rtrim(Artisan::output());
    return $key;
});

Podemos hacer también que la escriba directamente, para esto debemos tener permisos de escritura en .env

Route::get('/write-key', function() {
    Artisan::call('key:generate');
});

Y si estamos en producción y queremos aún así generar y escribir la clave

Route::get('/force-write-key', function() {
    Artisan::call('key:generate',['--force' => true]);
});

Validación con Laravel, aclaración

Si quieres hacer una validación normal, por ejemplo de un formulario, que si falla vuelva a él, con los errores y los datos, usamos validator::make

Validator::make($request->all(), $rules)->validate();

Si queremos añadir una regla propia de validación, usamos esto mismo pero con after:

Validator::make($request->all(), $rules)->after(function ($validator) use ($request){
    if (session('captcha') != $request->input('captcha')) {
        $validator->errors()->add(
            'captcha', trans('Código incorrecto')
        );
    }
})->validate();

Y que pasa si cuando sucede un error y mostramos los errores, en vez de los nombres de los campos del formulario queremos poner otra cosa, como un nombre más descriptivo:

Validator::make($request->all(), $rules)->setAttributeNames(['idField' => trans('NOmbre más descripticvo del campo')])->validate();

Y si al mostrar los errores en vez de usar los mensajes por defecto queremos personalizar los mensajes de error:

$msg = [
    'required' => 'Es necesario que rellenes :attribute'
];
Validator::make($request->all(), $rules, $msg)->validate();

Si cuando falle, queremos hacer otra cosa, que no sea volver a la página anterior:

$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) { ... }

Reglas de validación aquí

Laravel y CKeditor 4, galeria de imágenes

Para mostrar la galería de imágenes se debe incluir el plugin «imagebrowser» e indicar la ruta donde obtener un json con las imágenes

    extraPlugins: 'imagebrowser',
    imageBrowser_listUrl: '/img',

el json de las imágenes de un directorio se podria obtener así:

use URL;
use File;
    public function img(Request $request) {
        $data = [];
        $files = File::files(public_path('uploads'));
        foreach($files as $file){
            $data[] = [
                'image'=> URL::asset('uploads/'.$file->getFilename()),
                //'thumb'=>'',
                //'folder'=> ''
            ];
        }
        return response()->json($data);
    }

puedes ver como subir una imagen a ckeditor4 aquí

Como subir imágenes con CKEditor 4 y Laravel 8

Para que salga la opción de subir imágenes se tiene que especificar una ruta en la configuración, sino, no te sale la pestaña con esa opción:

CKEDITOR.replace( '{{$id}}', {
    language: '{{app()->getLocale()}}',
    filebrowserUploadUrl: '/upload',

Como Laravel incluye, correctamente, protección CSRF, debemos añadirla a la petición de subida ampliando la configuración del CKEditor:

CKEDITOR.replace( '{{$id}}', {
    language: '{{app()->getLocale()}}',
    filebrowserUploadUrl: '/upload',
    fileTools_requestHeaders: {
        'X-Requested-With': 'XMLHttpRequest',
        'X-CSRF-TOKEN': '{{ csrf_token() }}'
    }
}

Luego ya solo tienes que incluir la ruta y crear el controlador para almacenar la imagen. Teniendo en cuenta eso si la respuesta que espera CKEDitor

use URL;
class UploadController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function upload(Request $request, $language) {
        $validator = Validator::make($request->all(), [
            'upload' => 'required|image|mimes:jpeg,png,jpg'
        ]);

        if ($validator->fails()) {
            return response()->json([
                'error' => [
                    'message' => $validator->errors()->first()
                ]
            ], 422);
        }

        $filename = time().'.'.$request->upload->extension();
        $request->upload->move(public_path('upload'), $filename);
            return response()->json([
                'uploaded' => 1,
                'fileName' => $request->upload->getClientOriginalName(),
                'url' => URL::asset('upload/'.$filename)
            ]);
    }
}

Por cierto, si hay errores en la subida (cualquier validación que incluyas) ckeditor espera esta estructura anterior para mostrar el mensaje que quieras. Nosotros usamos el primero, pues solo hay un campo.

También puedes ver como hacer la galería aquí

Acelerar páginas o procesos con la cache de Laravel

Se puede acelerar procesos, o páginas con la cache de Laravel

La página se puede encerrar con una función «Cache::remember» guardándola con una clave única, por ejemplo para una hora y un listado de json:

$resultado_json = Cache::remember("listado-".$id, 3600, function () use ($request) {
    return Productos::all()->toJson();
});
return $resultado_json;

Claro, ¿qué pasa si cambian los productos? podemos escuchar el modelo en su evento «saved» que lee tanto los «updates» como los «inserts» y el evento «deleted» para borrar la cache:

    protected static function booted()
    {
        static::saved(function ($user) {
            Cache::flush();
        });
        static::deleted(function ($user) {
            Cache::flush();
        });
    }