Dancer is a RESTful framework like Sinatra but I want to use Dancer in a MVC application model because allow us to have more efficient code reusing components and separate the logic, the data management and the way the information is displayed.
What is MVC?
There are a lot of tutorials everywhere explaining what MVC is. As a quick explanation, MVC stand for Model View Controller. Model is the data, View is an interface to view the data that is changed or processed in the Controller. To know more about MVC you may read these:
The Model
This is all about this post will be: The Model. As mentioned above, the model does nothing else but data management. It does not depend of the controller or the view.
There are a lot of Perl modules to handle the data. I use Dancer::Plugin::Database which use DBI::db module, however there are others modules such as Rose::DB and Dancer::Plugin::DBIC which use DBIx::Class. I'll provide an example with Dancer::Plugin::Database and Dancer::Plugin::DBIC.
Dancer::Plugin::Database
I use Dancer::Plugin::Database for projects that do not require a complex database design. It handle the connection to the database and it support many database managers such as SQLite, MySQL, PostgresSQL, Oracle, etc... For development I use SQLite and it is the one I'll use in this post but you may consider MySQL or PostgresSQL.
First you have to do is to install the Dancer::Plugin::Database module executing this line and update the Modfile with same line. Also, make sure you have installed the module for the database manager you will use, in this case is SQLite
Configure the connection to the DB. Open
environments/development.yml to add these lines to the end:
Remember to use space instead of tab in any YAML (.yml) file, Dancer will complain if you use tabs.
Create the directory
db, where all the databases will be (just like Rails). Create the
db/migrations directory to have the following SQL files to create the tables.
db/migration/001_up_teams.sql will be used to create the teams:
.. and
db/migration/001_down_teams.sql to eliminate them:
Same for the Users, use
db/migration/002_up_users.sql to create the users:
.. and
db/migration/002_down_users.sql to eliminate them:
Now, lets apply those migrations:
sqlite3 db/development.sqlite < db/migrations/001_up_teams.sql
sqlite3 db/development.sqlite < db/migrations/002_up_users.sql
If something goes wrong you can always rollback with:
sqlite3 db/development.sqlite < db/migrations/002_down_users.sql
sqlite3 db/development.sqlite < db/migrations/001_down_teams.sql
IMPORTANT: For every statement you do in the UP sql file, you have to undo it in the DOWN sql file and in the opposite order.
In order to test your application you need to fill the database with some data. We can do that with a seeder sql file. Create the
db/development.seed.sql file with this:
Confirm the database content with:
$ sqlite3 development.sqlite "SELECT * FROM Users;"
1|Johandry|Amador|johandry@company.com|1|2013-12-22 07:10:30
2|John|Smith|johnsmith@company.com|2|2013-12-22 07:10:30
3|Juan|Smith|juansmith@company.com|2|2013-12-22 07:10:30
$ sqlite3 development.sqlite "SELECT * FROM Teams;"
1|App Admin|app_admin@company.com|2013-12-22 07:09:47
2|Finance|finance@company.com|2013-12-22 07:09:47
In case you want to confirm the same from the application, create this temporal route in the
lib/myapplication.pm file:
And the template
views/testdb.tt with this:
IMPORTANT: You need to switch from Template::Simple to Template::Toolkit. I'll not explain this change here but basically you need to uncomment the template_toolkit lines and comment the template simple line in
config.yml.
In a next post I'll write about Dancer::Plugin::DBIC but now you have at least one model to dance with.