No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

17 Días
1 Hrs
46 Min
26 Seg
Curso de Introducción a Laravel 6

Curso de Introducción a Laravel 6

Profesor Italo Morales F

Profesor Italo Morales F

Implementación del guardado

23/37
Recursos

Aportes 31

Preguntas 14

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Nunca es buena idea guardar archivos subidos por los usuarios dentro del servidor que ejecuta PHP ya que esto puede prestarse para fallas de seguridad que un atacante puede explotar, siempre es mejor almacenar dichos archivos en sistemas como S3, Azure Storage, entre otros

Tenia entendido que el all() no era conveniente usarlo.

RESUMEN
GUARDADO DE LA INFO DEL FORM DE CREACION
SISTEMA DE VALIDACION PARA EL FORM

A)
-Crear archivo de validacion: php artisan make:request PostRequest
 "app/Http/Requests/PostRequest.php

namespace App\Http\Requests; 	//ESTO LO IMPORTAREMOS DESDE PostController

 public function authorize()
    {
        return true;
    }
    public function rules()
    {
        return [
            "title" => "required",
            "body" => "required",

        ];
    }





"PostCotroller.php
Conectar el archivo de validacion al controller

CAMBIAMOS ESTO:		//use Illuminate\Http\Request;
POR ESTO :		//use App\Http\Requests\PostRequest;



public function store(PostRequest $request)
    {
        $post = Post::create([
            "user_id" => auth()->user()->id
 //obtener el campo user_id de post ||lo buscamos en autenticados/usuarios/id
        ]+ $request->all() );

        if($request->file("file")){

            $post->image= $request->file("file")->store("posts","public");
            $post->save();
        }
        
        return back()->with("status","Creado con exito");
                        
   }
 //logica FUNCION STORE:   
        //1//creamos un post con el user_id y los datos del form de creacion
        //2//agarramos toda la info del form
        //3// si recibimos img:
            // (la guardamos en carpeta storage/app/public
            //en public se generara la carpeta "posts"
            // ahi se generara una ruta, y esa ruta se guarda en base de datos )
        //4 guardamos
        //5 retornamos a la vista anterior con un alert que dice creado con exit






"Post.php
Debemos avisar que vamos a recibir muchos datos juntos en un form

class Post extends Model
{
    use Sluggable;
    
    
    protected $fillable = [
        'title', "body", 'iframe',"image" ,"user_id"
    ];



Listo ya se guarda el post con la url de la imagen

Automáticamente Laravel cambia el nombre del archivo, lo almacena con un nombre que es una combinación de letras y números, solo conserva la extensión. Con esto garantiza que no se suba una archivo con el mismo nombre.

Una alternativa a la linea en el PostController donde se extrae el id del usuario del que está de momento loggeado para el post puede ir de la siguiente manera

Usado en la clase

'user_id' => auth()->user()->id

Alternativa

'user_id' => Auth::id()

No se olvide que en la carpeta Request/PostRequest.php deben de poner true* en la siguiente function sino les lanzara un error 403

