The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

Name

QBit::Application - base class for create applications.

Description

It union all project models.

RO accessors

  • timelog

Package methods

init

Initialization application.

It is done:

  • Set options ApplicationPath and FrameworkPath

  • Read all configs

  • Install die handler if needed

  • Set default locale

  • Initialization accessors (see "set_accessors")

  • Preload accessors if needed

No arguments.

Example:

  my $app = Application->new(); # Application based on QBit::Application

set_accessors

Set accessors. Initialization accessors - one of the steps in sub "init". If you used set_accessors after init, call sub init_accessors.

You can use standard way for set accessors

  use Application::Model::Users accessor => 'users';
  use QBit::Application::Model::RBAC::DB accessor => 'rbac', models => {db => 'app_db'};

But use this method preferable.

Reserved keys:

  • accessor

  • package

  • models

  • init

  • app_pkg

Arguments:

  • %accessors - Accessors (type: hash). Keys is accessor name, values is options for import.

Example:

  __PACKAGE__->set_accessors(
      app_db => {
          package => 'Application::Model::DB',             # key "package" required (Package name)
      },
      rbac => {
          package => 'QBit::Application::Model::RBAC::DB',
          models => {                                      # key "models" redefine accessors into rbac
              db => 'app_db'
          },
      },
  );

  # or run time

  $app->set_accessors(...);
  $app->init_accessors();

  #after

  $app->app_db; # returns object of a class "Application::Model::DB"
  $app->rbac;   # returns object of a class "QBit::Application::Model::RBAC::DB"

  $app->rbac->db; # returns object of a class "Application::Model::DB", but into package used "QBit::Application::Model::DB::RBAC"

init_accessors

Initialization accessors. Used after calling set_accessors in run time a code

No arguments.

Example:

  $app->set_accessors(...);
  $app->init_accessors();

config_opts

Set options in config

Arguments:

  • %opts - Options (type: hash)

Example:

  __PACKAGE__->config_opts(param_name => 'Param');
  
  # later in your code:
  
  my $param = $app->get_option('param_name'); # 'Param'

use_config

Set a file in config queue. The configuration is read in sub "init". In the same place are set the settings ApplicationPath and FrameworkPath.

QBit::Application options:

  • locales - type: hash

      locales => {
          ru => {name => 'Русский', code => 'ru_RU', default => 1},
          en => {name => 'English', code => 'en_GB'},
      },
  • preload_accessors - type: int, values: 1/0 (1 - preload accessors, 0 - lazy load, default: 0)

  • install_die_handler - type: int, values: 1/0 (1 - set die handler qbit::Exceptions::die_handler, default: 0)

  • timelog_class - type: string, values: QBit::TimeLog::XS/QBit::TimeLog (default: QBit::TimeLog - this is not a production solution, in production use XS version)

  • locale_domain - type: string, value: <your domain> (used in set_locale for Locale::Messages::textdomain, default: 'application')

  • find_app_mem_cycle - type: int, values: 1/0 (1 - find memory cycle in post_run, used Devel::Cycle, default: 0)

QBit::WebInterface options:

  • error_dump_dir - type: string, value: <your path for error dumps>

  • salt - type: string, value: <your salt> (used for generate csrf token)

  • TemplateCachePath - type: string, value: <your path for template cache> (default: "/tmp")

  • show_timelog - type: int, values: 1/0 (1 - view timelog in html footer, default: 0)

  • TemplateIncludePaths - type: array of a string: value: [<your path for templates>]

      already used:
      - <project_path>/templates         # project_path   = $self->get_option('ApplicationPath')
      - <framework_path>/QBit/templates  # framework_path = $self->get_option('FrameworkPath')

QBit::WebInterface::Routing options:

  • controller_class - type: string, value: <your controller class> (default: QBit::WebInterface::Controller)

  • use_base_routing - type: int, values: 1/0 (1 - also use routing from QBit::WebInterface::Controller, 0 - only use routing from QBit::WebInterface::Routing)

Arguments:

  • $filename - Config name (type: string)

Example:

  __PACKAGE__->use_config('Application.cfg');  # or __PACKAGE__->use_config('Application.json');

  # later in your code:

  my preload_accessors = $app->get_option('preload_accessors');

read_config

read config by path or name from folder "configs".

  > tree ./Project

  Project
  ├── configs
  │   └── Application.cfg
  └── lib
      └── Application.pm

Formats:

  • cfg - perl code

      > cat ./configs/Application.cfg
    
      preload_accessors => 1,
      timelog_class => 'QBit::TimeLog::XS',
      locale_domain => 'domain.local',
      TemplateIncludePaths => ['${ApplicationPath}lib/QBit/templates'],
  • json - json format

      > cat ./configs/Application.json
    
      {
        "preload_accessors" : 1,
        "timelog_class" : "QBit::TimeLog::XS",
        "locale_domain" : "domain.local",
        "TemplateIncludePaths" : ["${ApplicationPath}lib/QBit/templates"]
      }

Arguments:

  • $filename - Config name (type: string)

Return value: Options (type: ref of a hash)

Example:

  my $config = $app->read_config('Application.cfg');

get_option

Returns option value by name

Arguments:

  • $name - Option name (type: string)

  • $default - Default value

Return value: Option value

Example:

  my $salt = $app->get_option('salt', 's3cret');

  my $stash = $app->get_option('stash', {});

set_option

Set option value by name.

Arguments:

  • $name - Option name (type: string)

  • $value - Option value

Return value: Option value

Example:

  $app->set_option('salt', 's3cret');

  $app->set_option('stash', {key => 'val'});

cur_user

set or get current user

Arguments:

  • $user - hash ref

Return value: hash ref

    my $user = {id => 1};

    $cur_user = $app->cur_user($user); # set current user

    # if use rbac
    # {id => 1, roles => {3 => {id => 3, name => 'ROLE 3', description => 'ROLE 3'}}, rights => ['RIGHT1', 'RIGHT2']}
    # or
    # {id => 1}

    $cur_user = $app->cur_user(); # return current user or {}

    $app->cur_user({}); # remove current user

set_cur_user_rights

set rights for current user

Arguments:

  • $rights - array ref

    $app->set_cur_user_rights([qw(RIGHT1 RIGHT2)]);

revoke_cur_user_rights

revoke rights for current user

Arguments:

  • $rights - array ref

    $app->revoke_cur_user_rights([qw(RIGHT1 RIGHT2)]);

refresh_rights

refresh rights for current user

    my $cur_user_id = $app->cur_user()->{'id'};

    $app->rbac->set_user_role($cur_user_id, 3); # role_id = 3

    $app->refresh_rights();

get_models

Returns all models.

No arguments.

Return value: $models - ref of a hash

Examples:

  my $models = $app->get_models();

  # $models = {
  #     users => 'Application::Model::Users',
  #     ...
  # }

get_registered_rights

Returns all registered rights

No arguments.

Return value: ref of a hash

Example:

  my $registered_rights = $app->get_registered_rights();
  
  # $registered_rights = {
  #     view_all => {
  #         name  => 'Right to view all elements',
  #         group => 'elemets'
  #     },
  #     ...
  # }

get_registered_right_groups

Returns all registered right groups.

No arguments.

Return value: $registered_right_groups - ref of a hash

Example:

  my $registered_right_groups = $app->get_registered_right_groups();

  # $registered_right_groups = {
  #     elements => 'Elements',
  # }

check_rights

Check rights for current user.

Arguments:

  • @rights - array of strings or array ref

Return value: boolean

Example:

  $app->check_rights('RIGHT1', 'RIGHT2'); # TRUE if has rights 'RIGHT1' and 'RIGHT2'

  $app->check_rights(['RIGHT1', 'RIGHT2']); # TRUE if has rights 'RIGHT1' or 'RIGHT2'

set_app_locale

Set locale for Application.

Arguments:

  • $locale_id - type: string, values: from config (key "locales")

Example:

  $app->set_app_locale('ru');

set_tmp_app_locale

Set temporary locale.

Arguments:

  • $locale_id - type: string, values: from config (key "locales")

Return value: $tmp_locale - object QBit::Application::_Utils::TmpLocale

Example:

  my $tmp_locale = $app->set_tmp_app_locale('ru');
  
  #restore locale
  undef($tmp_locale);

add_tmp_rights

Add temporary rights.

Arguments:

  • @rights - Rights (type: array of a string)

Return value: $tmp_rights - object QBit::Application::_Utils::TmpRights

Example:

  my $tmp_rights = $app->add_tmp_rights('view_all', 'edit_all');
  
  #restore rights
  undef($tmp_rights);

pre_run

Called before the request is processed.

It is done:

  • Resets current user

  • Refresh options

  • Resets timelog

  • Call "pre_run" for models

No arguments.

Example:

  $app->pre_run();

post_run

Called after the request is processed.

It is done:

  • Call "post_run" for models

  • Finish timelog

  • Call "process_timelog"

  • Find memory cycles and call "process_mem_cycles" if needed

No arguments.

Example:

  $app->post_run();

process_mem_cycles

Process memory cycles

Arguments:

  • $cycles - Cycles. (result: Devel::Cycle::find_cycle)

Return value: $text - info (type: string)

process_timelog

Process time log. Empty method.

No arguments.