快速定位无用路由 妈妈再也不用担心人工排雷了

简介: 快速定位无用路由 妈妈再也不用担心人工排雷了

介绍


看到 Github 一个包,跟踪路由的请求,记录哪个路由在哪一个时刻被调用。这个包最大的目的不是分析数据,而是可以随时随地的查看哪些路由没被调用却还存在程序中。比如你现在去了新的公司,接手了一个新的项目或者你一年前的项目,可能很多路由在前端的请求已经砍掉了,但是你后端的接口还没去掉,这时候这个包的作用就发挥出来了,避免了你人工扫雷。


快速上手


确保 PHP 版本 7.1 及以上, Laravel 版本 5.8 及以上

composer require julienbourdeau/route-usage

接下来你所有的请求将记录表中,你可以通过两种方式来查看路由情况,可以直接访问 Auth.php


1668570877718.jpg


当然该扩展还提供了命令行查看


1668570887386.jpg


加一个参数


1668570895227.jpg


剩下的好像也没做什么了,闲着也是闲着,看看他咋么写的

public function boot()
    {
        Event::listen(RequestHandled::class, LogRouteUsage::class);
        $this->loadViewsFrom(__DIR__.'/../resources/views', 'route-usage');
        $this->loadMigrationsFrom(__DIR__.'/../database/migrations');
        $this->loadRoutesFrom(__DIR__.'/routes.php');
        if ($this->app->runningInConsole()) {
            // Registering package commands.
            $this->commands([
                UsageRouteCommand::class,
            ]);
        }
    }

引导应用程序运行服务,监听 RequestHandled 事件,这个事件是在什么时候执行的

#index.php
...
....
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);\
$response = $kernel->handle(\
    $request = Illuminate\Http\Request::capture()\
);
#Illuminate\Foundation\Http\Kernel
public function handle($request)
{
    .....
    .....
    ....
    $this->app['events']->dispatch(
        new Events\RequestHandled($request, $response)\
    );
  .....
}

进去看下监听器具体干了什么,好吧说白了就是记录 2xx 和 3xx 的请求记录

public function handle($event)
    {
        $status_code = $event->response->getStatusCode();
        if ($status_code > 400 || $status_code < 200) {
            return;
        }
        $method = $event->request->getMethod();
        $path = $event->request->route()->uri ?? $event->request->getPathInfo();
        $action = optional($event->request->route())->getAction()['uses'];
        if ($action instanceof \Closure) {
            $action = '[Closure]';
        } elseif (!is_string($action) && !is_null($action)) {
            $action = '[Unsupported]';
        }
        $identifier = sha1($method.$path.$action.$status_code);
        $date = date('Y-m-d H:i:s');
        DB::statement(
            "INSERT INTO route_usage
                    (`identifier`, `method`, `path`, `status_code`, `action`, `created_at`, `updated_at`)
                VALUES (?, ?, ?, ?, ?, ?, ?)
                ON DUPLICATE KEY UPDATE `updated_at` = '{$date}'",
            [$identifier, $method, $path, $status_code, $action, $date, $date]
        );
    }

接下来看监听后面一坨是什么

.....
......
  $this->loadViewsFrom(__DIR__.'/../resources/views', 'route-usage');
        $this->loadMigrationsFrom(__DIR__.'/../database/migrations');
        $this->loadRoutesFrom(__DIR__.'/routes.php');
        if ($this->app->runningInConsole()) {
            // Registering package commands.
            $this->commands([
                UsageRouteCommand::class,
            ]);
        }

如果应用中包含了路由,视图还有迁移文件,你需要告诉服务容器咋么去加载他们,也就是位置甩给他们,如果是在命令行操作,需要把扩展包中的命令注册到 Laravel 中, 调用 commands ,文件里面就是一个继承自 Illuminate\Foundation\Console\RouteListCommand 的基类

