前提・実現したいこと
Cloud9でLaravel 5.1 LTSを用いてTwitterクローンを開発しています。
現在、ログインしたユーザーが自分、または他ユーザーのプロフィールページを表示させる機能を実装しようとしています。
現在のコードの状態
※GitHubで下記以外のファイルのコードもご確認頂けます。(問題解決後は更新していきます。)
https://github.com/KIYZ/sns
UsersController.php の index(){}
を下記のようにしてログイン中のユーザー情報を取得し、配列に入れて index.blade.php に渡しています。
UsersController.php
php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6 7use App\Http\Requests; 8use App\Http\Controllers\Controller; 9 10use App\User; 11 12class UsersController extends Controller 13{ 14 public function index() 15 { 16 $users = User::paginate(10); 17 $auth_user = \Auth::user(); // ログイン中のユーザー情報を取得 18 19 $data = [ // index.blade.php に渡す配列 20 'users' => $users, 21 'auth_user' => $auth_user, // 配列に含める 22 ]; 23 24 return view('users.index', $data); // index.blade.php に渡す 25 } 26 27 public function show($id) 28 { 29 $user = User::find($id); 30 $microposts = $user->microposts()->orderBy('created_at', 'DESC')->paginate(10); 31 32 $data = [ 33 'user' => $user, 34 'microposts' => $microposts, 35 ]; 36 37 $data += $this->counts($user); 38 39 return view('users.show', $data); 40 } 41}
ログイン中のユーザーの情報を受け取る index.blade.php はベースビューであるは app.blade.php を @extends
しています。
index.blade.php
php
1@extends('layouts.app') // ベースビュー 2 3@section('content') 4 @include('users.users', ['users' => $users]) 5@endsection
app.blade.php は、プロフィールページへのリンクを設置しているナビバー用のビューである navbar.blade.php を @include
しています。
app.blade.php
php
1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 8 <title>Microposts</title> 9 10 <!--Bootstrap--> 11 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 12 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 13 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 14 </head> 15 <body> 16 @include('commons.navbar') <!-- ナビバー --> 17 18 <div class="container"> 19 @include('commons.error_messages') 20 21 @yield('content') 22 </div> 23 </body> 24</html>
navbar.blade.php では Laravel Collective の link_to_route()
メソッドを使用してプロフィールページへのリンクを生成しています。
navbar.blade.php
php
1<header> 2 <nav class="navbar navbar-inverse navbar-static-top"> 3 <div class="container"> 4 <div class="navbar-header"> 5 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> 6 <span class="sr-only">Toggle navigation</span> 7 <span class="icon-bar"></span> 8 <span class="icon-bar"></span> 9 <span class="icon-bar"></span> 10 </button> 11 <a class="navbar-brand" href="/">Microposts</a> 12 </div> 13 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 14 <ul class="nav navbar-nav navbar-right"> 15 @if (Auth::check()) 16 <li>{!! link_to_route('users.index', 'Users') !!}</li> 17 <li class="dropdown"> 18 <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ Auth::user()->name }} <span class="caret"></span></a> 19 <ul class="dropdown-menu"> 20 <li>{!! link_to_route('users.show', 'My profile', ['id' => $auth_user->id]) !!}</li> <!-- プロフィールページへのリンクを生成 --> 21 <li>{!! link_to_route('micropost.favorites', 'Favorites') !!}</li> 22 <li role="separator" class="divider"></li> 23 <li>{!! link_to_route('logout.get', 'Logout') !!}</li> 24 </ul> 25 </li> 26 @else 27 <li>{!! link_to_route('signup.get', 'Signup') !!}</li> 28 <li>{!! link_to_route('login.get', 'Login') !!}</li> 29 @endif 30 </ul> 31 </div> 32 </div> 33 </nav> 34</header>
show.blade.php (プロフィールページ)
php
1@extends('layouts.app') 2 3@section('content') 4 <div class="row"> 5 <aside class="col-xs-4"> 6 <div class="panel panel-default"> 7 <div class="panel-heading"> 8 <h3 class="panel-title">{{ $user->name }}</h3> 9 </div> 10 <div class="panel-body"> 11 <img class="media-object img-rounded img-responsive" src="{{ Gravatar::src($user->email, 500) }}" alt=""> 12 </div> 13 @include('user_follow.follow_button', ['user' => $user]) 14 </div> 15 </aside> 16 <div class="col-xs-8"> 17 <ul class="nav nav-tabs nav-justified"> 18 <li role="presentation" class="{{ Request::is('users/' . $user->id) ? 'active' : '' }}"><a href="{{ route('users.show', ['id' => $user->id]) }}">Microposts <span class="badge">{{ $count_microposts }}</span></a></li> 19 <li role="presentation" class="{{ Request::is('users/*/followings') ? 'active' : '' }}"><a href="{{ route('users.followings', ['id' => $user->id]) }}">Followings <span class="badge">{{ $count_followings }}</span></a></li> 20 <li role="presentation" class="{{ Request::is('users/*/followers') ? 'active' : '' }}"><a href="{{ route('users.followers', ['id' => $user->id]) }}">Followers <span class="badge">{{ $count_followers }}</span></a></li> 21 <li role="presentation" class="{{ Request::is('users/*/favorites') ? 'active' : '' }}"><a href="{{ route('micropost.favorites', ['id' => $user->id]) }}">Favorites <span class="badge">{{ $count_favorites }}</span></a></li> 22 </ul> 23 @if (count($microposts) > 0) 24 @include('microposts.microposts', ['microposts' => $microposts]) 25 @endif 26 </div> 27 </div> 28@endsection
routes.php
php
1<?php 2 3Route::get('/', 'WelcomeController@index'); 4 5// ユーザー登録 6Route::get('signup', 'Auth\AuthController@getRegister')->name('signup.get'); 7Route::post('signup', 'Auth\AuthController@postRegister')->name('signup.post'); 8 9// ログイン 10Route::get('login', 'Auth\AuthController@getLogin')->name('login.get'); 11Route::post('login', 'Auth\AuthController@postLogin')->name('login.post'); 12Route::get('logout', 'Auth\AuthController@getLogout')->name('logout.get'); 13 14// ログイン認証を必要とするルーティンググループ 15Route::group(['middleware' => 'auth'], function () { 16 Route::resource('users', 'UsersController', ['only' => ['index', 'show']]); // ユーザ一覧, ユーザ詳細 17 Route::group(['prefix' => 'users/{id}'], function () { 18 Route::post('follow', 'UserFollowController@store')->name('user.follow'); 19 Route::delete('unfollow', 'UserFollowController@destroy')->name('user.unfollow'); 20 Route::get('followings', 'UsersController@followings')->name('users.followings'); 21 Route::get('followers', 'UsersController@followers')->name('users.followers'); 22 }); 23 Route::resource('microposts', 'MicropostsController', ['only' => ['store', 'destroy']]); // 投稿の保存, 投稿の削除 24});
発生している問題・エラーメッセージ
現状のコードでは、ナビバーで生成されているプロフィールページへのリンクは正常に生成されていますが、 users/ユーザーid
にアクセスすると UsersController で定義した $auth_user
が undefined となってしまいます。
※ /
にアクセスしても同じエラーが発生します。
※ ログイン中のユーザーが自分のプロフィールページにアクセスしても、他ユーザーのプロフィールページにアクセスしても同じエラーが発生します。
4/4 ErrorException in 2a5576d3a3140862ca55ac1bbbf9bb65 line 20: Undefined variable: auth_user (View: /home/ubuntu/workspace/microposts/resources/views/commons/navbar.blade.php)
試したこと
navbar.blade.php の中で <h1>{{ $auth_user->id }}</h1>
としてみたところ、ログイン中のユーザーのIDが表示されたので、 $auth_user
は届いてはいるようです。
リンク生成を Laravel Collective の link_to_route()
メソッドではなく、 Laravel のヘルパー関数の route()
メソッドを使用して、
<li><a href="{{ route('users.show', ['id' => $auth_user->id]) }}">My profile</a></li>
としてみましたが、同じエラーが発生しました。
3.
$auth_user
を定義、代入、渡す、参照ということを行っている部分のコード全てを $user
とした場合は、エラーが発生せず、正常に動作しますが、なぜそうなるかは理解できません。
そして、(同じナビバーを挿入する)ユーザー一覧ページというページも実装していて、そのビューファイル内で $user という変数を使用しているので、それと同じ変数名にしてしまうとそちらで問題が生じてしまうと考えています。
users.blade.php
php
1@if (count($users) > 0) 2<ul class="media-list"> 3@foreach ($users as $user) 4 <li class="media"> 5 <div class="media-left"> 6 <img class="media-object img-rounded" src="{{ Gravatar::src($user->email, 50) }}" alt=""> 7 </div> 8 <div class="media-body"> 9 <div> 10 {{ $user->name }} 11 </div> 12 <div> 13 <p>{!! link_to_route('users.show', 'View profile', ['id' => $user->id]) !!}</p> 14 </div> 15 </div> 16 </li> 17@endforeach 18</ul> 19{!! $users->render() !!} 20@endif
よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー