eve-php / 框架
基于Eden库构建的框架
Requires
- php: >=5.4.1
- eden/cookie: 4.*
- eden/folder: 4.*
- eden/handlebars: 5.*
- eden/handler: 4.*
- eden/image: 4.*
- eden/language: 4.*
- eden/mail: 4.*
- eden/mysql: 4.*
- eden/oauth: 4.*
- eden/postgre: 4.*
- eden/server: 4.*
- eden/session: 4.*
- eden/sqlite: 4.*
- eden/template: 4.*
- eden/timezone: 4.*
- eden/validation: 4.*
- ruflin/elastica: 2.3.0
- videlalvaro/php-amqplib: 2.5.2
Requires (Dev)
- phpunit/phpunit: ~4.4
- squizlabs/php_codesniffer: ~1.5
This package is not auto-updated.
Last update: 2024-09-14 18:26:00 UTC
README
Eve PHP 框架,构建可扩展的应用程序以用于企业部署。
安装
$ composer install eve-php/framework
$ vendor/bin/eve install
- 按照说明操作。
====
功能
- 强大的路由
- 事件驱动
- Handlebars或PHP模板
- 内置OAuth / REST操作
- 可插入中间件,来自Packagist
- 代码生成器
- 延迟处理(队列)
- 支持持续部署
- CLI命令,用于将您的应用程序与其他应用程序集成
====
入门指南
- 运行
phpunit
以确保一切正常工作 - 尝试在浏览器中访问
127.0.0.1
如果浏览器没有加载。请在 httpd.conf
文件的底部添加以下内容。
#Allow Apache access to the public folder
<Directory "/[YOUR DIRECTORY]">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
<VirtualHost *:80>
DocumentRoot "/[YOUR DIRECTORY]"
ServerName dummy-host.example.com
</VirtualHost>
然后通过 $ sudo service httpd restart
或 $ sudo apachectl restart
重新启动apache。
如果您不想使用IP地址,可以这样做
<VirtualHost custom.com:80>
DocumentRoot "/[YOUR DIRECTORY]"
ServerName dummy-host.example.com
</VirtualHost>
然后在 /etc/hosts
中添加新的一行
127.0.0.1 custom.com
一旦您在浏览器中看到 您已成功安装此框架!
,您就处于良好状态 :) 使用 admin@openovate.com
和密码 admin
登录到 127.0.0.1/control/login
,以验证框架的其他部分是否正常工作。
====
结构
Eve 虽然大量采用了某些部分,但不是一个典型的MVC模式。Eve 还采用作业、事件、持续部署和REST来优化PHP和组织代码的整体架构,与MVC一样。以下结构应反映已安装的文件夹。
App
- 所有操作和视图的位置Back
- 管理特定页面的默认位置Dialog
- 基于UI的API调用的默认位置Front
- 公开访问页面的默认位置Rest
- 基于REST的API调用的默认位置
Job
- 通过组合多个模型调用来识别业务规则Model
- 单元风格的CRUD以访问数据库public
- 静态文件和DMZsettings
- 应用特定配置test
- 用于持续集成
有关结构的更多信息,请参阅结构。
应用层
应用层的目的是只在这个文件夹中抽象渲染页面的责任。默认情况下,Eve提供了4个应用程序,以便您更快地开始:Back
、Dialog
、Front
和Rest
。这些应用程序在public/index.php
中激活。因此,要停用特定应用程序,您可以通过删除相应的行并删除应用程序文件夹来完成。例如,要删除Dialog应用程序,从public/index.php
中删除以下内容。
//Dialog Route
->add(Eve\App\Dialog\Route::i()->import())
然后执行$ rm -rf App/Dialog
。同样,添加自定义应用程序的最简单方法是将应用程序文件夹之一复制到public/index.php
。例如,要添加应用程序的移动版本,在public/index.php
中在->defaultBootstrap()
之前添加以下内容。
//Mobile Route
->add(Eve\App\Mobile\Route::i()->import())
然后执行cp -rf App/Front App/Mobile
。最后,将Front
替换为Mobile
。请确保您在App/Mobile/routes.php
中更新了您的路由。
“App”文件夹中的每个文件都设计成模板示例,因此您可以随意修改任何内容。在每一个应用程序中,您都会找到Route.php
和routes.php
。在Eve框架中,应用程序被视为中间件,如Eden Server中定义的,因此在继续之前,请阅读有关中间件的说明。
外部插件也是Packagist中找到的中间件,可以像应用程序一样导入。以下是一些您可以立即在Eve中使用的示例插件。
所有中间件都应该返回一个函数,以便框架在所有中间件导入后进行处理。这是每个Route.php
文件中import()
的目的所在。第二个目的是根据routes.php
中的定义注册路由,其中路由被分配给操作类。
操作类只需要有一个render()
函数,其中可以通过$this->request
访问请求对象,通过$this->response
访问响应对象。这两个对象都遵循由Eden Registry定义的相同标准。如果您希望浏览器中渲染输出,可以在render()
中返回字符串。以下示例说明了如何实现这一点。
在App/Front/Action
文件夹中创建一个名为Sample.php
的文件。然后粘贴以下代码。
namespace Eve\App\Front\Action;
use Eve\Framework\Action\Html;
class Sample extends Html
{
/**
* Main action call
*
* @return string|null|void
*/
public function render()
{
return 'Hello World!';
}
}
然后在routes.php
中添加以下内容。
'/foo' => array(
'method' => 'ALL',
'class' => '\\Eve\\App\\Front\\Action\\Sample'
),
在浏览器中访问127.0.0.1/foo
。默认情况下,如果您想使用模板,可以通过匹配操作文件的路径来完成。例如,如果您创建一个App/Front/Foo/Bar
类,相应的模板应位于App/Front/foo/bar.html
。通过以下过程,我们可以使用模板而不是返回原始字符串来修改上述示例。
打开位于App/Front/Action
文件夹中的Sample.php
文件。然后将现有代码替换为以下代码。
namespace Eve\App\Front\Action;
use Eve\Framework\Action\Html;
class Sample extends Html
{
/**
* Main action call
*
* @return string|null|void
*/
public function render()
{
return $this->success();
}
}
创建一个名为sample.html
的文件,位于App/Front/template
文件夹中。然后粘贴以下代码。
Hello World 2!
在浏览器中访问127.0.0.1/foo
。默认情况下,Eve中的模板使用handlebars。这个选择是为了轻松集成单页应用程序和phonegap,因为它有一个共同的模板标准。尽管可以重命名sample.html
为sample.php
或sample.phtml
来使用PHP模板,但由于上述原因,不推荐这样做。PHP变量可以通过以下示例在模板中访问。
打开位于App/Front/Action
文件夹中的Sample.php
文件。然后将现有代码替换为以下代码。
namespace Eve\App\Front\Action;
use Eve\Framework\Action\Html;
class Sample extends Html
{
/**
* Main action call
*
* @return string|null|void
*/
public function render()
{
$this->body['foo'] = 'bar';
return $this->success();
}
}
打开位于App/Front/template
文件夹中的sample.html
文件。然后将现有代码替换为以下代码。
Hello {{foo}} !
在浏览器中访问127.0.0.1/foo
。要了解更多关于Handlebars模板的信息,请访问Handlebars网站。
工作层
工作层的目的是仅在此文件夹中抽象业务规则的责任。具体来说,在 Eve 中引入任务是为了以下目的。
- 业务需求的分组
- 可重用代码,用于可写操作
- 防止模型层被破坏
- 延迟 PHP 进程,从而加快响应时间
操作类应考虑调用任务而不是模型来写入数据库,以促进可重用性。任务的示例包括创建对象、更新对象和删除对象。一些高级任务的示例可能包括:
- 上传产品列表
- 发送电子邮件
- 发送短信
由于检索列表或对象详细信息通常需要立即响应(或读取操作),因此在操作中调用模型是可以的。
可以使用以下示例命令在 CLI 中调用任务。
vendor/bin/eve job send-mail "?subject=hello&body=world"
或者在代码中调用:
eve()
->job('mail-send')
->setData(array('subject' => 'hello', 'body' => 'world'))
->run();
Eve 还提供了一个接口来连接到 RabbitMQ。要排队一个任务,您可以使用以下 CLI 命令:
vendor/bin/eve queue send-mail "?subject=hello&body=world"
或者在代码中:
eve()
->queue('mail-send')
->setData(array('subject' => 'hello', 'body' => 'world'))
->run();
例如,创建产品的业务规则可能包括以下内容:
- 将产品行插入到数据库中
- 将配置文件与产品关联
- 将产品文件插入到数据库中
- 将文件与产品关联
为了说明这个想法,我们可以通过以下代码创建一个任务来完成这个任务:
namespace Eve\Job\Product;
use Eve\Framework\Job\Base;
use Eve\Framework\Job\Exception;
class Create extends Base
{
const FAIL_406 = 'Invalid Data';
public function run()
{
//if no data
if (empty($this->data)) {
//there should be a global catch somewhere
throw new Exception(self::FAIL_406);
}
//this will be returned at the end
$results = array();
//NEXT ...
//if there is no product_id provided
if (!isset($this->data['product_id'])) {
//create the product
$results['product'] = eve()
->model('product')
->create()
->process($this->data)
->get();
$this->data['product_id'] = $results['product']['product_id'];
}
//NEXT ...
//if there is a profile_id
if (isset($this->data['profile_id'])) {
//link the profile
eve()
->model('product')
->linkProfile(
$results['product']['product_id'],
$this->data['profile_id']
);
}
//NEXT ...
//if there is a list of file
if (isset($this->data['file'])
&& is_array($this->data['file'])
) {
foreach($this->data['file'] as $i => $row) {
//create the file
$row = eve()
->model('file')
->create()
->process($row)
->get();
//now link the files
eve()
->model('product')
->linkFile(
$results['product']['product_id'],
$row['file_id']
);
//build thumb
eve()
->job('random-resize')
->setData($row)
->run();
}
}
return $results;
}
}
要了解更多关于任务的信息,请阅读任务和延迟处理。
模型层
模型层的目的是仅在此文件夹中抽象访问数据库的责任。与大多数实际 MVC 结构中的模型层不同,Eve 的模型层具有 CRUD 和通用使用的独特分离。以下命令用于访问模型。
eve()->model('auth');
返回的类仅是一个具有其他可能的随机数据库访问器的工厂类。特别是 auth
模型的工厂方法会转发到不同的 CRUD 类。例如,要访问 auth CRUD,您可以使用以下代码。
//create
eve()->model('auth')->create();
//update
eve()->model('auth')->update();
//remove
eve()->model('auth')->remove();
//search
eve()->model('auth')->search();
//detail
eve()->model('auth')->detail();
每个 CRUD 类都遵循类似的模式。所有 CRUD 类都应该有一个名为 errors()
的方法和一个名为 process()
的方法。例如,要创建一个新的 auth 行,您可以使用以下示例。
eve()
->model('auth')
->create()
->process(array(
'auth_slug' => 'sample@email.com',
'auth_permissions' => 'test_permissions_1,test_permissions_2',
'auth_password' => '123456',
'confirm' => '123456'));
但是,在处理之前检查错误是一个好习惯。您可以使用以下示例来完成此操作。
eve()
->model('auth')
->create()
->errors(array(
'auth_slug' => 'sample@email.com',
'auth_permissions' => 'test_permissions_1,test_permissions_2',
'auth_password' => '123456',
'confirm' => '123456'));
所有其他逻辑上不能遵循此模式的方法都可以放入 Model/Auth/Index.php
。例如,以下代码检查 auth_id 1 是否存在。
eve()->model('auth')->exists(1); //--> true or false
您可以随意创建(或生成)模型。要了解更多关于直接访问数据库的信息,请参阅数据库
====
生成器
Eve 随附一个代码生成器,仅在您理解框架中包含的底层结构、类和编码标准时才建议使用。示例模式可以在 schema
文件夹中找到。要查看生成器的功能概述,可以使用以下命令。
$ vendor/bin/eve generate sink
此命令将生成 schema/sink.php
中定义的厨房水槽代码。要将此模式添加到您的数据库中,可以使用以下命令。
$ vendor/bin/eve database sink
要查看水槽 UI,请在 App/Back/routes.php 中添加以下内容:
'/control/sink/search' => array(
'method' => 'GET',
'class' => '\\Eve\\App\\Back\\Action\\Sink\\Search'
),
'/control/sink/create' => array(
'method' => 'ALL',
'class' => '\\Eve\\App\\Back\\Action\\Sink\\Create'
),
'/control/sink/update' => array(
'method' => 'ALL',
'class' => '\\Eve\\App\\Back\\Action\\Sink\\Update'
),
'/control/sink/remove' => array(
'method' => 'GET',
'class' => '\\Eve\\App\\Back\\Action\\Sink\\Remove'
),
'/control/sink/restore' => array(
'method' => 'GET',
'class' => '\\Eve\\App\\Back\\Action\\Sink\\Restore'
),
然后访问 127.0.0.1/control/sink/search
以查看从模式生成的可视化厨房水槽。