eve-php/框架

基于Eden库构建的框架

安装次数: 7,862

依赖项: 0

建议者: 0

安全性: 0

星标: 2

关注者: 3

分支: 1

开放问题: 0

语言:HTML

类型:框架

dev-master 2016-05-07 06:34 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:26:00 UTC


README

logo

Eve PHP 框架,构建可扩展的应用程序以用于企业部署。

安装

  1. $ composer install eve-php/framework
  2. $ vendor/bin/eve install
  3. 按照说明操作。

====

功能

====

入门指南

  1. 运行 phpunit 以确保一切正常工作
  2. 尝试在浏览器中访问 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,以验证框架的其他部分是否正常工作。

====

结构

Request Response

Eve 虽然大量采用了某些部分,但不是一个典型的MVC模式。Eve 还采用作业、事件、持续部署和REST来优化PHP和组织代码的整体架构,与MVC一样。以下结构应反映已安装的文件夹。

  • App - 所有操作和视图的位置
    • Back - 管理特定页面的默认位置
    • Dialog - 基于UI的API调用的默认位置
    • Front - 公开访问页面的默认位置
    • Rest - 基于REST的API调用的默认位置
  • Job - 通过组合多个模型调用来识别业务规则
  • Model - 单元风格的CRUD以访问数据库
  • public - 静态文件和DMZ
  • settings - 应用特定配置
  • test - 用于持续集成

有关结构的更多信息,请参阅结构

应用层

应用层的目的是只在这个文件夹中抽象渲染页面的责任。默认情况下,Eve提供了4个应用程序,以便您更快地开始:BackDialogFrontRest。这些应用程序在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.phproutes.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.htmlsample.phpsample.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();

例如,创建产品的业务规则可能包括以下内容:

  1. 将产品行插入到数据库中
  2. 将配置文件与产品关联
  3. 将产品文件插入到数据库中
  4. 将文件与产品关联

为了说明这个想法,我们可以通过以下代码创建一个任务来完成这个任务:

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 以查看从模式生成的可视化厨房水槽。