  public function authorize()
    {
        return true;
    }```
 

Implementación del guardado


❗ Los controladores que sean privados se encuentra dentro de la carpeta Controllers/Backend y los que sea público son en Controllers

Para crear un archivo request usamos este comando:

php artisan make:request PostRequest

🧇 Cuando creamos un archivos Request siempre ponemos como nombre el que tenemos como entidad en la database.

Cuando estamos modificando el método de crear, para poder obtener y salvar la imagen creamos esta configuración:

// img
if ($request->file('file')) {
    # Esta configuración está guardando la imagen en la carpeta public
    $post->image = $request->file('file')->store('posts', 'public');
}

Según la lógica que estamos haciendo es ‘Al recibir un archivo debemos salvar ese archivo’, y para esto la configuración sería 'Ese archivo debemos salvarlo para generar una ruta y esa ruta será lo que guardamos en la Database.

Nunca guardamos en la Database un archivo directamente.

Recuerda que para recibir datos tienes que poner esto multipart/form-data en el formulario, así:

<form action="{{ route('posts.store') }}" method="post" enctype="multipart/form-data">

Si les aparece el error:

Function name must be a string

es por que tienen la variable $request de la siguiente forma:

$post = Post::create (['user_id' => Auth()->user()->id]
                 + $request()->all());

Y la forma correcta es

$post = Post::create (['user_id' => Auth()->user()->id]
                 + $request->all());

Sin los (). Ahora si le quieres agregar algo mas de seguridad usa:

$post = Post::create (['user_id' => Auth()->user()->id]+ $request->validated());

Si estas usando la version 7 de laravel y te indica
403 | This action is unauthorized., haz lo siguiente:

  1. Cambiar el valor de false a true en el archivo de validacion: use App\Http\Requests\PostRequest;
 public function authorize()
    {
        return true; // cambiar de false a true. 
    }

Ya que como indica el error 403 | This action is unauthorized. aunque se pasa desapersibido al principio del video es un paso importante.

Creo que algo muy importante a recalcar es que por sobre todo estamos creando código limpio y entendible, es genial todo lo que podemos lograr con pocas lineas de código y todo gracias a Laravel

para los que les da problema con la version 8 al guardar la imagen a la base de datos (si que me dio dolor de cabeza que no lograba que se guarde).
la creación de la carpeta la cree manualmente pero luego la img le envio a esa dirección.
hay que mencionar que le agregue una validación para la imagen
en el archivo PostController.php
espero les ayude con la nueva version de Laravel 8
public function store(PostRequest $request)
{

//return $request->all();

    $post = Post::create([
        'user_id' => auth()->user()->id
    ] + $request->all());



    $request->validate([

        'title'=>'required|min:3|max:20',
        'file' =>'image|mimes:jpg,jpeg,gif,png,svg|max:2048',
        'body' =>'required'
        //'iframe'=>'required' 

    ]);

if ($request->file(‘file’)) {

    $imagenes= $request->file('file')->store('public/posts');
    $url=storage::url($imagenes);
    $post->image = $imagenes;
    $post->save();

    }

return back()->with(‘status’, ‘Creado con éxito’);

} 

Para los que tienen el error de que Requests no existe. Es debido a que el Requests se llama PostRequest. Deben cambiar en la función store el nombre del parametro Request a PostRequest.

Buenas, cuando intento guardar no me arroja ningun error pero no me guarda en base de datos y ni me aparece el mensaje de status.
Cuando inspecciono la pagina y me meto en network veo que el metodo de posts arrojo un mensaje que dice:
“failed to load response data” verifique si todo lo tenia bien escrito y en efecto no tengo errores de tipeo en el codigo… si alguien tiene alguna sugerencia o algo. por favor ayudarme, gracias.

Si poseen problemas con el almacenamiento de imágenes con la siguiente excepcion:

fopen(): Filename cannot be empty

Solo deben configurar el php.init para dar permito a la ruta TEMP

upload_tmp_dir =C:\Windows\Temp

a que se refiere e profe cuando menciona la “variable de sesión de tipo flash que se va a eliminar cuando actualicemos el navegador?” en el minuto 5:59

Excelente por la subida de archivos, lo que guardamos en la BD es la ruta del archivo que subimos

¿Alguien lo esta trabajando con laravel 8?
No me funciona el store, me manda un 302

muy bueno.

**El método store de esta clase **

public function store(PostRequest $request)
    {
        dd($request->all());
        //salvar información
        $post = Post::create([
            // El user_id se rellena con el id del usuario logueado
            'user_id' => auth()->user()->id
        ] + $request->all());

        // trabajar con imagenes
        /* 
            Si recibimos un archivo debemos salvarlos en nuestro proyecto
            para despues almacenar la url de ese archivo en la base de datos.
            Nunca guardamos un archivo como tal en la base de datos.

         */

        if($request->file('file')){
            /*
             Enviamos la imagen al servidor con el método store
             store() -> Store the uploaded file on a filesystem disk.
             El orden de store es el siguiente guardame dentro de public
             en la acrpeta store la imagen y almacena la ruta en el campo image del post.
            */
            $post->image = $request->file('file')->store('posts','public');

            // Salvamos la información
            $post->save();
        }

        // retornar resultado
        // EL método back crea una solicitud de redirección 
        // hacia la ultima ubicación antes de disparar este método
        return back()->with('status','Creado con éxito');
    }

La validación separada del controlador me permite tener código más legible y mantenible, por ello creamos el archivo PostRequest el cual tiene dos funciones

  1. authorize() ->Determina si el usuarios esta autorizado para crear una solicitud

  2. rules() -> En el se escriben las reglas de validación para darle true en la autorización al usuario para así continuar el flujo de trabajo.

public function authorize()
    {
        return true;
    }

public function rules()
    {
        return [
            'title' => 'required',
            'body' => 'required'
        ];
    }

A mi me arrojaba un error 403 Accion no autorizada, lo solucione poniendole al postRequest en el metodo autorize return true

Para las versiones mas recientes de Laravel, debemos ejecutar el comando `php artisan storage:link` y así lograr el guardado de imagenes.

Comparto mi solucion:

  • he probado otro metodo para almacenar, creando un objeo post primero
  • solo almaceno imagen en caso que la creacion del post es verdadera.
  • validacion del tipo de archivo enviado (solamente permite imagenes)
  • validacion especifica de errores para estilar cada input (realmente tedioso)
    .

Así quedó mi función store utilizando Laravel Sail y Minio

   /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(PostRequest $request)
    {
        $path = $request->file('image')->store('articles', 's3');
        Storage::disk('s3')->setVisibility($path, 'public');

        $input = $request->validated();

        if ($request->file('image')) {
            $input['image'] =  Storage::disk('s3')->url($path);
        }

        Post::create(array_merge($input, ['user_id' => Auth::id()]));

        return back()->with('status', 'Post created successfully');
    }
    public function store(PostRequest $request)
    {
        //salvar
        $post = Post::create([
            'user_id' => auth()->user()->id
        ]+ $request->all());

        //image
        if($request->file('file'))
        {
            $post->image = $request->file('file')->store('posts','public');
            $post->save();
        }

        //retornar
        return back()->with('status', 'Creado con éxito');
    }

super genial

como puedo personalizar el nombre de un archivo recibido al momento de guardarlo?

Gracias

Aquí hay otra opción para las validaciones la cual nos permite instanciar un objeto Validator sobre el request proveniente del usuario.

https://laravel.com/docs/7.x/validation#manually-creating-validators

muy buenas, como llamar funciones de la bd?

Explicación de carpeta publica para almacenamiento de archivos multimedia

excelente explicacion