一、什么是 Lumen?
Lumen 是一个由 Laravel 组件搭建而成的微框架,由 Laravel 官方维护。Lumen 为速度而生,是当前最快的 PHP 框架之一,甚至比类似的微框架 Silex 速度还要快。
Lumen 比其他微框架的优点是,构建在 Laravel 之上,使其具备 Laravel 强大的功能,如 路由,依赖注入,Eloquent ORM,数据库迁移管理,队列和计划任务等。
Laravel 本来就是一个功能齐全,速度飞快的框架,但是 Lumen 因为去除了很多 Laravel 的配置和可自定义的选项,速度越加飞快,毫秒必争。
官网:https://lumen.laravel-china.org/
中文文档:https://laravel-china.org/docs/lumen/5.7
安装包:https://www.golaravel.com/download/
在什么时候使用 Lumen?
Lumen 专为微服务或者 API 设计,举个例子,如果你的应用里面有部分业务逻辑的请求频率比较高,就可以单独把这部分业务逻辑拿出来,使用 Lumen 来构建一个小 App。
因为 Lumen 是对 Laravel 优化了框架的加载机制,所以 Lumen 对资源的要求少很多。
当然,你可以使用 队列系统 与你的主 Laravel 应用进行交互。Laravel 和 Lumen 从一开始就是设计成能一起很好的工作,并且,配合使用,允许你构架一个强大的,以微服务为驱动的应用程序。
Lumen 同时也非常适用于构建 API 接口,此类型的应用通常情况下不需要具备 全栈框架 的所有功能,如 HTTP 会话管理,Cookies,和模版系统。
Lumen 的限制
因为对框架的加载进行了优化,去除灵活性来换取速度,所以 Lumen 的可自定义性不是很强,一些专为 Laravel 开发的扩展包可能无法使用,如开发者工具条,CMS 系统等。
Lumen 没有使用 Symfony 的路由模块,而是采用了速度更加快的 nikic/fast-route。如果你需要使用 Symfony 的路由功能,如 子域名等高级路由功能,Lumen 可能不适合你,建议使用功能更加齐全的 Laravel。
如果你真的选择了全栈框架,请放心使用,构建在 Laravel 上的应用程序能处理每天 15,000,000 以上的请求,没什么可担忧的。
Lumen 包含了哪些 Laravel 的功能
Lumen 包含了大部分的 Laravel 全栈框架的功能:
· Blade 模版引擎
· Caching 缓存系统
· Command Scheduler 计划任务
· Controllers 控制器
· Eloquent ORM 数据库操作
· Error Handling 错误处理
· Database Abstraction 数据库抽象层
· Dependency Injection 依赖注入
· Logging 日志系统
· Queued Jobs 队列系统
Lumen 独特的初始化机制,使其在功能强大的同时,具备了高性能,是构建微服务架构应用的绝佳方案。
二、Lumen安装和配置
1.运行环境要求
Lumen 框架会有一些系统上的要求。当然,这些要求在 Laravel Homestead 虚拟机上都已经完全配置好了:
PHP >= 5.5.9
OpenSSL PHP Extension
Mbstring PHP Extension
Tokenizer PHP Extension
Laravel 的开发中,使用 Homestead 是必须的,不论你是一个人开发项目,还是团队开发,不管你是新手,还是老手,请使用 Homestead。可参考 Homestead 的环境部署脚本 来实现开发环境和生产环境的统一。
2.安装
Lumen 使用 Composer 来管理代码依赖。所以,在使用 Lumen 之前,请先确认你的电脑上安装了 Composer。
首先,使用 Composer 下载 Lumen 安装包:
composer global require "laravel/lumen-installer=~1.0"
请确定你已将 ~/.composer/vendor/bin 路径加到 PATH,只有这样系统才能找到 lumen 的执行文件。
一旦安装完成,就可以使用 lumen new 命令在指定的目录创建一个新的 Lumen 项目,例如:lumen new blog 将会在当前目录下创建一个叫 blog 的目录,此目录里面存放着新安装的 Lumen 和代码依赖。这个方法的安装速度比通过 Composer 安装要快上许多:
lumen new blog
除此之外,你也可以通过 Composer 在命令行运行 create-project 命令来安装 Lumen:
composer create-project laravel/lumen blog "5.1.*"
3.配置
1)基本配置
跟全栈框架 Laravel 框架不一样的是,所有的 Lumen 框架的配置信息都存储在 .env 文件中。
目录权限
安装 Lumen 之后,你必须设置一些权限。storage 和 bootstrap/cache 目录必须让服务器有写入权限。如果你使用 Homestead 虚拟机,那么这些权限应该已经被设置完成。
应用程序密钥
在你安装完 Lumen 后,首先需要做的事情是设置一个随机字符串到应用程序密钥。通常这个密钥会有 32 字符长。这个密钥可以被设置在 .env 环境文件中。如果你还没将 .env.example 文件重命名为 .env,那么你现在应该去设置下。如果应用程序密钥没有被设置的话,你的用户 Session 和其它的加密数据都是不安全的!
注意: 你需要去除文件 bootstrap/app.php 中的 Dotenv::load() 代码注释,这样 .env 文件才能被加载。
其它设置
Lumen 几乎不需做任何其它设置就可以马上使用。
你也可以设置 Lumen 的几个附加组件,像是:
2)优雅链接
Apache
框架通过 public/.htaccess 文件来让网址不需要 index.php。如果你的服务器是使用 Apache,请确认是否有开启 mod_rewrite 模块。
如果 Lumen 附带的 .htaccess 文件在 Apache 中无法使用的话,请尝试下方的做法:
Options +Fo的服务器是使用 Apache,请确认是否有开启 mod_rewrite 模块。
如果 Lumen 附带的 .htaccess 文件在 Apache 中无法使用的话,请尝试下方的做法:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Nginx
若你使用了 Nginx,则可以在网站设置中增加以下设置,以开启「优雅链接」:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
当然,如果你使用了 Homestead 的话,优雅链接已经自动帮你设置好了。
3)环境配置
应用程序常常需要根据不同的运行环境设置不同的值。例如,你会希望在本机开发环境上有与正式环境不同的缓存驱动。只需通过配置文件就可轻松完成。
Lumen 使用 Vance Lucas 的 DotEnv PHP 函数库来实现项目内环境变量的控制,在安装好的全新 Lumen 应用程序里,在根目录下会包含一个 .env.example 文件。如果你通过 Composer 安装 Lumen,这个文件将自动被更名为 .env,否则你只能手动更改文件名。
当你的应用程序收到请求时,这个文件所有的变量都会被加载到 PHP 超级全局变量 $_ENV 里。你可以使用辅助函数 env 来获取这些变量的值。
根据本机服务器或者正式环境的需求的不同,可自由修改环境变量。但是,.env 文件不应该被提交到应用程序的版本控制系统,因为每个开发人员或服务器在使用应用程序时,可能需要不同的环境配置。
如果你是某个团队的开发者,建议将 .env.example 文件放进你的应用程序。通过样本配置文件里的预设值,你团队中的其他开发人员就可以清楚地知道,在运行你的应用程序时有哪些环境变量是必须有的。
配置文件
Lumen 可以支持使用 Laravel 风格 的配置信息,只需要将 vendor/laravel/lumen-framework/config 文件夹复制到项目根目录下即可。
自定义配置文件
你可以使用 $app->configure() 方法来加载自定义的配置信息,例如你想加载 config/options.php 配置文件,可以使用以下调用:
$app->configure('options');
获取目前应用程序的环境
应用程序的当前环境是由 .env 文件中的 APP_ENV 变量所决定的。你可以通过 App facade 的 environment 方法来获取该值:
$environment = App::environment();
你也可以传递参数至 environment 方法来确认当前环境是否与参数相符合:
if (App::environment('local')) {
// 环境是 local
}
if (App::environment('local', 'staging')) {
// 环境是 local 或 staging...
}
也可通过 app 辅助函数获取应用程序实例:
$environment = app()->environment();
获取设置值
你可以使用 config 辅助函数获取你的设置值,设置值可以通过「点」语法来获取,其中包含了文件与选项的名称。你也可以指定一个默认值,当该设置选项不存在时就会返回默认值:
$value = config('app.timezone');
若要在运行期间修改设置值,请传递一个数组至 config 辅助函数:
config(['app.timezone' => 'America/Chicago']);
三、简单实例
1.局域网访问Apache
制作完一个API,本地测试完,就得给APP他们使用了,不想部署到服务器那么麻烦的话,可以修改配置,让局域网内可以访问。
Apache/conf目录下的httpd.conf新增
Listen 192.168.0.135:8080
<VirtualHost 192.168.0.135:8080>
DocumentRoot "H:/xampp/htdocs/PDK-API/public"
</VirtualHost>
2.路由
我讨厌的事情之一就是维护很多的路由管理规则。
API请求统一为Post请求,为什么要分什么Get,Post,Put,Delete?又不是restful,统一使用Post请求只是觉得这样至少不可以直接在浏览器访问。
<?php $app->group(["namespace"=>"App\Http\Controllers"], function()use($app){ //账户控制器 $app->post("/AccountController/{Type}",["uses" => "AccountController@Index"]); //资讯控制器 $app->post("/NewsController/{Type}",["uses" => "NewsController@Index"]); //web测试。方便调试,生产环境中会注释掉这些代码 $app->get("/AccountController/{Type}",["uses" => "AccountController@Index"]); $app->get("/NewsController/{Type}",["uses" => "NewsController@Index"]); });
这样的话,每个请求都要指定用哪个控制,但统一指定”Index”方法。在”Index”里面再去“分流”处理请求。
3.Model
数据库操作有时有坑,最好指定表名和主键。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class information extends Model { protected $table = 'informations'; //指定操作表名 protected $primaryKey = "information_id"; //指定主键 }
4.控制器
<?php namespace App\Http\Controllers; use App\Models\Information; use App\Models\Collection; use App\Models\User; use Laravel\Lumen\Routing\Controller as BaseController; use Illuminate\Http\Request; class NewsController extends BaseController { function Index(Request $request,$Type){ $responseData = [ "State" => "Fail", "Value" => "传入有误" ]; //获取资讯列表 if($Type == "getList"){ $information = new Information; $page = (int)$request->page; $list = $information->orderBy('created_at', 'desc')->forPage($page,10)->get(); //……省略代码…… $responseData["list"] = $list; return json_encode($responseData, JSON_UNESCAPED_UNICODE);//统一响应格式 } //获取资讯 详情 else if($Type == "getInformation"){ //……省略代码…… } //收藏资讯 else if($Type == "collectInformation"){ //判断是否登录 $user = new User; $loginUser = $user->LoginUser($request->username, $request->token);//可以在Model类扩展函数 if(!$loginUser){ $responseData["State"] = "NeedLogin"; $responseData["Value"] = "请重新登录"; return json_encode($responseData, JSON_UNESCAPED_UNICODE); } //收藏资讯 //……省略代码…… $responseData["State"] = "Success"; $responseData["Value"] = "收藏成功"; return json_encode($responseData, JSON_UNESCAPED_UNICODE); } return json_encode($responseData, JSON_UNESCAPED_UNICODE); } }
这样的架子,虽然路由表简单多了,但是控制器相对复杂了。当然需要的话可以精简精简。
参考网址:
https://laravelacademy.org/tags/lumen/
https://www.jianshu.com/p/bba4239c7c03
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79760485
转载请注明: ITTXX.CN--分享互联网 » PHP Lumen 专注API框架入门讲解
最后更新:2020-05-26 16:06:50