喜欢(❤ ω ❤) laravel 但是它太笨重了
想快速简洁的开发小项目,试一试Lemon 吧。
Lemon 是一个现代的 PHP 框架,采用 composer 管理组件依赖。
如何使用 Lemon
安装
前面已经说过 Lemon 采用 composer 加载。
第一步,使用 composer 安装
mkdir lemon
cd lemon
composer require chanywn/lemon
第二步,新建 index.php 文件
require 'vendor/autoload.php';
use Lemon\Route;
Route::get('/', function($request, $response){
return $response->write('Hello lemon');
});
Route::run();
第三步,执行内置服务器
php -S localhost:4000
Lemon 的功能
路由
在 Lemon 中的路由是通过匹配的URL模式与回调函数。
Route::get('/', function($request, $response) {
echo 'index';
});
当然也可以这样表示
Route::get('/', 'hello');
function hello($request, $response){
echo 'index';
}
请求方式
Route 是路由模块的静态类,您可以通过执行route类的各种静态方法来响应特定方法。
Route::get('/method/1', function($request, $response) {
echo '我收到了一个 GET 请求';
});
Route::post('/method/2', function($request, $response) {
echo '我收到了一个 POST 请求';
});
Route::put('/method/3', function($request, $response) {
echo '我收到了一个 GET 请求';
});
Route::delete('/method/4', function($request, $response) {
echo '我收到了一个 POST 请求';
});
Route::any('/method/5', function($request, $response) {
echo sprintf('我收到了一个 %s 请求', $request->method);
});
哈哈,可以愉快的开发 restful api 了。
你可能已经注意到了回调函数中的 $request 和 $response,这两个参数,这两个参数是Request和Response类的实例,是回调函数的必须参数。这两个参数很有用,之后会介绍。
通配符路由
route::get('/hello/(:any)', function($request, $response, $name) {
echo 'hello ' . $name;
});
该方法第一个参数是要匹配的路由URL,其中(:any) 通配符用来匹配任意值。在回调函数中我们使用了$name参数来接收这个值。
上面典型的路由匹配的是一个,匹配多个值的时候,回调函数中的参数位置对应匹配的值,参数名自定
。
route::get('/(:num)/(:num)/(:num)', function($request, $response, $year, $month, $day) {
echo $year . '/' . $month . '/' . $day;
});
(:num) 匹配只含有数字的一段。 (:any) 匹配含有任意字符的一段。
Request(请求)
得到当前请求的路径、方法、ip
route::get('/', function($request, $response) {
echo $request->path .'
';
echo $request->method .'
';
echo $request->ip .'
';
});
接受get参数
localhost:3000/home?name=razor&age=0
route::get('/home', function($request, $response) {
var_dump($request->get());
// or
echo $request->get('name');
});
接受post参数
route::any('/home', function($request, $response) {
var_dump($request->post());
// or
echo $request->post('name');
});
判断当前请求类型
route::any('/', function($request, $response) {
if($request->isGET()) {
echo '当前是 GET 请求';
}
if($request->isPost()) {
echo '当前是 Post 请求';
}
});
Response(响应)
重定向
route::get('/', function($request, $response) {
return $response->redirect('/home');
});
返回HTTP状态码
route::get('/', function($request, $response) {
return $response->statusCode(404);
});
渲染视图
route::get('/', function($request, $response) {
return $response->view('index');
});
或者
route::get('/', function($request, $response) {
return $response->view('index', ['title' => '首页']);
});
表单验证
require '../vendor/autoload.php';
use Lemon\Route;
use Lemon\Validation;
route::get('/', function($request, $response) {
/*
* 规则数组,键为要验证的字段,值为要验证的规则
* :姓名 这是别名的写法,可以加也可以不加
*/
$rules = [
'name:姓名' => 'required|min:3|max:9',
'age:年龄' => 'required|integer',
'email:邮箱' => 'required|email',
];
$validator = new Validation($request->get(), $rules);
// 判断是否成功验证
if(!$validator->success) {
//输出[数组]错误
debug($validator->errors);
}
});
目前支持的规则有以下几点
return [
'email' => ':attribute 格式不可用',
'min' => ':attribute 长度必须大于或等于 :min',
'max' => ':attribute 长度必须小于 :max.',
'required' => ':attribute 是必填项',
'numeric' => ':attribute 必须为数字',
'integer' => ':attribute 必须为整数',
'alpha' => ':attribute 必须仅包含字母字符',
'alpha_dash'=> ':attribute 必须仅包含字母、数字、破折号',
'alpha_num' => ':attribute 必须仅包含字母、数字'
];
如果你感兴趣,欢迎扩充验证规程,比如httpurl、ip等等
数据库操作
数据库操作类的命名空间在 Lemon\Database; ,Database 基于Pdo实现的数据库链式查询。
配置
Lemon\Database::set([
'driver' => 'mysql',
'host' => 'localhost',
'port' => '3306',
'username' => 'root',
'password' => '',
'database' => '',
'charset' => 'utf8'
]);
基本使用的例子
require '../vendor/autoload.php';
use Lemon\Route;
use Lemon\Database;
Database::set([
'driver' => 'mysql',
'host' => 'localhost',
'port' => '3306',
'username' => 'root',
'password' => '',
'database' => '',
'charset' => 'utf8'
]);
Route::get('/', function($request, $response){
$users = Database::table('users')->get();
});
Route::run();
get 方法有一个参数,默认是*,执行成功返回一个数组。
从数据表中获取单个列或行
如果你只需要从数据表中获取一行数据,则可以使用 first 方法。这个方法将返回单个关联数组:
$user = db::table('users')->where('name', 'John')->first();
echo $user->name;
如果你不需要一整行数据,则可以带上参数来从单条记录中取出单个值。此方法将直接返回字段的值:
$name= db::table('users')->where('name', 'John')->first('name');
echo $name;
find 子句
如果你的某个表主键名正好叫id,你可以这样找到它。
db::table('users')->find($id);
如果它叫其它什么名
db::table('users')->find($id, 'user_id');
orderBy 子句
orderBy 方法允许你根据指定字段对查询结果进行排序。orderBy 方法的第一个参数是你想要用来排序的字段,而第二个参数则控制排序的顺序,可以为 asc 或 desc:
db::table('users')->orderBy('id')->get();
Where 子句
你可以在查询构造器实例中使用 where 方法从而把 where 子句加入到这个查询中。基本的 where 方法需要3个参数。第一个参数是字段的名称。第二个参数是要对字段进行评估的值。第三个参数是运算符,可选参数默认为=,它可以是数据库所支持的任何运算符。
$users = db::table('users')->where('votes', 100)->get();
$users = db::table('users')->where('votes', 100, '>')->get();
take 子句
你可以使用take 方法来限制查询结果数量,两个参数第一个是起始位置,第二个是取多少条数据:
$users = db::table('users')->take(10, 20)->get();
insert 方法
查询构造器也提供了 insert 方法,用来插入记录到数据表中。insert 方法接收一个包含字段名和值的数组作为参数:
db::table('users')->insert(
['email' => 'john@example.com', 'votes' => 0]
);
执行成功返回受影响的行,失败返回false.
自增 ID
(无)
Updates 方法
当然,除了在数据库中插入记录外,你也可以使用 update 来更新已存在的记录。update 方法和 insert 方法一样,接收含有字段及值的数组,其中包括要更新的字段。可以使用 where 子句来约束 update 查找:
db::table('users')->where('id', 1)->update(['votes' => 1]);
自增或自减
(无)
Delete 方法
查询构造器也可使用 delete 方法从数据表中删除记录。在 delete 前,还可使用 where 子句来约束 delete 语法:
db::table('users')->delete();
db::table('users')->where('votes',100,'>')->delete();
实战
基于 Lemon 的博客项目
源码仓库
欢迎贡献代码