• Stars
    star
    573
  • Rank 74,842 (Top 2 %)
  • Language
    PHP
  • Created about 12 years ago
  • Updated almost 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

轻框架。包含一个前端控制器,20个常用函数和用于页面布局的Layout系统,10分钟即可学会。LP采用BSD开源协议,在代码内保留框架名即可随意商用。

⚠️ 此项目已经停止维护,请使用 https://github.com/easychen/lazyphp4

LAZYPHP简介

LazyPHP(以下简称LP)是一个轻框架.

之所以开发这么一个框架,是因为其他框架给的太多。在高压力的情况下,ORM和盘根错节的对象树反而将简单的页面请求处理复杂化,在调试和性能上带来反面效果。

LP采用函数式接口封装对象,对内通过面向对象实现代码重用,对外则提供简明扼要的操作函数。开发者甚至不用理解面向对象就能很好的使用,这让一些初级程序员很容易就开发出强壮的应用。

在数据库等模块的加载上,LP采用LazyLoad方式,并用$GLOBALS实现全局单件,在方便和高效之间找到了一个平衡点。这也是LP框架名字中Lazy的来源。 LP在新浪大量使用已经将近3年,每天承载的请求达千万级别。由于LP易读易学,使用LP的开发者之间沟通非常容易,而新同事也可以很快融入进来。

LP3是LP最新的版本,最主要的调整是重新定义了Layout规则,以应对日益增多的Ajax,Mobile和Rest请求。同样是由于这个原因,LP3和之前的版本不兼容,我们建议大家在新项目中采用LP3。

LP3 实例

基于LP3的全平台开源项目 团队效率工具 TeamToy http://tt2net.sinaapp.com/

LP3简明教程

LP是一个轻框架。它只是打算帮你处理掉每个Web应用都需要重新开始的那部分东西,并不打算成为一个大而全的Lib(我说的真的不是ZendFrameWork)。

LP只包含一个FrontController+Layout系统+20个常用函数。你只需要花上10分钟了解这些东西,就能完全得掌握LP。

FRONTCONTROLLER

FrontController(以下简称FC)翻译过来叫前端控制器,在LP中,所有的动态请求(不包括静态文件)都会经过FC。使用FC的好处是可以统一控制全部请求,举例而言,你只需要在FC中添加几行代码,就可以精确控制哪些controller和action不可以访问。

LP3的FC你可以看成就是ROOT/index.php(实际上分发逻辑在_lp/lp.init.php),所有的请求都在这里处理。不管你是用户登录还是浏览文章,在LP上用户访问的页面都是index.php。

FC根据Controller和Action对请求进行分组,并调用对应的模块来进行处理。如何定义Controller和Action?最简单的办法是把一个数据表对应到一个Controller,而对这个数据表的相关操作自然就成为了Action。

比如,我们会定义一个叫做User的Controller,而把Login,Logout,Detail 作为User的Action。

我们在访问LP时,把要请求的Controller和Action通过参数c和a传递给FC。

/index.php?c=user&a=login

上边这个访问告诉FC去加载名为User的Controller,并调用名为Login的方法。

在实现上,Controller被放到AROOT.controller目录下,以Class形式存在,而Action就是这个Class的一个方法。

下边几行伪代码描述了这个其实很简单的过程:

// FC取得参数
$c = $_REQUEST['c'] ;
$a = $_REQUEST['a'] ;

// controller文件名和Class名
$cont_file = AROOT . ‘controller/’ . $c . ‘/’ . $a . ‘.class.php’;
$class_name =$c .’Controller’ ;

// 载入文件
require_once( $cont_file );

// 调用方法
$o = new $class_name;
call_user_func( array( $o , $a ) );

实际上,编写应用的过程就是不断的添加Controller和Action并把它实现。

下边是一个Controller Class的样子:

class defaultController extends appController
{
	function __construct()
	{
		parent::__construct();
	}

	function index()
	{
		$data['title'] = $data['top_title'] = ‘首页’;
		render( $data );
	}
}

