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:beforeLoadModuleModule::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;
待定