前提・実現したいこと
Cloud9でLaravel 5.1 LTSを用いてTwitterクローンを開発しています。
現在、以下の2点を同時に実現しようとしているところですが、どちらかを実現させるともう片方が実現できないという状態で、対処法が分からない状況です。
- DBのUsersテーブル上に存在する全ユーザー一覧のページを表示
- ログインしたユーザーが自分のプロフィールページにアクセスするためのリンクをナビバーに設置
発生している問題・エラーメッセージ
1.を実現した場合のエラーメッセージ(ナビバーの"My profile"をクリックした時):
1/1 FatalErrorException in UsersController.php line 26: Call to a member function microposts() on a non-object
※ナビバーに設置したログインユーザーのプロフィールページへのリンクは ワークスペース名.c9users.io:8080/users/userのid
となるべきですが、 ワークスペース名.c9users.io:8080/users/%7Busers%7D
となってしまいます。
アドレスバーに直接 ワークスペース名.c9users.io:8080/users/1
等と入力してアクセスすると正常に目当てのページが表示されます。
2.を実現した場合:
/microposts/resources/views/commons/navbar.blade.php
の20行目の link_to_route()
に渡している第3引数を削除すると、ナビバーに設置したログインユーザーのプロフィールページへのリンクが正常に ワークスペース名.c9users.io:8080/users/1
等になり、目当てのページにアクセスできるようになりますが、この場合、1.が実現できなくなります。
ワークスペース名.c9users.io:8080/usersにアクセスした時のエラーメッセージ:
4/4 ErrorException in 2a5576d3a3140862ca55ac1bbbf9bb65 line 20: Undefined variable: user (View: /home/ubuntu/workspace/microposts/resources/views/commons/navbar.blade.php) (View: /home/ubuntu/workspace/microposts/resources/views/commons/navbar.blade.php) (View: /home/ubuntu/workspace/microposts/resources/views/commons/navbar.blade.php) 3/4 ErrorException in 2a5576d3a3140862ca55ac1bbbf9bb65 line 20: Undefined variable: user (View: /home/ubuntu/workspace/microposts/resources/views/commons/navbar.blade.php) (View: /home/ubuntu/workspace/microposts/resources/views/commons/navbar.blade.php) 2/4 ErrorException in 2a5576d3a3140862ca55ac1bbbf9bb65 line 20: Undefined variable: user (View: /home/ubuntu/workspace/microposts/resources/views/commons/navbar.blade.php) 1/4 ErrorException in 2a5576d3a3140862ca55ac1bbbf9bb65 line 20: Undefined variable: user
ヒントになりそうなこと
UsersController.php の index()
に以下を追記すると1.と2.を両方とも実現することができます。
public function index() { $users = User::paginate(10); $user = User::find(2); // 追記。 動作確認としてidを直接指定。$userにログインユーザーのidを代入することができれば実現可能? return view('users.index', [ 'users' => $users, 'user' => $user, // 追記。ユーザー一覧ページのviewに渡す ]); }
試したこと
UsersController.php の show(){}
の様に、
public function index($id) { $users = User::paginate(10); $user = User::find($id); return view('users.index', [ 'users' => $users, 'user' => $user, ]); }
とすれば index.blade.php にログインユーザーの情報を渡すことができるのではないかと思ったのですが、それをすると Missing Argument エラーが出てしまいます。
1/1 ErrorException in UsersController.php line 14: Missing argument 1 for App\Http\Controllers\UsersController::index()
該当のソースコード
※GitHubで下記以外のファイルのコードもご確認頂けます。
https://github.com/KIYZ/sns
/microposts/resources/views/commons/navbar.blade.php
<header> <nav class="navbar navbar-inverse navbar-static-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/">Microposts</a> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav navbar-right"> @if (Auth::check()) <li>{!! link_to_route('users.index', 'Users') !!}</li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ Auth::user()->name }} <span class="caret"></span></a> <ul class="dropdown-menu"> <li>{!! link_to_route('users.show', 'My profile', ['id' => $user->id]) !!}</li> <li>{!! link_to_route('micropost.favorites', 'Favorites') !!}</li> <!--TODO--> <li role="separator" class="divider"></li> <li>{!! link_to_route('logout.get', 'Logout') !!}</li> </ul> </li> @else <li>{!! link_to_route('signup.get', 'Signup') !!}</li> <li>{!! link_to_route('login.get', 'Login') !!}</li> @endif </ul> </div> </div> </nav> </header>
/microposts/app/Http/Controllers/UsersController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; use App\User; class UsersController extends Controller { public function index() { $users = User::paginate(10); return view('users.index', [ 'users' => $users, ]); } public function show($id) { $user = User::find($id); $microposts = $user->microposts()->orderBy('created_at', 'DESC')->paginate(10); $data = [ 'user' => $user, 'microposts' => $microposts, ]; $data += $this->counts($user); return view('users.show', $data); } public function followings($id) { $user = User::find($id); $followings = $user->followings()->paginate(10); $data = [ 'user' => $user, 'users' => $followings, ]; $data += $this->counts($user); return view('users.followings', $data); } public function followers($id) { $user = User::find($id); $followers = $user->followers()->paginate(10); $data = [ 'user' => $user, 'users' => $followers, ]; $data += $this->counts($user); return view('users.followers', $data); } public function favorites($id) { $user = User::find($id); $microposts = $user->microposts()->orderBy('created_at', 'desc')->paginate(10); $favorites = $user->favorites()->orderBy('created_at', 'desc')->paginate(10); foreach ($microposts as $micropost) { if ($micropost->id === $favorites->user_id) { $favorite_microposts = $micropost; } } $data = [ 'user' => $user, 'microposts' => $microposts, 'favorites' => $favorites, 'favorite_microposts' => $favorite_microposts, ]; $data += $this->counts($user); return view('users.favorites', $data); } }
/microposts/app/Http/routes.php
<?php Route::get('/', 'WelcomeController@index'); // ユーザー登録 Route::get('signup', 'Auth\AuthController@getRegister')->name('signup.get'); Route::post('signup', 'Auth\AuthController@postRegister')->name('signup.post'); // ログイン Route::get('login', 'Auth\AuthController@getLogin')->name('login.get'); Route::post('login', 'Auth\AuthController@postLogin')->name('login.post'); Route::get('logout', 'Auth\AuthController@getLogout')->name('logout.get'); // ログイン認証を必要とするルーティンググループ Route::group(['middleware' => 'auth'], function () { Route::resource('users', 'UsersController', ['only' => ['index', 'show']]); // ユーザ一覧, ユーザ詳細 Route::group(['prefix' => 'users/{id}'], function () { Route::post('follow', 'UserFollowController@store')->name('user.follow'); Route::delete('unfollow', 'UserFollowController@destroy')->name('user.unfollow'); Route::get('followings', 'UsersController@followings')->name('users.followings'); Route::get('followers', 'UsersController@followers')->name('users.followers'); }); Route::resource('microposts', 'MicropostsController', ['only' => ['store', 'destroy']]); // 投稿の保存, 投稿の削除 // お気に入り Route::post('favorite/{id}', 'FavoritesController@store')->name('micropost.favorite'); Route::delete('unfavorite/{id}', 'FavoritesController@destroy')->name('micropost.unfavorite'); Route::get('favorites/{id}', 'UsersController@favorites')->name('micropost.favorites'); });
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー