Flint DartFlint Dart

✅ Data Validation in Flint Dart

Flint Dart provides powerful validation utilities to ensure your request data meets expected formats before processing. You can validate directly in handlers, use the new req.validate() shortcut, or create reusable middleware.

Simple Validation with req.validate()

Instead of writing try/catch blocks, you can callreq.validate(). If validation fails, Flint automatically catches the ValidationException and responds with an error.

Future<void> register(Request req, Response res) async {
  final body = await req.validate({
    "name": "required|string|min:3",
    "email": "required|string|email",
    "password": "required|string|min:8"
  });

  // Password hashing after validation
  body["password"] = Hashing().hash(body["password"]);

  final user = await User().create(body);

  res.json({"status": "success", "data": user.toMap()});
}

✅ Cleaner syntax, no boilerplate error handling. Flint takes care of responding with 422 Unprocessable Entity and error details.

Validator.validate (Manual)

For full control, you can still use Validator.validate() with your own try/catch handling.

try {
  final body = await req.json();
  await Validator.validate(body, {
    "email": "required|string|email|min:3",
    "name": "required|string|min:5",
    "password": "required|string|min:8"
  });
  // ...
} on ValidationException catch (e) {
  res.status(422).json({"errors": e.errors});
}

Reusable ValidationMiddleware

If multiple routes share the same rules, extract validation logic into middleware.

class ValidationMiddleware extends Middleware {
  final Map<String, String> rules;
  ValidationMiddleware(this.rules);

  @override
  Handler handle(Handler next) {
    return (Request req, Response res) async {
      final data = await req.validate(rules); // Auto-error handling
      req.attributes["validated"] = data;    // Store validated data
      await next(req, res);
    };
  }
}

Applying ValidationMiddleware

void registerUserRoutes(Flint app) {
  app.post(
    '/register',
    ValidationMiddleware({
      "email": "required|string|email",
      "name": "required|string|min:5",
      "password": "required|string|min:8",
    }).handle((req, res) async {
      final body = req.attributes["validated"];
      body["password"] = Hashing().hash(body["password"]);
      final user = await User().create(body);
      res.json({"status": "success", "data": user.toMap()});
    }),
  );
}