The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Reaction::Manual::Clipboard - snippets of Reaction docs

These should probably go in the glossary.

Domain Model

DBIx::Class::Schema, MyApp::Foo, MyApp::Bar, etc.

Interface Model

InterfaceModel::DBIC::Schema, InterfaceModel::Action, MyApp::InterfaceModel::Foo classes.

Controller

Mediation and navigation.

ViewPort

Event handling encapsulation.

Widget

View logic.

Renderer

MyApp::View:: classes, renders viewports.

These should go in the tutorial?

SETTING UP A REACTION APPLICATION

Reaction applications are set up just like Catalyst:

$ catalyst.pl MyApp
# output ommited
$ cd MyApp

Models

Reaction provides a reflector component which automagically maps a DBIx::Class::Schema into a set of Interface Models which can be used by Reaction to build the interface components. If you're not familiar with DBIx::Class or don't have a schema handy, now is a good time to go through DBIx::Class::Manual::Intro to get a schema set up.

It is important that your Result-objects implement the meta-protocol of Moose. One way to achive that is to do the following:

package MyApp::Schema::Result::Bar;
use base 'DBIx::Class';
use Moose;

has 'name' => (isa => 'Str', required => 1, rw => 1);

use namespace::autoclean;

__PACKAGE__->load_components(qw(Core));
__PACKAGE__->table('bar');
__PACKAGE__->add_columns(
    name => {
        data_type   => 'varchar',
        size        => 255,
        is_nullable => 0,
    }
);
__PACKAGE__->primary_key('name');
1;

Once you have your schema set up like that, you can create the InferfaceModel:

package MyApp::InterfaceModel::DBIC;

use base 'Reaction::InterfaceModel::Object';
use Reaction::InterfaceModel::Reflector::DBIC;

my $reflector = Reaction::InterfaceModel::Reflector::DBIC->new;

$reflector->reflect_schema(
     model_class  => __PACKAGE__,
     schema_class => 'MyApp::Schema',
     sources => [qw/Foo Baz/],
);

1;

Then you create a MyApp::Model that uses this InferfaceModel:

package Myapp::Model::IM;

use Reaction::Class;

extends 'Catalyst::Model::Reaction::InterfaceModel::DBIC';

1;

Controllers

Root controller

Your Reaction application must have a Root controller which inherits from Reaction::UI::Controller::Root.

package MyApp::Controller::Root;

use warnings;
use strict;
use base qw/Reaction::UI::Controller::Root/;

__PACKAGE__->config(
    view_name => 'Site',
    window_title => 'My Reaction App',
    namespace => ''
);

sub base : Chained('/') PathPart('') CaptureArgs(0) {
    # do some setup for every request
    # also provides a chain root for other controllers to use
}

1;

Individual controllers

For each Collection(table?) in your DB, you need to create a controller

package MyApp::Controller::Foo;

use base 'Reaction::UI::Controller::Collection::CRUD';
use Reaction::Class;

__PACKAGE__->config(
  model_name => 'IM',   # This corresponds to the name of the MyApp::Model you created earlier
  collection_name => 'Foo', # Name of one of the sources in your InterfaceModel
  action => {
    base => { Chained => '/base',  # chain to the base action in the root controller
              PathPart => 'foo' },
  },
);

1;

XX TODO

View

One of the views in your application should look something like this:

package MyApp::View::TT;

use Reaction::Class;

extends 'Reaction::UI::View::TT';

1;

__END__;

XX TODO

SEE ALSO

AUTHORS

See Reaction::Class for authors.

LICENSE

See Reaction::Class for the license.