Custom url for a plugin page add_rewrite_rule WordPress

After a long search finally i found a working solution. I am posting here in case someone face the similar issue, it would be helpful. Here is my working code:

add_action('template_redirect',  array($this, 'zip_template'));         
add_filter( 'rewrite_rules_array', array($this, 'zip_rule') );
add_filter( 'query_vars', array( $this, 'zip_query_vars' ) );
add_action( 'wp_loaded', array( $this, 'flush_rules' ) );

/**
* Rewrite rule
**/

public function zip_rule($rules ) {
    $newrules = array();
    $newrules['zip-backup/([^&]+)/([^&]+)'] = 'index.php?backup=$matches[1]&key=$matches[2]';
    return $newrules + $rules;
}

/**
* query parameters
**/

public function zip_query_vars($vars) {
    $vars[] = 'backup';
    $vars[] = 'key';
    return $vars;
}

/**
* Flush rules
**/

public function flush_rules(){
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['zip-backup/([^&]+)/([^&]+)'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

/**
* Callback template
**/

public function zip_template() {
    if(get_query_var('backup')) {
        add_filter('template_include', function() {
            return PLUGIN_DIR_PATH . 'zip-backup.php';
        });
    }
}