<?php
namespace Julienbourdeau\RouteUsage\Console\Commands;
use Illuminate\Foundation\Console\RouteListCommand;
use Julienbourdeau\RouteUsage\RouteUsage;
class UsageRouteCommand extends RouteListCommand
{
    protected $name = 'usage:route';
    protected $description = 'Show route list with the last access datetime';
    protected $headers = ['Domain', 'Method', 'URI', 'Last used', 'Name', 'Action', 'Middleware'];
    protected $compactColumns = ['method', 'uri', 'last used', 'action'];
    protected function getRoutes()
    {
        $routes = $this->splitRoutesByMethods(parent::getRoutes());
        // TODO: sort by updated_at and group by method+path
        $routeUsage = RouteUsage::all()->mapWithKeys(function ($r) {
            $key = $r->method.'.'.$r->path;
            return [$key => $r];
        });
        return $routes->map(function ($route) use ($routeUsage) {
            $usageKey = $route['method'].'.'.$route['uri'];
            $lastUsed = $routeUsage->has($usageKey) ?
                $routeUsage->get($usageKey)->updated_at->diffForHumans()
                : 'Never';
            return $this->option('compact') ?
                [
                    'method' => $route['method'],
                    'uri' => $route['uri'],
                    'last used' => $lastUsed,
                    'action' => $route['action'],
                ] : [
                    'domain' => $route['domain'],
                    'method' => $route['method'],
                    'uri' => $route['uri'],
                    'last used' => $lastUsed,
                    'name' => $route['name'],
                    'action' => $route['action'],
                    'middleware' => $route['middleware'],
                ];
        })->toArray();
    }
    protected function splitRoutesByMethods(array $routes)
    {
        return collect($routes)->transform(function ($r) {
            $splitRoutes = [];
            foreach (explode('|', $r['method']) as $m) {
                $r['method'] = $m;
                $splitRoutes[] = $r;
            }
            return $splitRoutes;
        })->flatten(1)->reject(function ($r) {
            return 'HEAD' === $r['method'];
        })->values();
    }
}
相关文章
|
Linux Docker 容器
「Docker」M1 Pro 打包docker image问题合集
「Docker」M1 Pro 打包docker image问题合集
324 0
|
分布式计算 数据可视化 大数据
用Spark分析Amazon的8000万商品评价(内含数据集、代码、论文)
尽管数据科学家经常通过分布式云计算来处理数据,但是即使在一般的笔记本电脑上,只要给出足够的内存,Spark也可以工作正常(在这篇文章中,我使用2016年MacBook Pro / 16GB内存,分配给Spark 8GB内存)。
19905 0
|
Java
深入浅出适配器模式
深入浅出适配器模式
87 0
|
7月前
|
SQL 存储 分布式计算
查询队列(Query Queue)快速入门
本文由钟昌宏(大宏)分享,主题为Hologres 3.0新功能——Hologres查询队列(Query Queue)的使用场景、基本用法及入门实践。内容涵盖四个部分:查询队列的基本介绍、并发控制与排队能力、查询隔离与熔断,以及如何在管控台观察计算组或实例使用查询队列的情况。通过分类器管理、匹配规则等机制,实现对不同类型Query的灵活控制,并结合Serverless Computing提升系统稳定性与成功率。适用于数据写入与查询任务的优化场景。
|
9月前
|
机器学习/深度学习 传感器 人工智能
穹彻智能-上交大最新Nature子刊速递:解析深度学习驱动的视触觉动态重建方案
上海交大研究团队在Nature子刊发表论文,提出基于深度学习的视触觉动态重建方案,结合高密度可拉伸触觉手套与视觉-触觉联合学习框架,实现手部与物体间力量型交互的实时捕捉和重建。该方案包含1152个触觉感知单元,通过应变干扰抑制方法提高测量准确性,平均重建误差仅1.8厘米。实验结果显示,其在物体重建的准确性和鲁棒性方面优于现有方法,为虚拟现实、远程医疗等领域带来新突破。
229 32
|
11月前
|
供应链
八大战略助力供应链应对地缘政治挑战与七大新兴风险
八大战略助力供应链应对地缘政治挑战与七大新兴风险
|
11月前
|
计算机视觉
ECCV 2024:新梦幻场景生成方法,高质量、视角一致、可编辑3D场景
【10月更文挑战第27天】DreamScene是一种新型的文本到3D场景生成框架,基于3D高斯模型。它通过形成模式采样(FPS)和渐进式三阶段相机采样策略,生成高质量、一致性和可编辑的3D场景。DreamScene在游戏、电影和建筑等行业具有巨大应用潜力,尽管在处理复杂场景时仍存在一些局限性。论文地址:https://arxiv.org/abs/2404.03575
209 1
|
12月前
|
存储 关系型数据库 MySQL
|
分布式计算 DataWorks API
dataworks常见问题之如何获取oss文件大小
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
471 4
|
C# Android开发 开发者
当跨平台开发成为热点,.NET MAUI 如何触动开发者的心弦,引领未来?
【8月更文挑战第28天】在数字化浪潮中,跨平台应用开发需求激增,.NET MAUI 如新星般闪耀,为开发者指明了方向。它提供统一的 C# 和 XAML 开发体验,支持 Android、iOS、Windows 多平台应用构建,大幅提高效率,降低成本。使用 .NET MAUI,一个团队即可打造多平台流畅应用,简化工作流程。其简洁代码示例展示了强大功能与易用性,同时在性能优化方面表现出色,确保各平台上的流畅体验。加之活跃社区支持,.NET MAUI 必将推动跨平台开发迈向新高峰。
193 0