validate validaciones personalizadas form create validation yii2 scenarios validationrules yii-validation

validation - validaciones - yii2 rule email



¿Cómo crear escenario en Yii2 sin reglas de validación activas? (2)

Tengo el modelo MyEntity.php . Como parte del script del modelo, hay algunas reglas y algunos escenarios definidos:

public function rules() { return [ [[''myentity_id'', ''myentity_title'', ''myentity_content'', ''myentity_date''], ''required''], [[''myentity_id''], ''integer''], [[''myentity_title'', ''myentity_content''], ''string'', ''max'' => 120], [[''myentity_date''], ''safe''], ]; } public function scenarios() { $scenarios = parent::scenarios(); $scenarios[''scenario_one''] = [''myentity_id'', ''myentity_title'']; $scenarios[''scenario_two''] = [''myentity_id'', ''myentity_content'']; return $scenarios; }

Necesito poder tener diferentes escenarios, y para diferentes acciones solo ciertas validaciones (por params) para estar activo. Por ejemplo, scenario_one para actionOne, scenario_two para actionTwo, etc.

Aquí hay una pequeña parte del código del controlador:

public function actionOne($id) { $modelMyEntity = $this->findModel($id); $modelMyEntity->scenario = ''scenario_one''; . . . } public function actionTwo($id) { $modelMyEntity = $this->findModel($id); $modelMyEntity->scenario = ''scenario_two''; . . . }

Ahora quiero tener un scenario_three donde NO deba haber validaciones en absoluto. Tendré verificaciones adicionales en el código que evitarán fallas mientras se guardan en la base de datos. Solo tendré que asegurarme de que no se apliquen validaciones porque impide que se envíe mi formulario. Si no aplico ningún escenario, entonces se aplica el escenario predeterminado (todas las validaciones enumeradas estarán activas, lo cual es totalmente opuesto al escenario que necesito).


Para poder hacer esto, debe hacer algunas cosas (incluso las que casi hizo usted):

  • En su controlador, escriba $modelMyEntity->scenario = ''scenario_three'';

  • En el modelo, agregue una matriz de escenarios adicional ''scenario_three'' en el método de scenarios() :

Me gusta esto:

$scenarios[''scenario_three''] = [''myentity_id'', ''myentity_content''];

  • Finalmente, la mayoría de los cambios serán necesarios en las rules() ya que deberá agregar dónde incluir o excluir escenarios específicos.

Básicamente, en cada regla, ahora puede escribir, except condicional, y señalar qué atributos no cumplirán con qué escenario. Entonces, en su ejemplo, digamos, excluyamos todos los atributos para scenario_three :

[[''myentity_id'', ''myentity_title'', ''myentity_content'', ''myentity_date''], ''required'', ''except'' => ''scenario_three''], [[''myentity_id''], ''integer'', ''except'' => ''scenario_three''], [[''myentity_title'', ''myentity_content''], ''string'', ''max'' => 120, ''except'' => ''scenario_three''], [[''myentity_date''], ''safe''],

Esta es una solución un poco diferente a cómo ignorar las reglas, pero me parece más atractivo porque en el futuro sería más fácil agregar / eliminar atributos específicos para este escenario y también será más fácil para otros desarrolladores (si hay más que solo usted) para entender lo que estás tratando de hacer

Pero creo que la solución de @ iStranger también funciona (mucho más simple).


Si entendí correctamente su pregunta, puede asignar scenario_three como scenario_three actual: el modelo no encontrará reglas coincidentes y saltará las verificaciones de validación.

public function actionThree($id) { $modelMyEntity = $this->findModel($id); $modelMyEntity->scenario = ''scenario_three''; . . . }

UPD: Sin embargo, recomiendo estrictamente definir explícitamente todos los escenarios y los atributos activos correspondientes (en el método de scenario ) y eliminar $scenarios = parent::scenarios(); , porque puede causar efectos innecesarios. La implementación principal se desarrolló principalmente para compatibilidad con Yii1, que no tiene métodos de scenarios() . Y se asume generalmente que si anula el método de scenarios() , no debe fusionar sus escenarios explícitamente definidos con la implementación principal.