A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de PHP con Laravel

Curso de PHP con Laravel

H茅ctor Benitez

H茅ctor Benitez

Fake PUT/PATCH

16/25
Recursos

En Laravel cuando usamos recursos nos pone Put y Patch como una opci贸n para modificar nuestros recursos. El problema de esto es que en un form no se puede especificar directamente que queremos hacer un Put o un Patch y por esto Laravel nos ofrece un mecanismo para hacer 鈥滷ake PUT/PATCH鈥 y podamos recibir y procesar los datos.

Para que Laravel acepte el Put o Patch es necesario poner dentro del form de manera auxiliar @method(鈥榯ipo de m茅todo usado鈥) y as铆 aunque el form tenga un POST como m茅todo, realmente ser谩 traducido al que especifiquemos dentro del auxiliar.

Aportes 31

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Para que les aparezca el valor que desean editar en el input ser铆a de esta forma

<input type="text" name="title" id="title" class="form-control" placeholder="Type in Title" value="{{ $report->title }}">

Varios consejos:

1-Una manera m谩s eficaz de colocar la ruta de un form es: action="{{ route(鈥榚xpenseReport.update鈥, $Report) }}" . As铆 colocamos el nombre de la ruta y no la url, si actualizamos a futuro la direcci贸n, no nos romper谩 al c贸digo.

2- Colocar en los campos: value="{{ old(鈥榯itle鈥, $Report->title) }}", hace dos cosas: primero, cuando enviamos un par谩metro y tenemos un error lo vuelve a colocar para no tener que escribirlo desde 0, y segundo cuando empezamos a editar en vez de tener el campo vac铆o nos pondr谩 el valor anterior, que editaremos

Tambi茅n pueden utilizar la sintaxis de blade.

{{ csrf_field() }} <[email protected]>
{{ method_field('PUT') }} <[email protected]('put')-->

