es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

‘guard’ => false en las opciones de newEntity() no funciona en Cakephp4.

Ciertamente hay algo que hago mal, pero no puedo usar correctamente la opción guard del método newEntity().

// Entidad
class Bloc extends AbstractBloc
{
    protected $_accessible = [
        'guard' => false // Todos los campos están protegidos contra la asignación masiva
    ];
}

En este ejemplo, 'guard' => false no permite guardar mi entidad:

// Controlador
public function test()
{
    $entity = $this->Blocs->newEntity([
        'titre' => 'TEST ASSIGNEMENT',
        'rubrique_id' => 282,
        'description' => 'Contenido'
    ], ['guard' => false]); // guard es false pero nada cambia
    if ($this->Blocs->save($entity)) {
        return $this->redirect([...]);
    }
    else {
        die('el guardado es falso');
    }
}

¿Qué estoy haciendo mal?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Basándome en el código proporcionado, parece que estás estableciendo correctamente la opción guard en false al crear una nueva entidad. Sin embargo, dado que la propiedad $_accessible de tu entidad Bloc está configurada como ['*' => false], esto significa que todos los campos están protegidos contra asignación masiva, incluyendo los que estás tratando de establecer al crear la nueva entidad (titre, rubrique_id y description).

    Para solucionar este problema, puedes actualizar la propiedad $_accessible de tu entidad Bloc para permitir los campos que deseas establecer durante la asignación masiva, de la siguiente manera:

    class Bloc extends AbstractBloc
    {
        protected $_accessible = [
            'titre' => true,
            'rubrique_id' => true,
            'description' => true,
            '*' => false
        ];
    }
    

    O puedes establecer los valores de los campos individualmente después de crear la nueva entidad en lugar de intentar establecerlos durante la asignación masiva:

    public function test()
    {
        $entity = $this->Blocs->newEntity([], ['guard' => false]); // crear nueva entidad sin asignación masiva
        $entity->titre = 'TEST ASIGNACIÓN'; // establecer valor del campo individualmente
        $entity->rubrique_id = 282;
        $entity->description = 'Contenido';
    
        if ($this->Blocs->save($entity)) {
            return $this->redirect([...]);
        } else {
            die('save es false');
        }
    }
    

    Cualquiera de estos enfoques te permitirá crear y guardar una nueva entidad Bloc con los campos que deseas establecer.

Comments are closed.