AlloVince is Evil
Yet another development engine based on Phalcon
天下武功、唯快不破
优点
缺点
修改原则:避免深度定制,避免覆盖接口。通过扩展新方法及调用事件为主
目标:所有资源集中到一个框架,通过组合模块完成80%的基础工作
- Application (Web) 每个Application都有唯一的Name - Application Config - Module Load Config 命名根据Application Name - Global Config - Local Config - Module - Module Bootstrap File - Module Config - Controller - Admin Controller - Model - Entity - Form - Events Listener - View - Helper - Partial - Admin View - Another Module - Another Application (API)
- apps #存放Application - cache #数据/页面缓存 - config #全局配置/配置文件缓存 - modules #存放公共模块 - EvaUser #模块 - Module.php #模块启动文件 - config #模块配置/前台路由/后台路由 - views #模块Views - layouts #布局 - index/index #模板 - partial #组件 - admin #后台 - layouts #布局 - partial #组件 - src #源代码 - EvaUser #PSR-2 - Controllers - Admin #后台 - Models - Entities - Forms - Events - Utils - View - Helpers - public #入口文件夹 - utilities #辅助工具 - workers #后台任务
use Eva\EvaEngine\Engine; //设置Application根目录, 设置AppName $engine = new Engine(__DIR__ . '/..', 'AppName'); $engine ->loadModules(include __DIR__ . '/../config/modules.' . $engine->getAppName() . '.php') //根据AppName加载模块配置文件,初始化DI ->bootstrap() //初始化Application,注册模块事件,注册ErrorHandler ->run(); //Phalcon\Application->handle()
如何定义模块
Eva\EvaEngine\Module\StandardInterface
$moduleManager->setDefaultPath()
$moduleManager->setDefaultPath()
module:beforeLoadModule
Module::registerGlobalAutoloaders()
[缓存]Module::registerGlobalEventListeners()
[缓存]Module::registerGlobalViewHelpers()
[缓存]Module::registerGlobalRelations()
[缓存]module:afterLoadModule
默认配置
$engine->loadModules(array("EvaUser"));
自定义配置
$engine->loadModules(array( "EvaUser" => array( //模块名 'className' => 'Eva\EvaUser\Module', //模块启动文件Class名 'path' => __DIR__ . '/../modules/EvaUser/Module.php', //模块启动文件路径 'moduleConfig' => '/../modules/EvaUser/config/config.php', //模块配置文件路径 'routesFrontend' => '/../modules/EvaUser/config/routes.frontend.php', //模块前台路由配置文件路径 'routesBackend' => '/../modules/EvaUser/config/routes.backend.php', //模块后台路由配置文件路径 'adminMenu' => '', //模块后台导航文件 )));
启动DI的推荐方法:
$this->getDI()->getModuleManager();
不推荐:
$this->getDI()->get('moduleManager');
什么时候用异常:当主要业务无法继续进行(注册、登录、访问资源不存在)
什么时候不用异常:伴随主业务的附加服务(注册发邮件、用户得积分)
- StandardException #标准异常 500 - LogicException #逻辑异常 500 - BadFunctionCallException #错误函数调用 400 - BadMethodCallException #错误方法调用 405 - DomainException #Domain错误 400 - InvalidArgumentException #错误的参数 400 - LengthException #长度错误 400 - OutOfRangeException #超出范围 400 - OperationNotPermitedException #操作不允许 403 - ResourceConflictException #资源冲突 409 - ResourceExpiredException #资源过期 403 - ResourceNotFoundException #资源不存在 404 - UnauthorizedException #资源未授权 401 - VerifyFailedException #验证失败 403 - RuntimeException #运行异常 500 - IOException #IO错误 500
错误代码规范: ERR_模块_异常信息
throw new Exception\UnauthorizedException('ERR_USER_NOT_ACTIVATED');
待定
通过不同的接口实现来区分数据类型:HTML/JSON,权限:Session/Token
JsonControllerInterface
数据自动支持Json/JsonpSessionAuthorityControllerInterface
基于Session验证TokenAuthorityControllerInterface
基于Token验证基于模块名设置模版
$view->setModuleLayout('EvaCommon', '/views/admin/layouts/layout');
基于模块名设置View的根目录
$view->setModuleViewsDir('EvaBlog', '/views');
基于模块名设置区块的根目录
$view->setModulePartialsDir('EvaCommon', '/views');
Form可以绑定Model
protected $defaultModelClass = 'Eva\EvaBlog\Models\Text';
Form间可以关联
$form = new Forms\PostForm(); $post = new Models\Post(); $form->setModel($post); $form->addForm('text', 'Eva\EvaBlog\Forms\TextForm');
关联后统一验证,验证完毕通过Form保存所有关联数据
$data = $this->request->getPost(); if (!$form->isFullValid($data)) { $form->save('updatePost'); }
子表单的输出会自动添加前缀
$form->getForm('text')->render('content'); <input name="text[content]" />
可以通过注解及绑定Model自动初始化Form Elemens
/** * @Type(Select) * @Option(deleted=Deleted) */ public $status;
待定