Giter Site home page Giter Site logo

octopus-'s Introduction

##octopus框架开发指南

octopus是一个简单、快速以及高度可扩展的框架。octopus需要PHP5.3以上版本,且拥抱了当下Web应用程序开发中最出色的操作和实践。 octopus应用遵循 模型-视图-控制器(model-view-controller (MVC))设计模式。 在MVC中,Models代表数据、业务逻辑,以及数据校验规则。 Views包含用户界面元素,如文本、图片和表单。Controllers用来管理模型和视图之间的通信,处理动作和请求。在本框架中,还包含Actions, 用于处理一些复杂的动作。

除了MVC,octopus还包含以下应用结构:

  • 入口脚本:由终端用户直接访问的PHP脚本,负责开始一个请求处理周期。
  • 应用: 全局管理应用程序组件,协调访问请求的对象
  • 应用组件: 应用程序注册对象和提供各种服务
  • 模块:独立的软件单元,包含全部MVC组件,应用程序可以创建多个模块
  • 过滤器:控制器实际处理每个请求之前或之后要被调用的动作
  • 小部件:widgets,嵌入在视图中的对象,包含控制器业务逻辑,并且可以在不同的视图中复用(待实现)

安装octopus框架:
你可以通过两种方式来安装octopus框架:

  • 通过composer
  • 通过下载一个所需文件以及octopus框架文件的应用模板

推荐前者方式,这样只需要一条极其简单的命令就可以安装新的octopus框架了。

###通过composer安装

Composer 是PHP中用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖 的外部工具库(libraries),composer会帮你安装这些依赖的库文件。

了解什么是composer,推荐使用composer来安装octopus。从这里下载composer:http://getcomposer.org/, 或者直接运行下述命令:

curl -s http://getcomposer.org/installer | php  

通过composer安装,需要首先绑定本机hosts文件,绑定内容如下:

172.16.0.73  packagist.2345.com

之后打开命令行,cd到相应目录后运行如下指令:

composer create-project octopus/octopus octopus 1.0.0 --repository-url=http://packagist.2345.com/repo/private/

###通过应用模板方式安装
通过下载框架模板程序,进行相应部署即可。

###服务器部署 Apache重写规则:
打开conf\httpd.conf文件,修改

LoadModule rewrite_module modules/mod_rewrite.so
# Virtual hosts
Include conf/extra/httpd-vhosts.conf

打开行前的注释的#号,开启重写模块以及虚机模块。 打开conf/extra/httpd-vhosts.conf,新增

<VirtualHost *:80>
    ServerName octopus.dev.com
    DocumentRoot "D:/www/octopus/web"
    <Directory "D:/www/octopus/web">
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php?/$1 [L]
    </Directory>
    ErrorLog "d:/wamp/logs/octopus-dev-error.log"
    CustomLog "d:/wamp/logs/octopus-dev-access.log" common
</VirtualHost>

以上虚机中配置了重写规则,可以在浏览中输入http://octopus.dev.com/index.php/news动作时候直接跳过index.php ,直接输入http://octopus.dev.com/news即可。

###框架目录
octopus| --|app 项目全局管理应用程序组件库,协调访问请求的对象 --|classes 全局基类类库 --|Action.php 动作类基类 --|BaseClass.php 顶层祖先类 --|Config.php 配置文件操作类 --|Controller.php 控制器基类 --|Hook.php 钩子基类 --|Model.php 数据与逻辑模型基类 --|Octopus.php 框架操作类 --|config 配置文件 --|config.php --|database.php 数据库配置 --|redis.php Redis服务器配置 --|includes --|functions.php 公共函数库 --|logs --|debug.log debug模式下的操作日志 --|index.html --|Bootstrap.php 框架启动文件 --|src --|actions 动作与逻辑层 --|CrawlAction.php --|controllers 控制器层 --|DefaultController.php --|NewsController.php --|hooks 系统钩子 --|models 数据与业务逻辑层 --|DefaultModel.php --|NewsModel.php --|modules 子系统 --|Demo --|actions 子系统动作层 --|controllers 子系统控制器层 --|models 子系统模型层 --|views 子系统模板目录 --|tpl
--|tpl_c
--|views 视图层 --|tpl 模板目录 --|add.tpl.html --|edit.tpl.html --|index.tpl.html ... --|tpl_c 编译后的静态文件目录 --|vendor 框架核心类库 --|web 项目web入口,包含图片、脚本、样式等静态文件 --|scripts --|css --|images --|index.php 项目入口程序 --|composer.json composer安装配置文件 --|README.md 帮助文档

数据库配置格式样例

$config['database']['news'] = array(
    'master' => array(
        'host' => 'localhost',
        'port' => 3306,
    ),
   'username' => 'root',
   'password' => 'password',
   'charset'  => 'gbk'
);

动作actions目录 注意点

类声明:class CrawlAction extends Action ,Action程序全部继承自Action基类,内部逻辑可以自己制定。

控制器controllers目录 注意点

类声明: class NewsController extends Controller,控制器程序全部首字母大写,以Controller结尾,并且继承自Controller基类;类内方法定义:public function actionIndex()注意方法名一定要加action前缀,应用驼峰命名法规则,出于安全考虑,仅对用户可以直接访问的控制器类内的方法如此,其他类内方法均正常命名。

模型类models目录 注意点

类声明:class NewsModel extends Model
模型层程序全部首字母大写,以Model结尾,并且继承自Model基类。

系统钩子类hooks目录 注意点

