Laravel 之道特别篇 5: 教你如何寻找 Laravel 服务中的方法

前言

相信各位在用 Laravel 开发项目时,总会有需要 Ctrl + 鼠标左键 查看一个方法的具体详情时候。

由于 Laravel 的单词标识机制(或者称为门面机制),导致 PhpStorm 无法正确跳转到具体方法,有时总是跳转到 方法所在类的接口类或抽象类中。

那么我们应该如何找到这个方法所在正确类(服务)呢?

关键还是所跳转的接口类或抽象类

举个例子

我们就以 App\Http\Kernel 类中声明的 web 中间件组中的 App\Http\Middleware\EncryptCookies 的实例化为例进行讲解。

file

App\Http\Middleware\EncryptCookies

<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array
     */
    protected $except = [
        //
    ];
}

我们跳转到父类 Illuminate\Cookie\Middleware\EncryptCookies 的构造方法中

file

如下代码:

Illuminate\Cookie\Middleware\EncryptCookies

file

会跳转到 Illuminate\Contracts\Encryption\Encrypter 接口类

file

这样就造成,我们无法查看 decrypt 方法真正内容。为什么会跳转到这个接口类呢?

原因还是在构造函数上

<?php

namespace Illuminate\Cookie\Middleware;

// ... 省略若干代码
use Illuminate\Contracts\Encryption\Encrypter as EncrypterContract;

// ... 省略若干代码

public function __construct(EncrypterContract $encrypter)
{
    $this->encrypter = $encrypter;
}

// ... 省略若干代码

protected function decryptCookie($name, $cookie)
{
    return is_array($cookie)
                    ? $this->decryptArray($cookie)
                    : $this->encrypter->decrypt($cookie, static::serialized($name));
}

看到没 decrypt 方法是 encrypter 属性上调用的,而 encrypter 属性从构造方法上被赋值,且赋的值必须是 Illuminate\Contracts\Encryption\Encrypter 实例或者是它的实现类的实例。由于不是通过实现类进行类型约束的,那它的实现类到底是谁?

寻找 Illuminate\Contracts\Encryption\Encrypter 接口的实现类

如何寻找呢?

  • 第一步,我们到 Laravel 服务容器 Application 中寻找 Illuminate\Contracts\Encryption\Encrypter 类名指向的门面单词标识

    file

    file

    找到了单词标识是 encrypter

  • 第二步,到 app.php 配置文件中,寻找与 encrypter 有关的服务提供者类

    file

  • 第三步,进入服务提供者中(Ctrl + 鼠标左键),寻找 register 方法

    file

    file

相关文章

关于 EncryptCookies 路由中间件实现作用,欢迎移步到 Laravel 之道有关内容 ---> 传送门

本作品采用《CC 协议》,转载必须注明作者和本文链接
时空扭曲, 到底长啥样.
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1
皮皮岛

这样还是有些麻烦啊,另外有没有好的代码运行追踪的工具,可以查看源码运行,难道只有Xdebug吗?

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!