资讯专栏INFORMATION COLUMN

lumen5.5学习(二)

shengguo / 595人阅读

摘要:继续学习分割线看看是怎么输出这个数据目录下的加载了下的的自动加载加载的配置初始化应用初始化的内容指定项目基础目录注册服务容器注册异常处理实例

继续学习lumen5.5

-----------------------分割线-----------------------

看看是怎么输出"Lumen (5.5.2) (Laravel Components 5.5.*)"这个数据

public目录下的index.php加载了bootstrap下的app.php

require_once __DIR__."/../vendor/autoload.php";//composer的自动加载
(new DotenvDotenv(__DIR__."/../"))->load(); //加载.env的配置

$app = new LaravelLumenApplication(
    realpath(__DIR__."/../")
);//初始化应用

//初始化的内容
public function __construct($basePath = null)
{
    if (! empty(env("APP_TIMEZONE"))) {
        date_default_timezone_set(env("APP_TIMEZONE", "UTC"));
    }
    //指定项目基础目录
    $this->basePath = $basePath;
    //注册服务容器
    $this->bootstrapContainer();
    //注册异常处理
    $this->registerErrorHandling();
    //实例化Route路由类
    $this->bootstrapRouter();
}

然后是注册核心组件进服务容器中(laravel的服务容器后面再学习)

主要看

$app->router->group([
    "namespace" => "AppHttpControllers",
], function ($router) {
    require __DIR__."/../routes/web.php";
});

加载路由文件以便它们可以全部被添加到应用,这将提供所有请求接口的响应
第一个参数是指定处理接口属性设置,namespance属性是指定处理请求的控制器所在目录
第二个参数是一个闭包函数,传一个匿名函数到group方法里

找到web.php

$router->get("/", function () use ($router) {
    return $router->app->version();
});

把web.php定义的路由都放在这个这个匿名函数中,相当于下面这样

$app->router->group([
    "namespace" => "AppHttpControllers",
], function ($router) {
    $router->get("/", function () use ($router) {
        return $router->app->version();
    });
});

然后看Router类里面的group方法,有一个

call_user_func($callback, $this);

这段代码执行传进来的匿名函数,就是web.php定义的所有路由

$router->get("/", function () use ($router) {
    return $router->app->version();
});

找到Router类里面的get方法看到调用了addRoute方法,看到名字就大概知道是添加路由的意思

    /**
     * Add a route to the collection.
     *
     * @param  array|string  $method
     * @param  string  $uri
     * @param  mixed  $action
     * @return void
     */
    public function addRoute($method, $uri, $action)
    {
        $action = $this->parseAction($action);

        $attributes = null;

        if ($this->hasGroupStack()) {
            $attributes = $this->mergeWithLastGroup([]);
        }

        if (isset($attributes) && is_array($attributes)) {
            if (isset($attributes["prefix"])) {
                $uri = trim($attributes["prefix"], "/")."/".trim($uri, "/");
            }

            if (isset($attributes["suffix"])) {
                $uri = trim($uri, "/").rtrim($attributes["suffix"], "/");
            }

            $action = $this->mergeGroupAttributes($action, $attributes);
        }

        $uri = "/".trim($uri, "/");

        if (isset($action["as"])) {
            $this->namedRoutes[$action["as"]] = $uri;
        }

        if (is_array($method)) {
            foreach ($method as $verb) {
                $this->routes[$verb.$uri] = ["method" => $verb, "uri" => $uri, "action" => $action];
            }
        } else {
            $this->routes[$method.$uri] = ["method" => $method, "uri" => $uri, "action" => $action];
        }
    }

里面做的就是把在web.php定义的路由翻译成你想要处理的方式,最后都放在$routes这个属性当中,这里可以参考文档中[HTTP 路由][1]部分(这是旧版中文文档,新版要看官网的英文版,不同之处在于$app换成$route,旧的路由定义文件是routes.php,新的是web.php)

可以把上面那个请求路由的代码翻译成,当请求路由为"api.com/index.php/"时候,调用匿名函数

function () use ($router) {
    return $router->app->version();
}

进行响应;可以看出当执行匿名函数时调用的是application类里面的version方法

public function version()
{
    return "Lumen (5.5.2jjj) (Laravel Components 5.5.*)";
}

PS:这里只是return,还不是echo输出,继续往下看,$app->run();下次再补充....

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26161.html

相关文章

  • lumen5.5学习(一)

    摘要:最近在学习框架写接口,记忆力比较差所以顺便写下笔记分割线因为直接学最新版的所以,记得开启的,,扩展还有可以用的打开命令 最近在学习lumen框架写API接口,记忆力比较差所以顺便写下笔记~ -----------------------------分割线-------------------------------- 因为直接学最新版的所以,PHP >=7.0记得开启php.ini的o...

    mindwind 评论0 收藏0
  • lumen5.5学习路由和中间件(四)

    摘要:想要做到这一点,你需要定义中间件为。如果你希望在及方法被调用时使用一致的中间件实例,只需在容器中使用容器的方法注册中间件以上就是路由和中间件的学习,最后那那其实理解得有点虚,有错记得指出修正,谢谢 前几篇了解完从请求到响应的流程后,仔细学习下路由和中间件的玩法 ----------------------------------分割线--------------------------...

    1fe1se 评论0 收藏0
  • lumen5.5学习(三)

    摘要:接着上篇分割线是的实例,但是文件中找不到方法在类内部看到,打开找到了方法,方法注释写的是主要用于运行应用以及发送响应主要看方法 接着上篇$app->run();--------------------分割线------------------------ $app是Application的实例,但是Application.php文件中找不到run方法在类内部看到use Concerns...

    svtter 评论0 收藏0
  • windows下laravel5.5手写教程1(适合初学者)

    摘要:打开浏览器输入,如无意外,将出现如下图,表示框架安装成功。四系统内部后台管理系统这个是框架自带的后台登录管理系统,只需要简单的命令即可运行。出现上图即为,创建模型成功。 在PHP个各种web开发框架中,laravel算是一款简洁、优雅的开发框架,本人也刚刚接触到laravel,通过学习大神们的一些文章,下面是我的一些心得体会,希望可以给初学者一些帮助,大家一起进步。言归正传: 本人环境...

    GeekGhc 评论0 收藏0
  • 【机器学习】机器学习简介

    摘要:二十世纪八十年代是机器学习成为一个独立的学科领域各种机器学习技术百花初绽的时期。这时候,人们把机器学习划分为机械学习,示教学习,类比学习,归纳学习。三机器学习的分类机器学习中,有个定理叫没有免费午餐定理,简称定理。 一、人工智能与机器学习 说到人工智能,就不得不提图灵测试。图灵测试是阿兰图灵在1950年提出的一个关于机器是否能够思考的著名实验,测试某机器是否能表现出与人等价或无法区分的...

    developerworks 评论0 收藏0

发表评论

0条评论

shengguo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<