55use App \Http \Controllers \Controller ;
66use App \Models \Post ;
77use Illuminate \Http \Request ;
8+ use Laravel \Sanctum \PersonalAccessToken ;
89
910
1011class 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 , 'この投稿を閲覧する権限がありません。 ' );
0 commit comments