mvc
Version:
mvc wrapper for express like Zend framework on php
213 lines (168 loc) • 7.47 kB
JavaScript
module.exports.app = {}
module.exports.controllers = {}
module.exports.models = {}
module.exports.settings = {}
module.exports.init = function(app, settings) {
var defaultSettings = {
applicationDirectory: 'app',
moduleDirectory: 'modules',
controllerDirectory: 'controllers',
modelDirectory: 'models',
defaultModule: 'index',
defaultController: 'index',
defaultAction: 'index',
viewDirectory: 'views',
controllerCache: true,
modelCache: true
}
if (settings === undefined) {
settings = defaultSettings;
} else {
for (var i in defaultSettings) {
if (settings[i] === undefined) {
settings[i] = defaultSettings[i];
}
}
}
module.exports.settings = settings;
module.exports.app = app;
var util = require('util');
var path = require('path');
var fs = require('fs');
var loadModule = function (modulePath, moduleName) {
var loadComponents = function (type) {
var componentsPath = path.join(modulePath, settings[type + 'Directory']);
//console.log(componentsPath);
module.exports[type + 's'][moduleName] = {};
var components = [];
try {
components = fs.readdirSync(componentsPath);
} catch (e) {}
if (components.length) {
var componentPath, componentName;
for (var i = 0; i < components.length; i++) {
componentPath = path.join(componentsPath, components[i]);
//console.log(componentPath);
componentName = components[i];
if (componentName.slice(-3) == '.js') {
componentName = componentName.slice(0,-3);
}
var component = require(componentPath);
module.exports[type +'s'][moduleName][componentName] = component;
if ((type == 'controller' && !settings['controllerCache']) || (type == 'model' && !app.settings['modelCache'])) {
fs.watchFile(componentPath, function(event, filename) {
try {
delete(require.cache[componentPath]);
module.exports[type +'s'][moduleName][componentName] = require(componentPath);
} catch (e){
//console.log(e.stack.toString());
}
});
}
}
}
}
loadComponents('controller');
loadComponents('model');
}
var appPath = path.join(process.cwd(), settings.applicationDirectory);
loadModule(appPath, settings.defaultModule);
var modulesPath = path.join(process.cwd(), settings.applicationDirectory, settings.moduleDirectory);
//console.log(util.inspect(module.exports));
//console.log(modulesPath);
var modules = [];
try {
modules = fs.readdirSync(modulesPath);
} catch (e) {}
//console.log(modules)
if (modules.length) {
for (var i = 0; i < modules.length; i++) {
//console.log(modules[i]);
//console.log(util.inspect(module.exports.controllers));
loadModule(path.join(modulesPath, modules[i]), modules[i]);
}
}
//load models and controllers;
app.all('/:module?/:controller?/:action?', function(request, response, next) {
request.params.module = request.param('module', settings.defaultModule);
request.params.controller = request.param('controller', settings.defaultController);
request.params.action = request.param('action', settings.defaultAction);
if (module.exports.controllers[request.params.module] == undefined) {
request.params.controller = request.params.module;
request.params.module = settings.defaultModule;
}
//res.end(util.inspect(request.params));return;
if (module.exports.controllers[request.params.module] == undefined || module.exports.controllers[request.params.module][request.params.controller] == undefined) {
next();
return;
}
var controller = new module.exports.controllers[request.params.module][request.params.controller]();
if (controller[request.params.action + 'Action'] == undefined) {
next();
return;
}
//var path = require('path');
if (request.params.module == settings.defaultModule) {
app.set('views', path.join(process.cwd(), settings.applicationDirectory, settings.viewDirectory));
} else {
app.set('views', path.join(process.cwd(), settings.applicationDirectory, settings.moduleDirectory, request.params.module, settings.viewDirectory));
}
//console.log(app.set('views'));
try {
var helper = require('mvc/controller');
helper = new helper(module.exports, module.exports.app, request, response, settings);
for (var i in helper) {
controller[i] = helper[i];
}
//controller._render('index');
//controller._model('message2s');
if (controller.before != undefined) {
controller.before();
}
controller[request.params.action + 'Action']();
//console.log(controller.asd);
//res.render(request.params.controller + '/' + request.params.action, controller._view);
if (controller.after != undefined) {
controller.after();
}
var _render = function () {
return response.render(path.join(request.params.controller, request.params.action), controller._locals());
}
var _json = function () {
return response.json(response.locals());
}
var _jsonp = function () {
return response.send(request.query.callback + '(' + JSON.stringify(response.locals()) + ');');
}
var _xml = function () {
return response.send(require('mvc/xml').XML.stringify(response.locals()));
}
if (controller._formats.length) {
for (var i in controller._formats) {
if (request.is(controller._formats[i])) {
if (controller._formats[i] == 'html') {
_render();
} else if (controller._formats[i] == 'json') {
_json();
} else if (controller._formats[i] == 'javascript') {
_jsonp();
} else if (controller._formats[i] == 'xml') {
_xml();
}
break;
}
}
response.end();
} else {
_render();
}
//res.end();
//console.log(util.inspect(request.params));
//require('/var/www/mrzjs/eval2.js');
} catch(e) {
console.log(e.stack.toString());
response.end(e.stack.toString());
}
//console.log('Server running at http://127.0.0.1:8124/');
});
}