MVC和LAYOUT

LP是遵循MVC模式的,它的业务逻辑和显示逻辑是完全分离的。Controller处理了业务逻辑,我们使用模板来处理显示逻辑。

LP所有的模板都被放在AROOT.view下边,通过在Controller中使用Render函数来渲染模板。

以下是Render函数的伪代码:

function render( $data = NULL , $layout = NULL , $sharp = ‘default’ )
{
$layout_file = AROOT . ‘view/layout/’ . $layout . ‘/’ . $sharp . ‘.tpl.html’;
@extract( $data );
require( $layout_file );
}

可以看到,Render接受一个$data数组,然后将数组中的数据extract出来,这样一个原本是$data['user']的数据在模板里边就能通过$user访问了。而载入模板部分更简单,只是直接require。这是因为LP直接使用PHP来做模板的解释引擎。我们推荐大家在模板中采用PHP的短标签语法以保持高的可读性:

<?php if( $user['level'] >= 9 ): ?>
亲,你是鹳狸猿
<?php else: ?>
亲,你是平民,天黑请闭眼
<?php endif; ?>

上边是一个使用短标签的模板的例子。if,foreach都可以这样写。切忌在模板中使用{},这会让你的模板看起来很奇葩。

为了实现模板的重用,我们引入了Layout系统。

来看一个经常遇到的例子,网站头部导航和页脚版权部分的重用。

最简单和最容易想到的处理办法是这样的:将头部保存为header.tpl.html,将页脚保存为footer.tpl.html。然后直接在模板中用include函数载入即可。

这样很OK,但是当我们有10个模板要处理的时候,你会发现每个模板都要去include header和footer。而在这些模板中,header和footer其实是不变的,变的是中间的部分。

于是我们为这些相同模板建立一个通用的模板文件,叫做sharpA.tpl.html,在styleA中我们指定好header和footer,然后sharpA根据FC接收到的C和A变量(还记得吧)去加载对应子目录下模板。这样我们只需要创建C和A对应的模板就可以了。下边是一个典型的sharp模板。

<html>
<body>
<div id="hd" ><?php @include_once( dirname(__FILE__) ) . DS . 'header.tpl.html'; ?></div>

<div id="bd">
<div id="side">
<?php
include( AROOT . 'view' . DS . 'layout' . DS . g('layout') . DS . 'side' . DS . g('c') . DS . g('a') . '.tpl.html' );

?>
</div>
<div id="main">
<?php
include( AROOT . 'view' . DS . 'layout' . DS . g('layout') . DS . 'main' . DS . g('c') . DS . g('a') . '.tpl.html' );
?>
</div>
</div>
</div>
<div id="ft"><?php @include_once( dirname(__FILE__) ) . DS . 'footer.tpl.html'; ?></div>

</body>
</html>

当一个sharp满足不了需求时,我们可以再创建sharpB.tpl.html。styleB可以选择性的共享sharpA的header和footer,也可以载入自己特定的header。我们把sharpA,sharpB…等通用模板放到一个目录下,叫做一个Layout。

目前Layout按照访问方式分为Web,Ajax,Mobile和Rest四种。当你为你的游戏机或者电视机创建一组特定风格的sharp模板时,你可以创建一个名叫TV或者PFP的Layout目录。

切换Sharp和Layout非常简单,只需要修改Render函数中第二和第三个参数就可以了。在没有指定的情况下,LP3会启用Layout下的default sharp模板,同时还会根据请求的方式,自动加载Web,Mobile或者Ajax Layout。

再回过头来说MVC,我们已经了解了C和V在LP的使用。而M就是根据请求参数,从数据库或者其他地方取得数据的过程。在LP3之前,数据是直接在Controller中查询数据库取得的。

function show()

{

$uid =  intval($_REQUEST['uid']);

if( $uid < 1 ) return info_page(‘错误的uid’);

$data['user'] = get_line( “SELECT * FROM `user` WHERE `uid` = ‘” . $uid . “‘ LIMIT 1″ );

render( $data );

}