El controlador tambi茅n puede quedar as铆

    public function edit(ExpenseReport $ExpenseReport)
    {
        return view('expenseReport.edit', compact('ExpenseReport'))
    }```

Les puede servir que agreguen 鈥渧alue鈥 en el <input> para obtener el valor anterior, esto es muy efectivo si tienes varios campos

<input type="text" class="form-control" id="title" name="title" value="{{ $report->title }}"

Apuntes:
En laravel, al momento de usar resources, se propone PUT y PATCH para cuando modificamos los mismos recursos. En un formulario no podemos especificar en el metodo, que vamos a usar un PUT o PATCH, aun asi Laravel propone un mecanismo para hacer un 鈥淔ake PUT/PATCH鈥 funcional.

Primeramente se debe especificar en el enlace que nos llevara a la vista de edit, lo siguiente:

  • 鈥榥ombre_carpeta/{{ $nombreVariableEspecificadaEnIndex->id }}/edit鈥

Consecuentemente, en el metodo edit(), se ponen lo siguiente:

  • $variableConsulta = Modelo::find($id);
    return view(鈥榗arpetaDentroDeView.edit鈥, [
    鈥榲ariableConsulta鈥 => $variableConsulta
    ]);

Dentro del formulario de edicion, debemos poner 鈥楡method(鈥榩ut鈥)鈥, Para que de esta forma, el metodo sea traducido a PUT.

En el action del formulario, se debe especificar el dato primario que se va a enviar a update, de la siguiente manera:

  • action="/carpeta_resource/ {{ $variable_edit->id }}"

Finalmente para completar la accion, colocamos en el metodo update():

  • $variableConsulta = Modelo::find($id);
  • $variableConsulta->atributoDB = $request->get('nameDelInput);
  • $variableConsulta->save();

return redirect(鈥/route_especificadaDelController鈥);

Genial 馃槂 da gusto cuando explican paso a paso y con lujo de detalle鈥 happy!

seria muy bueno traer la data y pintarlo en el INPUT al editar seria asi:

<input type="text" class="form-control" id="title" name="title" placeholder="Type a title" value="{{ $report->title }}">

Una alternativa a la definicion del action en el form:

action="/expense_reports/{{ $report->id}}"

es la siguiente:

action="{{ route('expense_reports.update', $report) }}"

con la cual realizamos el llamado de la funcion a partir del nombre de la ruta y no por el path.

Consideren ademas que la alternativa propuesta, requiere el envio del objeto como tal y no asi unicamente el valor del atributo

Tengo una duda a la hora de guardar imagenes en Laravel, 驴se debe guardar en la carpeta public o en la carpeta storage? gracia espero contar con su ayuda.

Si al hacer todo como dice el profesor, despu茅s del paso de poner en la funci贸n update del controlador el dd(); os muestra un error de que el m茅todo POST no est谩 soportado para esa ruta, ten茅is que a帽adir en la vista, despu茅s de @method(鈥榩ut鈥) esto:
<input name="_method" type=鈥渉idden鈥 value=鈥淧UT鈥>

Hay mejores maneras de hacer esto. Muy regular la explicaci贸n

Hola profe, excelente el tutorial hasta el momento.

findOrFail muy buena funci贸n, para cuando el id no es encontrado devuelve un mensaje de error.

Muy bien explicado, estoy contento con este curso de Laravel.

Hola a todos les comparto el repo de mi proyecto para este curso en git
https://github.com/guzmandiegoandres12/curso_laravel_platzi

Tomando en cuenta que es un solo atributo el que se esta trabajando, creo que era un buen momento para mostrar como se traen los valores 鈥渁ntiguos鈥

value ="{{ old('title', $report->title) }}"

Que bueno aprender de personas experimentados 馃槃

esta clase es arte 鉂わ笍

tengo un error en el codigo alguien me puede ayudar

el cogigo que tengo es el siguiente este es el controlador

public function edit($id)
{
$departament=departamento::find($id);

    return view('departamentos.editar',COMPACT('departament'));
        
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id)
{        
    
    $departament = departamento::find('$id');
    $departament->Nombre = $request->get('nom');
    $departament->Descripcion= $request->get('des');
    $departament->save();

    return redirect('/departamentos');
    
}

esta es la vista

    <form class="form-inline"action="/departamentos/{{$departament->Id_departamentos}}" method="post">
         @csrf
         @method('PUT');
        <div class="form-group col-md-6">
            <label for="">Nombre</label>
            <div class="col-md-10">
                <input type="text" class="form-control" placeholder="Nombre" name="nom" value="{{$departament->Nombre}}">
            </div> 
        </div>
        <div class="form-group col-md-6">
            <label for="">Descripcion</label>
            <div class="col-md-10">
                <input type="text" class="form-control" placeholder="Descripci贸n" name="des" value="{{$departament->Descripcion}}">
            </div>
        
        </div>

        <div class="col-md-10">
        <button type="submit" class="btn btn-primary">Guardar</button>
        </div>
    </form>

y esta es la ruta
Route::resource(鈥/departamentos鈥,鈥榙epartamentocontroller鈥);

YO LE PUSE <h1>Edit Report 鈥榹{$report->title}}鈥</h1>

Yo no uso la columna id sino por ejemplo client_id entonces mi enlace queda as铆:

<a href="/clients/{{ $client -> client_id }}/edit">Edit</a>

Y me manda este error:

Illuminate \ Database \ QueryException (42S22)
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: select * from `clients` where `id` = 1 limit 1)

No me busca la columna client_id sino s贸lamente id.

Hola chicos, estoy creando mi primero proyecto laravel, despues de haber cursado este cuerso con este gran maestro, y hay cosa que he cambiado que no viene en el curso por cuestiones personales y uno de ellos es el id de mi tabla, puesto que no lo deje con id, si no que lo use como id_client por cuestiones propias de identificaci贸n, ok ahi no para. Pues me tope con un error siguiente:

Error, al editar

 Illuminate \ Database \ QueryException (42S22)
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'gpem_customers.id' in 'where clause' (SQL: select * from `gpem_customers` where `gpem_customers`.`id` = 1 limit 1)

Esto pasa y en mi controlador tengo esto:

Controlador

/**
     * Show the form for editing the specified resource.
     *
     */
    public function edit($id_client)
    {
        $cliente = GpemCustomer::find( $id_client );

        return view('clientes.edit', [
          'cliente' => $cliente
        ]);
    }

Esto por que no se, y estuve buscando en la red, y me tope que a veces por regla debemos respetar el key primary como tal ya que laravel dice buscar un id que en tu tabla no esta, no se por que, en fin la solucion fue que en mi modelo, deberia decirle a laravel cual es mi key primary:

Modelo Eloquent

namespace App;

use Illuminate\Database\Eloquent\Model;

class GpemCustomer extends Model
{
  /**
   * The table associated with the model.
   *
   * @var string
   */
  //Indico mi tabla
  protected $table = 'gpem_customers';
  //Indico cual va hacer mi key primary por cuestiones del controlador edit
  protected $primaryKey = 'id_client';
}

Y asi fue que me permitio avanzar, la vdd sigo sin entender pero algo me dice que asi es el motor de laravel y que sigue un patron y que si no lo respeto sale este error, estare mal???

Que me pueden decir amigos.

Alguien me puede ayudar con este error porfavor:

![](

Existe alguna manera de que en la url se vea m谩s explicativo, es decir, que no aparezca el id, sino un texto que explique m谩s el contenido de la url?

Excelente por la actualizacion de los datos

yo no entiendo una cosa;
porque cuando construimos la function update() porque el $request no es $request->post() en vez de $request->get(), si le estamos mandando un m茅todo post a nuestro formulario, los valores deber铆an ir en post no?

Podemos agilizar el desarrollo de la creacion y la modificacion de registros a帽adiendo una funcion de 鈥渟ave鈥 con el siguiente codigo

privatefunctionsave(ExpenseReport $report, Request $request)
    {
        $report->title = $request->get('title');
        $report->save();

        return redirect(route('expense_reports.index'));
    }

Y sustituir el c贸digo que se encarga del procesado y almacenamiento por dicha funcion

Tanto en Store

public function store(Request $request)
{
$report = new ExpenseReport();

    $this->save($report, $request);
}

Como enUpdate

public function update(Request $request, $id)
{
$report = ExpenseReport::find($id);

    $this->save($report, $request);
}

De esta manera tendremos un solo sitio al que acudir en caso de tener que modificar el c贸digo tanto para update como para create

Si por alguna raz贸n se est谩 usando una versi贸n de laravel inferior, por ejemplo 5.0.16, que es mi caso porque tengo PHP 5.5 no funciona el helper

@method('put')

Se puede usar de forma manual de la siguiente manera

<input type="hidden" name="_method" value="PUT">

Por defecto, el resto de m茅todos (PUT, PATCH, DELETE, etc.) no est谩n soportados de forma nativa por los navegadores, ellos no entienden qu茅 es eso, lo que hacen frameworks como Laravel es ampliar el arsenal de m茅todos, pero para el navegador solo existe GET y POST, es por eso que en el formulario HTML enviamos a trav茅s de POST, y usamos el helper @method

Otra cosa, en el t铆tulo de 鈥淓ditando registro鈥 en lugar de poner el id, ser铆a mejor poner el nombre, a final de cuentas el id es algo que solo va a manejar nuestra aplicaci贸n, pero como buenos programadores, queremos ser lo m谩s espec铆ficos con nuestros usuarios, es por eso que imprimir: 鈥淓ditando registro vacaciones鈥 es mucho mejor que imprimir 鈥淓ditando registro 1鈥濔煒

Funci贸n findOrFail, para cuando el id no es encontrado devuelve un mensaje de error.

Para los que utilizan Laravel versiones 5.5, el @method(鈥榩ut鈥) lo imprime como texto, para evitar este error podemos utilizar {{method_field(鈥楶UT鈥)}} sustituyendo a ese @method(鈥榩ut鈥)