Laravel - Package - Telescope

# 前言

學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 Q&A 的方式記錄下來, 加速學習以及查詢。


# Installation

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    composer require laravel/telescope

    php artisan telescope:install

    php artisan migrate
  • Answer:
    安裝 telescope 套件
    安裝相關 UI
    migrate 資料庫

以下的 Laravel example code 的意思是?
  • Example:

    // terminal
    composer require laravel/telescope --dev

    php artisan telescope:install

    php artisan migrate

    // AppServiceProvider
    public function register()
    {
    if ($this->app->environment('local')) {
    $this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class);
    $this->app->register(TelescopeServiceProvider::class);
    }
    }

    // composer.json
    "extra": {
    "laravel": {
    "dont-discover": [
    "laravel/telescope"
    ]
    }
    },
  • Answer:
    若只要安裝 telescope 在 dev
    要從 config/app.php 當中移除 telescope service provider
    在 AppServiceProvider 中另行註冊
    修改 composer.json 避免 auto-discover


# Configuration

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    'enabled' => env('TELESCOPE_ENABLED', true),
  • Answer:
    可使用 env 來決定是否 enable Telescope
    更多設定可參考 config/telescope.php


# Data Pruning

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    $schedule->command('telescope:prune')->daily();
  • Answer:
    定義一個 scheduled task, 每天清空 telescope 的紀錄

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    $schedule->command('telescope:prune --hours=48')->daily();
  • Answer:
    定義一個 scheduled task, 每天清空 telescope 48 小時前的紀錄

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    {
    "scripts": {
    "post-update-cmd": [
    "@php artisan telescope:publish --ansi"
    ]
    }
    }
  • Answer:
    當更新 Laravel Telescope 後, 務必要 re-publish Telescope’s asserts, 可以寫在 composer.json 中, 以免忘記


# Filtering

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    public function register()
    {
    $this->hideSensitiveRequestDetails();

    Telescope::filter(function (IncomingEntry $entry) {
    if ($this->app->environment('local')) {
    return true;
    }

    return $entry->isReportableException() ||
    $entry->isFailedJob() ||
    $entry->isScheduledTask() ||
    $entry->hasMonitoredTag();
    });
    }
  • Answer:
    TelescopeServiceProvider 中的 Telescope::filter(), 可以定義哪些要 record, 哪些不要
    在 local env 下會 record 所有紀錄, 其他 env 會 record failed job, reportable exception, scheduled task, 以及 monitored tag, 可自定義


# Batches

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    use Illuminate\Support\Collection;

    public function register()
    {
    $this->hideSensitiveRequestDetails();

    Telescope::filterBatch(function (Collection $entries) {
    if ($this->app->environment('local')) {
    return true;
    }

    return $entries->contains(function ($entry) {
    return $entry->isReportableException() ||
    $entry->isFailedJob() ||
    $entry->isScheduledTask() ||
    $entry->hasMonitoredTag();
    });
    });
    }
  • Answer:
    filter 只可 filter 單筆資料, 假如今天有一個 request 出了一個 exception, 而我想將該次 request 的所有資料都記錄下來, 那就可以使用 filterBatch

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    public function register()
    {
    $this->hideSensitiveRequestDetails();

    Telescope::tag(function (IncomingEntry $entry) {
    return $entry->type === 'request'
    ? ['status:'.$entry->content['response_status']]
    : [];
    });
    }
  • Answer:
    當使用 Telescope 時, 一般會自動為 entry 加上預設的 tag, 但若要自己加入 tag, 可在 TelescopeServiceProvider 的 register() 中, 使用 tag method, tag method 接受一個 closure, closure 回傳的 tag 會被 telescope 一起 attach 到該 entry


# Available Watchers

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    'watchers' => [
    Watchers\CacheWatcher::class => true,
    Watchers\CommandWatcher::class => true,
    ...
    ],
  • Answer:
    在 config/telescope 中, 可在 watchers array 指定哪些 watcher 要打開, 每個 watcher 都針對 Laravel 的一個模組, 像是 Cache, Command, Queue 等等

以下的 Laravel Telescope example code 的意思是?
  • Example:

    <?php
    'watchers' => [
    Watchers\QueryWatcher::class => [
    'enabled' => env('TELESCOPE_QUERY_WATCHER', true),
    'slow' => 100,
    ],
    ...
    ],
  • Answer:
    Telescope 中, 有些 watcher 提供額外選項


# Batch Watcher

Laravel Telescope 的 Batch Watcher 紀錄了什麼?

batch watcher 紀錄了 Laravel Queue Batch 的資料


# Cache Watcher

Laravel Telescope 的 Cache Watcher 紀錄了什麼?

當 cache key 被 hit, missed, updated, 或 forgotten, 會被記錄下來


# Command Watcher

Laravel Telescope 的 Command Watcher 紀錄了什麼?

command 的 arguments, options, exit code, output

以下的 Laravel Telescope example code 的意思是?
  • Example:

    <?php
    'watchers' => [
    Watchers\CommandWatcher::class => [
    'enabled' => env('TELESCOPE_COMMAND_WATCHER', true),
    'ignore' => ['key:generate'],
    ],
    ...
    ],
  • Answer:
    可在 config 中, 指定哪一些 command 不要被 record


# Dump Watcher

Laravel Telescope 的 Dump Watcher 紀錄了什麼?

紀錄 dump 資訊


# Event Watcher

Laravel Telescope 的 Event Watcher 紀錄了什麼?

會紀錄 event 的 listener, payload, 以及 broadcast data, 但 Laravel 內部的 event 會被 ignore


# Exception Watcher

Laravel Telescope 的 Exception Watcher 紀錄了什麼?

紀錄了 exception 的 data 以及 stack trace


# Gate Watcher

Laravel Telescope 的 Gate Watcher 紀錄了什麼?

# 修改成 JWT 驗證

# 新增 Admin model, migration

php artisan make:model Admin -m

# 修改 Admin model

需 extend authenticatable, implement JWTSubject
JWT 部分可參考 文件

# 新增 Admins guard, Admins provider

JWT 部分可參考 文件

# 新增 middleware

public function handle(Request $request, Closure $next)
{
$response = $next($request);

if ($request->route()->getName() != 'telescope') {
return $response;
}

if ($request->cookie('token')) {
return $response;
}

if (empty($token = $request->input('token'))) {
return $response;
}

$payload = JWTAuth::setToken($token)->getPayload();
$exp = $payload->get('exp');
$minutes = floor(($exp - time()) / 60);

$response = $next($request);
$response->withCookie(cookie('token', $token, $minutes));

return $response;
}

# 修改 Telescope config

加上剛剛建立的 middleware, 並且將 ‘web’ 改成 auth middleware 並指定 guard

    'middleware' => [
// 'web',
\App\Http\Middleware\AppendTokenForTelescope::class,
'auth:admins',
Authorize::class,
],

# 修改 TelescopeServiceProvider

這邊可自訂規則

protected function gate()
{
Gate::define('viewTelescope', function (UserInterface $user) {
return $user->isAdmin();
});
}

# 建立 Admin login API

# 在資料庫中新增帳號密碼

# 登入以取得 token

# 測試

輸入 https://projectName/telescope?token=yourToken
在 production 環境也可存取 Telescope

Laravel - Testing - Mocking

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×