这种方式将SQL散落在各个Action中,不利于重用和修改。所以在LP3中,我们采用专门的model文件来放置Controller中用到的数据操作函数。还是用上边的例子,我们假设这是一个名为User的Controller的Show Action。那么在LP3中我们推荐的做法如下:

首先在 AROOT/model目录下创建一个名为user.function.php的文件。

然后在文件中写入获取用户信息的函数:

function get_user_info_by_id( $uid )

{

return get_line( “SELECT `name` ,`email` , `bod` FROM `user` WHERE `uid` = ” . intval($uid) . ” LIMIT 1 ” )

}

user.function.php将在请求参数包含?c=user 时自动加载。所以我们可以把show改为下边的样子:

function show()

{

$uid =  intval($_REQUEST['uid']);

if( $uid < 1 ) return info_page(‘错误的uid’);

$data['user'] = get_user_info_by_id(  $uid  );

render( $data );

}

这样在其他的Action,比如User/settings 中,我们可以通过get_user_info_by_id 函数重用代码。通过函数封装重复SQL还有一个好处是方便对SQL进行统一处理,加手工Cache就是一个经常能遇到的需求。

常用函数

LP3中的函数主要有3类,迅捷函数,功能函数和数据库函数,一共20个左右。

迅捷函数

迅捷函数是一系列的函数缩写:

function c( $str ) // 读取配置文件中$str为key的对应的value
function v( $str ) // 取得 $_REQUEST[$str] 的数据,不存在不会报warning
function z( $str ) // strip_tags
function g( $str ) // 取得 $GLOBALS[$str] 的数据
function t( $str ) // trim
function u( $str ) // urlencode

功能性函数

function render( $data = NULL , $layout = NULL , $style = ‘default’ ) // Layout
function info_page( $info ) // 系统提示信息
function ajax_echo( $info ) // 输出提示信息,包含永不过期的header
function uses( $file ); // 载入lib目录下的文件

数据库函数

function s( $str , $db = NULL ) // mysql_real_escape_string
function prepare( $sql , $array ) // 将数组中的变量顺序替换SQL中的?
function db() // 使用config目录下的数据库设置,创建并返回数据库链接
function get_data( $sql , $db = NULL ) // 以二维数组的方式返回$sql对应的结果
function get_line( $sql , $db = NULL ) // 以一维数组的方式返回$sql对应的单行结果
function get_var( $sql , $db = NULL ) // 以变量的方式返回一个数值
function last_id( $db = NULL ) // last id
function run_sql( $sql , $db = NULL ) // 运行sql,不返回结果集
function db_error() // 数据库错误信息
function db_errno() // 数据库错误编号
function close_db( $db ) // 显式关闭数据库链接

特别说明

其中要详细说明的有两个:

C($KEY)和配置文件

LP将应用配置信息保存在AROOT/config/app.config.php下,使用$GLOBALS['config']超全局变量以数组形式保存。使用c($key)的方式,可以在MVC各个地方获取。

PREPARE()函数

这个函数是LP3新引入的,主要是希望减少SQL注入的问题。使用方式如下:

echo $sql = prepare( “SELECT * FROM `user` WHERE `name` = ?s AND `uid` = ?i AND `level` = ?s LIMIT 1″ , array( “Easy’” , ‘-1′, ’9.56′ ) );

输出结果为:

SELECT * FROM `user` WHERE `name` = ‘Easy\” AND `uid` = ‘-1′ AND `level` = ’9.56′ LIMIT 1

使用prepare函数时要注意:SQL必须使用双引号,【?i】表示整数,【?s】表示整数以外的其他值。prepare会无例外的mysql_real_escape_string,然后在两边加上单引号。

CSS,JAVASCRIPT和AJAX

LP3采用BootStrap这个流行的前端框架,你可以从这里看到它的详细介绍

JavaScript库上,LP3开始换为JQuery。这里是JQuery API的参考手册

