Matador
DEPRECATION WARNING: Matador has been deprecated and is no longer actively maintained. We do not recommend continuing to use Matador.
Sane defaults and a simple structure, scaling as your application grows.
Matador is a clean, organized framework for Node.js architected to suit MVC enthusiasts. It gives you a well-defined development environment with flexible routing, easy controller mappings, and basic request filtering. It’s built on open source libraries such as SoyNode for view rendering, and connect.js to give a bundle of other Node server related helpers.
Installation
Get the CLI
$ npm install matador -g
Create an app
$ matador init my-app
$ cd my-app && npm install matador
Start your app
$ node server.js
Dancing with the Bulls
Build on your app
// app/config/routes.js'/hello/:name': 'get': 'Home.hello'// app/controllers/HomeController.js{response}
View Rendering
Uses SoyNode to render Closure Templates.
// app/controllers/HomeController.jsthis
<!-- app/views/layout.soy -->
{namespace views.layout}
/**
* Renders the index page.
* @param title Title of the page.
*/
{template .layout autoescape="contextual"}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-type' content='text/html; charset=utf-8'>
<title>{$title}</title>
<link rel='stylesheet' href='/css/main.css' type='text/css'>
</head>
<body>
{$ij.bodyHtml |noAutoescape}
</body>
</html>
{/template}
{namespace views.index}/*** Renders a welcome message.* @param title Title of the page*/{template .welcome}Welcome to {$title}(rendered with Closure Templates){/template}
Routing
The app/config/routes.js
file is where you specify an array of tuples indicating where incoming requests will map to a controller
and the appropriate method. If no action is specified, it defaults to 'index' as illustrated below:
module {return'/': 'Home' // maps to ./HomeController.js => index'/admin': 'Admin.show' // maps to ./admin/AdminController.js => show}
You can also specify method names to routes:
module {return'/posts':'get': 'Posts.index' // maps to PostsController.js => #index'post': 'Posts.create' // maps to PostsController.js => #create}
How can I organize my Models?
By default, Models are thin with just a Base and Application Model in place. You can give them some meat, for example, and embed Mongo Schemas. See the following as a brief illustration:
// app/models/ApplicationModel.jsmodule {var BaseModel = app{BaseModelthismongo =thismongoose =thisSchema = thismongooseSchemathismongoose}utilreturn ApplicationModel}
Then create, for example, a UserModel.js that extended it...
module {var ApplicationModel = app{ApplicationModelthisDBModel = thismongoose}utilreturn DBModelUserModelprototype {var user =name: nameemail: emailuser}UserModelprototype {thisDBModel}}
This provides a proper abstraction between controller logic and how your models interact with a database then return data back to controllers.
Take special note that models do not have access to requests or responses, as they rightfully shouldn't.
Model & Controller Inheritance
Matador uses the default node inheritance patterns via util.inherits
.
Scaffolding
$ matador controller [name]
$ matador model [name]
Contributing & Development
Questions, pull requests, bug reports are all welcome. Submit them here on Github. When submitting pull requests, please run through the linter to conform to the framework style
$ npm install -d
$ npm run-script lint
Authors
Obviously, Dustin Senos & Dustin Diaz
License
Copyright 2012 Obvious Corporation
Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0