Skip to content

Commit d09b63f

Browse files
committed
feat: Telescope導入(APIデバッグ向上)
1 parent 715043d commit d09b63f

File tree

9 files changed

+654
-15
lines changed

9 files changed

+654
-15
lines changed

README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,42 @@ User.php roles() リレーション追加
580580
app\Models\Role.phpを作成
581581
582582
583+
### Laravel Debugbar
584+
585+
インストール
586+
```bash
587+
composer require barryvdh/laravel-debugbar --dev
588+
```
589+
590+
API開発ではあまり使えない?
591+
- Debugbar UI は出ない(Vue経由のため)
592+
- 代わりに storage/logs/debugbar/*.json を見る
593+
594+
### Telescope の導入
595+
596+
```bash
597+
composer require laravel/telescope --dev
598+
```
599+
600+
Telescope の画面を使えるようにする
601+
```bash
602+
php artisan telescope:install
603+
```
604+
605+
実行すると、自動的に
606+
607+
config/telescope.php
608+
609+
マイグレーションファイル
610+
などが追加されます。
611+
612+
そのあと続けて マイグレーションを実行
613+
```bash
614+
./vendor/bin/sail artisan migrate
615+
```
616+
617+
http://localhost/telescopeでブラウザで確認できる
618+
583619
## TODO
584620
585621
- **ユーザー登録機能の追加**: 現在はGoogle認証でのみ自動登録されるため、メール・パスワードでの新規登録機能(`register`メソッド)を`AuthController`に追加する。これにより、Googleアカウントを持たないユーザーも登録可能になる。

app/Http/Controllers/Api/PostController.php

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use App\Http\Controllers\Controller;
66
use App\Models\Post;
77
use Illuminate\Http\Request;
8+
use Laravel\Sanctum\PersonalAccessToken;
89

910

1011
class PostController extends Controller
@@ -25,19 +26,30 @@ private function authorizePost(Request $request)
2526
public function index(Request $request)
2627
{
2728
// ログインしている場合はユーザーIDを取得、未ログインの場合はnull
28-
// $request->user()は認証済みユーザーを返すが、未認証の場合はnullを返す
29-
$currentUserId = $request->user()->id ?? null;
29+
// 認証不要のルートでも、トークンが送信されていればユーザーを取得できるようにする
30+
$user = $request->user();
31+
$personalAccessToken = null;
32+
33+
// トークンから明示的にユーザーを取得(認証不要ルートの場合)
34+
if (!$user && $request->hasHeader('Authorization')) {
35+
$token = str_replace('Bearer ', '', $request->header('Authorization'));
36+
$personalAccessToken = PersonalAccessToken::findToken($token);
37+
if ($personalAccessToken) {
38+
$user = $personalAccessToken->tokenable;
39+
}
40+
}
41+
42+
$currentUserId = $user?->id;
3043

3144
$posts = Post::with('user') // ユーザー情報も一緒に取得(N+1問題の回避)
32-
->when($currentUserId, function ($query) use ($currentUserId) {
33-
// ログイン時: 公開記事 + 自分の投稿(下書き含む)を表示
34-
$query->where(function ($q) use ($currentUserId) {
35-
$q->where('status', 'published') // 公開記事
36-
->orWhere('user_id', $currentUserId); // または自分の投稿(下書きも含む)
37-
});
38-
}, function ($query) {
39-
// 未ログイン時: 公開記事のみを表示
45+
->where(function ($query) use ($currentUserId) {
46+
// 公開記事は常に表示
4047
$query->where('status', 'published');
48+
49+
// ログインしている場合は、自分の投稿(下書き含む)も表示
50+
if ($currentUserId) {
51+
$query->orWhere('user_id', $currentUserId);
52+
}
4153
})
4254
->latest() // 新しい順に並べる(created_at DESC)
4355
->get();
@@ -63,7 +75,21 @@ public function store(Request $request)
6375
// 詳細取得
6476
public function show(Request $request, Post $post)
6577
{
66-
$currentUserId = $request->user()->id ?? null;
78+
// ログインしている場合はユーザーIDを取得、未ログインの場合はnull
79+
// 認証不要のルートでも、トークンが送信されていればユーザーを取得できるようにする
80+
$user = $request->user();
81+
82+
// トークンから明示的にユーザーを取得(認証不要ルートの場合)
83+
if (!$user && $request->hasHeader('Authorization')) {
84+
$token = str_replace('Bearer ', '', $request->header('Authorization'));
85+
$personalAccessToken = PersonalAccessToken::findToken($token);
86+
if ($personalAccessToken) {
87+
$user = $personalAccessToken->tokenable;
88+
}
89+
}
90+
91+
$currentUserId = $user?->id;
92+
6793
// 「下書き」かつ「自分の投稿でない」場合は閲覧禁止 (403 Forbidden)
6894
if ($post->status !== 'published' && $post->user_id !== $currentUserId) {
6995
abort(403, 'この投稿を閲覧する権限がありません。');
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
namespace App\Providers;
4+
5+
use Illuminate\Support\Facades\Gate;
6+
use Laravel\Telescope\IncomingEntry;
7+
use Laravel\Telescope\Telescope;
8+
use Laravel\Telescope\TelescopeApplicationServiceProvider;
9+
10+
class TelescopeServiceProvider extends TelescopeApplicationServiceProvider
11+
{
12+
/**
13+
* Register any application services.
14+
*/
15+
public function register(): void
16+
{
17+
// Telescope::night();
18+
19+
$this->hideSensitiveRequestDetails();
20+
21+
$isLocal = $this->app->environment('local');
22+
23+
Telescope::filter(function (IncomingEntry $entry) use ($isLocal) {
24+
return $isLocal ||
25+
$entry->isReportableException() ||
26+
$entry->isFailedRequest() ||
27+
$entry->isFailedJob() ||
28+
$entry->isScheduledTask() ||
29+
$entry->hasMonitoredTag();
30+
});
31+
}
32+
33+
/**
34+
* Prevent sensitive request details from being logged by Telescope.
35+
*/
36+
protected function hideSensitiveRequestDetails(): void
37+
{
38+
if ($this->app->environment('local')) {
39+
return;
40+
}
41+
42+
Telescope::hideRequestParameters(['_token']);
43+
44+
Telescope::hideRequestHeaders([
45+
'cookie',
46+
'x-csrf-token',
47+
'x-xsrf-token',
48+
]);
49+
}
50+
51+
/**
52+
* Register the Telescope gate.
53+
*
54+
* This gate determines who can access Telescope in non-local environments.
55+
*/
56+
protected function gate(): void
57+
{
58+
Gate::define('viewTelescope', function ($user) {
59+
return in_array($user->email, [
60+
//
61+
]);
62+
});
63+
}
64+
}

bootstrap/providers.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
return [
44
App\Providers\AppServiceProvider::class,
5+
App\Providers\TelescopeServiceProvider::class,
56
];

composer.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616
"laravel/tinker": "^2.10.1"
1717
},
1818
"require-dev": {
19+
"barryvdh/laravel-debugbar": "^3.16",
1920
"fakerphp/faker": "^1.23",
2021
"laravel/pail": "^1.2.2",
2122
"laravel/pint": "^1.24",
2223
"laravel/sail": "^1.41",
24+
"laravel/telescope": "^5.15",
2325
"mockery/mockery": "^1.6",
2426
"nunomaduro/collision": "^8.6",
2527
"phpunit/phpunit": "^11.5.3"

0 commit comments

Comments
 (0)