类声明:class BenchmarkHook extends Hook
系统钩子程序全部首字母大写,以Hook结尾,并且继承自Hook基类;系统钩子类要生效必须在配置文件(/app/config/config.php)中的$config['hooks']中的键值为 pre_bootstrappost_bootstrapcache_overridepre_controllerpost_controllerpost_controller_constructor的数组下配置参数数组,示例如下:

    $config['hooks']['pre_bootstrap'] = array(
        array(
            'class' => 'BenchmarkHook',
            'method' => 'mark',
            'params' => array(
                'total_execution_time_start'
            )
        ),
    );

子系统目录 注意点

目录结构和src下的目录结构类似,不过仅包括actionscontrollersmodelsviews,但是在类声明之前必须添加:namespace SubsysName; use BaseClassName;,其中, SubsysName是首字母大写的子系统名称,且所有类声明之前必须都添加该相同的名称, BaseClassName是继承的基类名称;view视图模板必须放置在目录/src/views/tpl下。

###视图渲染 例如:

$this->model = NewsModel::getInstance();     //模型对象建立
$this->action = CrawlAction::getInstance();  //动作器对象建立


public function actionIndex(){               //controller类内的方法
     $news =  $this->model->getNewsList();
     loadView('index.tpl.html',array('news' => $news)); //变量设置
}

index.tpl.html中, 整个传输变量为$pageArray.news,使用时候语法为Smarty语法,详细见http://www.yiibai.com/smarty/。 注意模板中调用变量的设置,目前默认变量调用方式为{{$pageArray}}

###框架使用 浏览器中调用相应的控制器: octopus.dev.com/news ,调用news的controller; 浏览器中GET方式传递参数: octopus.dev.com/news/edit/1,调用方式为 public function actionEdit( $id ) ,即为调用NewsControlleredit方法的edit方法,传递参数为1给$id

###使用octopus框架开发介绍

  1. 首次安装体验:

    • 将服务器rewrite设置完毕;

    • octopus放置到应用服务器可访问的目录下;

    • 直接在浏览器上输入网址,则可以自动打印word,表示框架运行正常。

  • 整体运行流程:

    • 用户 url 请求,框架自动执行入口文件./octopus/web/index.php

    • 然后入口文件加载目录./octopus/vendor下的框架核心类库;

    • 接着读取目录./octopus/app/config下的配置文件(config.phpdatabase.phpredis.php);

    • 然后惰性加载(实际使用时才自动new)所有配置类包括子系统类;

    • 接着执行系统钩子pre_bootstrap(如果配置过);

    • url路由解析;

    • 执行系统钩子cache_override

    • 请求合法性校验;

    • 执行系统钩子pre_controller

    • 请求类实际加载;

    • 执行系统钩子post_controller_constructor

    • 实际执行请求类下的方法;

    • 最后依次执行系统钩子post_controllerpost_bootstrap

    • 返回数据给用户。

  • 整体开发流程:

    • 在目录./octopus/app/config配置信息,开发时在config.php文件首部添加define('RUNMODE', 'development');,正式版本必须去掉该define;接着配置子系统和系统钩子(采取的是配置方有效的原则);在 database.php中配置数据库信息;在redis.php中配置redis缓存信息。

    • 在目录./octopus/src下编写开发代码actionscontrollershooksmodels下存放对应类型的类文件,注意类名和文件名保持统一,均首字母大写并以对应类别(ActionControllerHookModel)结尾;./octopus/src/views/tpl下存放的是./octopus/src当前目录的view视图模板(例如:index.tpl.html);

    • 在目录./octopus/src/modules下存放子系统目录,以Demo子系统为例,文件夹actionscontrollersmodelsviews均位于目录./octopus/src/modules/Demo下,其存放并使用文件的规则和目录./octopus/src下类似(提示:子系统下views文件夹内不要忘记建立tpltpl_c两个文件夹),但注意子系统名首字母大写,且在类声明前必须声明命名空间为该子系统(例如:namespace Demo;),由于要继承基类,所以还要使用use相应的基类名称(例如:use Controller;)。

    • view模板文件中(例如:index.tpl.html),所有控制器默认传入模板的变量均存放在数组$pageArray中,模板中对变量的引用默认类似如下{{$pageArray}};模板的使用完全靠smarty的定义,所以请详细了解smarty。

    • 在目录./octopus/web下的文件夹scriptscssimages中分别放置各类静态脚本文件(js、css、image),这里建议用户对不同项目建立自己的目录,然后将上面三个文件夹包含在内,依次存放各自类型的文件;至于调用方法,通过根目录BASEPATH自己定义。

    • URL 调用方式: schema://hostName/className/actionName/id or schema://hostName/subsysName/className/actionName/id 例如:http://octopus.dev.com/news/edit/1 or http://octopus.dev.com/demo/default/index/2

    • 查看调试日志,只要配置文件中写入过define('RUNMODE', 'development');,则可以在./octopus/app/logs/debug.log中看到详细的调试日志,建议定期清理。注意:正式版本必须去除或注释该定义行

    • 在目录./octopus/app/includes下的文件functions.php中增加、修改基本函数

    • 在目录./octopus/app/classes下,修改基本类库,但强烈建议非必要不更改。

  • 高级开发介绍:

    • 即命名空间的使用,注意这种方法可以带来开发上的灵活便捷,但规范约束将变得很困难,如非必须的情况下请不要使用。在任何一个类文件夹下,都可以建立子文件夹并在其下建立类文件,但是注意必须使用相应的命名空间,例如在./octopus/src/actions下建立文件夹和类文件如下./octopus/src/actions/DefaultActions/DefaultAction.php,但是类文件DefaultAction.php必须在文件首部声明命名空间为namespace DefaultActions;,相应的在调用该类时必须事先使用use DefaultActions\DefaultAction;引用。

octopus-'s People

Contributors

long6218344 avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.