为了方便不熟悉的同学也能使用好Ajax,LP3自己实现了Ajax传输数据的JS函数。这些函数都放在AROOT/static/script/app.js中。

$(#标签ID’).load(‘URL’);  // 是由JQuery自身实现的,可以方便的无刷新载入页面。

send_form_in( ‘FROMID’ ); // 将form表单中的数据通过Ajax提交(file类型除外),并将服务器返回的HTML显示在Form表单顶部

send_form_pop(‘FROMID’); //  将form表单中的数据通过Ajax提交(file类型除外),并将服务器返回的HTML显示在浮动图层中

好了,这里就是关于LP3 的一切了,希望LP3能让你更快的完成工作。

More Repositories

1

howto-make-more-money

程序员如何优雅的挣零花钱,2.0版,升级为小书了。Most of this not work outside China , so no English translate
PHP
16,190
star
2

lean-side-bussiness

精益副业:程序员如何优雅地做副业
8,305
star
3

pushdeer

开放源码的无App推送服务,iOS14+扫码即用。亦支持快应用/iOS和Mac客户端、Android客户端、自制设备
C
4,353
star
4

one-person-businesses-methodology

一人公司方法论
3,220
star
5

stack-roadmap

方糖全栈路线图2023,为「从螺丝钉到一人企业」补全技能栈
PHP
3,063
star
6

CookieCloud

CookieCloud是一个和自架服务器同步浏览器Cookie和LocalStorage的小工具,支持端对端加密,可设定同步时间间隔。本仓库包含了插件和服务器端源码。CookieCloud is a small tool for synchronizing browser cookies and LocalStorage with a self-hosted server. It supports end-to-end encryption and allows for setting the synchronization interval. This repository contains both the plugin and the server-side source code
JavaScript
1,581
star
7

checkchan-dist

Check酱:监测网页内容变化,并发送异动到微信。亦支持http status、json和rss监测。配合自架云端,关电脑后也能运行。
JavaScript
1,532
star
8

openai-api-proxy

一行Docker命令部署的 OpenAI/GPT API代理,支持SSE流式返回、腾讯云函数 。Simple proxy for OpenAi api via a one-line docker command
JavaScript
1,450
star
9

openai-gpt-dev-notes-for-cn-developer

如何快速开发一个OpenAI/GPT应用:国内开发者笔记
Shell
1,403
star
10

wecomchan

微信推送服务Server酱的开源替代。通过企业微信向微信推送消息的配置文档、直推函数和可自行搭建的在线服务代码。
Go
1,233
star
11

docker2saas

An open source tool that lets you create a SaaS website from docker images in 10 minutes.
PHP
765
star
12

chatchan-dist

Chat酱独立部署版,docker方案自带代理
Dockerfile
729
star
13

catgate

CatGate is a small crawler framework based on Chrome extension . CatGate是一个基于浏览器插件的数据抓取工具。做成浏览器插件无需模拟登入,能最真实的模仿用户行为和特征。
Vue
673
star
14

TeamToy

企业协同办公工具TeamToy2(多人TODO版)官方Git源
PHP
662
star
15

rsspush

监测RSS变动,并发送最新内容到微信、Webhook 和 Telegram, Discord, Slack, Amazon SNS, Gotify 等数十个消息通道。
499
star
16

telechan

message api for telegram bot 可供多人发送消息的 telegram 机器人 api , 类似server酱的开源实现
TypeScript
414
star
17

not-only-fans

an open source, self-hosted digital content subscription platform like `onlyfans.com` with cryptocurrency payment
HTML
356
star
18

career-guide-for-cs-graduate

计算机系应届生求职指北
316
star
19

LazyPHP4

LazyPHP4 , an API first framework for php developer
PHP
315
star
20

MemberPrism2

open source alternative to memberstack / memberspace , but with both front and backend member-only content protection
PHP
273
star
21

http-t-shirts

Open source http status code T shirt · http状态码系列T恤设计稿
266
star
22

tumblr-like-exporter

Download tumblr photos you liked , or others liked . Or even images in your blog . It supports videos now , see README to enable it
PHP
262
star
23

LazyRest4

基于Web界面的Rest风格API生成器For LazyPHP4
PHP
244
star
24

botchan

基于微信测试号的ChatBot,对接OpenAI API
JavaScript
242
star
25

lianmilite

莲米粒是一个基于PHP+MySQL+微信小程序技术栈的、拥有用户登入、发布、修改、删除和转发信息、以及私信聊天模块的信息流应用。
PHP
233
star
26

deepgpt-dist

DeepGPT,类agentGPT/AutoGPT 工具,支持 api2d / 和自定义 openai key。此为静态网页独立部署版,部署方便
JavaScript
227
star
27

book-by-ai

Generate high-quality books with AI
JavaScript
216
star
28

TeamToy-Pocket

TeamToy是跨平台的团队TODO应用,官网 TeamToy.net。 TeamToyPocket是其移动客户端。本项目采用GPLV2协议,本分支代码用于在新浪移动云上直接打包。如果自行用PhoneGap打包,请将代码中<phonegap></phonegap>换成phonegap.js的路径。
JavaScript
203
star
29

LazyREST

可通过Web配置的REST Server,采用GPLV2授权
PHP
193
star
30

gpt-bat

GPT长文本批处理工具,Batch Processing tools for GPT
JavaScript
184
star
31

LazyAudioBook

将 txt 文件生成语音书。
PHP
167
star
32

flowdeer-dist

可用于深度思考和复杂流程的AI工具
163
star
33

LeanBase

143
star
34

aiapi

A Claude-driven, OpenAI specification-compliant API, free
135
star
35

onlytech-javascript-info

纯粹技术免费课计划·现代JavaScript 教程
112
star
36

timetodo-server

remote server for timetodo
PHP
108
star
37

windrecorder

JavaScript
103
star
38

rumenqi

从入门到放弃系列周边补全计划
98
star
39

api2d-js

OpenAI/Api2d pure js sdk 无需node后端直接在浏览器中运行,支持SSE流式输出
JavaScript
90
star
40

fangPHP

fangPHP is a docker based development env with php7 mysql redis and livereload
PHP
84
star
41

any2api

A framework( or a tool? ) that turns any website into an API
JavaScript
81
star
42

h2webreader

h2book web reader
JavaScript
78
star
43

awesome-checkchan

Check酱任务分享清单
76
star
44

windmark-practice

采用 windmark 编写的视频的源文件
74
star
45

h2reader-host

方糖小剧场Web阅读器和上传网站
JavaScript
72
star
46

Simple-Weibo

PS: 这个方案有些过时了,建议用新方案 https://github.com/qhm123/tinybo open source phonegap weibo client demo 。想要更多功能的同学自己写嘛,别偷懒哈。
JavaScript
70
star
47

url2pdf

url2pdf docker image based on wkhtmltopdf with Chinese support.
PHP
68
star
48

code-tattoo

语言纹身贴纸图案库
60
star
49

GPT4Company

Gpt4Company is a request forwarder used to prevent Samsung-style leaks. Gpt4Company 是一个用来避免三星式泄密的请求转发器
JavaScript
57
star
50

ffonline

video creating in browser
JavaScript
57
star
51

LazyBoardExt

定时采集数据并发送到指定接口的Chrome扩展机器人🤖
JavaScript
54
star
52

nCoV-push

nCoV疫情实时播报推送脚本。数据基于丁香园。
PHP
53
star
53

Wechat-Wordpress-Search

a wordpress plugin allowed user search blogs in wechat app
PHP
52
star
54

MoDocker

modo动漫私有云(modo.moe)的Docker构建用文件。
PHP
40
star
55

ask-gpt-download

通过GPT向微博账号提问
39
star
56

WindChat

A React Chatbot starter with highly customizable styles can be achieved through TailwindCSS. 可以通过 TailwindCSS 高度定制样式的 React Chatbot starter。
JavaScript
36
star
57

fo-pay

基于加密稳定币 FOUSDT 的 WordPress 付费阅读插件。
PHP
33
star
58

Fangtang-Chrome-Starter-Kit

Starter Kit for chrome extension based on Vue2 and ElementUI
JavaScript
33
star
59

serverchan-demo

Server酱多语言调用实例
Java
31
star
60

vue-starter

JavaScript
27
star
61

fangtangtree

方糖知识树
26
star
62

nowboard

基于SAE Channel服务的实时信息流展板。通过微博帐号登入、可聊天;支持API发布信息,可用于服务器调试信息、错误信息展示。
PHP
26
star
63

TeamToy-Plugins

TeamToy插件目录
PHP
24
star
64

LazyExtKit

a simple chrome extension startkit
JavaScript
24
star
65

github-action-server-chan

TypeScript
23
star
66

MetaToy2

通用命令行和可视化代码生成工具
EJS
19
star
67

WeiboList

微博上活跃的技术帐号整理
19
star
68

easy-starter2

react + mobx + react-router v4 + react-next-i18n starter for create-react-app 2.x
JavaScript
17
star
69

fangtangCV-react-native

react native demo
JavaScript
16
star
70

serverchan-wordpress-comments-notice

Server酱WordPress博客评论微信通知插件
PHP
16
star
71

easy-starter

一个整合了 react 、 react-router v4 和 mobx 的简单起始项目脚手架
JavaScript
15
star
72

LazyBot

一些基于 robo.li 的日常自动化/半自动化脚本
PHP
15
star
73

one-person-businesses-methodology-v2

用AI撰写的一本小书
Shell
14
star
74

teamtoy-mina-demo

一个调用TeamToy API 的微信小程序 Demo
JavaScript
14
star
75

CubismWebSamples-with-lip-sync

TypeScript
14
star
76

fullstack-learnning-map

全栈创业者(fullstack-creator)的知识地图
13
star
77

fangtangCV

PHP
12
star
78

2dstudio-dist

使用 API2D Key 的 Stable Studio,独立部署版
HTML
12
star
79

Aoi

LazyPHP3的看板娘,能帮你自动创建模板,Action和测试。
PHP
12
star
80

xf-tts-sdk

php & node sdk for xunfei tts websocket api
JavaScript
10
star
81

easychen.github.com

8
star
82

tcp

tcp包介绍网站
CSS
8
star
83

autoplay-web-specification

自播放网页规范 specification of autoplay web
7
star
84

imgShare

为文章中的图片添加鼠标浮动时分享到微博的链接。封装自 国内首家互联网人才拍卖网站 JobDeer.com
JavaScript
6
star
85

fangtangGif

方糖动图生成器
6
star
86

telegram-bot-api-proxy

express app for forwarding request to api.telegram.org
JavaScript
4
star
87

GameDemo

DemoGame for FE courses , Just a hosting , not open source project
4
star
88

easychen.github.io

HTML
4
star
89

book-by-ai-demo-book

3
star
90

LitePHP

Simple version of LazyPHP in one file
PHP
3
star
91

wordpress-local-dev-env

3
star
92

serverchan-e2e-demo

Server酱端对端加密函数和DEMO
2
star
93

fangCV

PHP
2
star
94

easychen

2
star
95

cubeslam

Automatically exported from code.google.com/p/cubeslam
JavaScript
2
star
96

TeamToy-Language-Files

translate teamtoy to other languages
PHP
2
star
97

fxd

Flow eXtension Define,它是一个被设计用于工作流(尤其是AI和自动化工作流)扩展的规范。"Flow eXtension Define" is a specification designed for extending workflows, especially AI and automation workflows.
JavaScript
2
star
98

bluesky-wave

Bluesky bulk follow tool
JavaScript
2
star
99

m5dash

Python
1
star
100

2d-ai-chatbot

TypeScript
1
star