欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

文摘  PHP Lumen 专注API框架入门讲解

PHP框架 本站 2083 1评论

一、什么是 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

赞 (15) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(1)个小伙伴在吐槽
  1. good#1
    游客2020-05-26 16:06 (3年前) 回复