Laravel 5.8 でルーティングが上手くいかない
Laravel を勉強していて下記のサイトを参考にチュートリアルをやっています。
https://www.hypertextcandy.com/laravel-tutorial-error-handling/
解決したいこと
このページの すべてのルートにポリシーを適用する という箇所で
Web.phpのルーティングを /folders/{id}/tasks
としていたところを
/folders/{folder}/tasks
や /folders/{folder}/tasks/{task}/edit
という
複数形/単数形のルーティングに変更しようとしたのですが
ログインした後のリダイレクト先が homestead.test/folders//tasks?id=4
となってしまい
folders
の後が id ではなく //tasks
になってしまうので
ログインしたユーザーのidがURLに入らず
お探しのページは見つかりませんでした。
と表示されます。
{folder}
や {task}
に変えた箇所を DBに入っているidの数字を入力すると
問題なく表示することが出来ています。
また、ログインしている場合はログアウトが表示され
ログインしていない場合はログイン、登録という項目が表示されるようにしていたのですが
ルーティングを変えてから、ログインしていてもログイン、登録という項目が表示されてしまいます。
数日考えたのですが、どうしても原因が分からなかったので教えていただきたいです。
他に必要な情報がありましたら追記しますので、よろしくお願いします。
web.php
Route::group(['middleware' => 'auth'], function () {
Route::get('/', 'HomeController@index')->name('home');
Route::get('/folders/create', 'FolderController@showCreateForm')->name('folders.create');
Route::post('/folders/create', 'FolderController@create');
Route::group(['middleware' => 'can:view,folder'], function () {
Route::get('/folders/{folder}/tasks', 'TaskController@index')->name('tasks.index');
Route::get('/folders/{folder}/tasks/create', 'TaskController@showCreateForm')->name('tasks.create');
Route::post('/folders/{folder}/tasks/create', 'TaskController@create');
Route::get('/folders/{folder}/tasks/{task}/edit', 'TaskController@showEditForm')->name('tasks.edit');
Route::post('/folders/{folder}/tasks/{task}/edit', 'TaskController@edit');
});
});
Auth::routes();
TaskController
<?php
namespace App\Http\Controllers;
use App\Folder;
use App\Task;
use App\Http\Requests\CreateTask;
use App\Http\Requests\EditTask;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class TaskController extends Controller
{
/**
* タスク一覧
* @param Folder $folder
* @return \Illuminate\View\View
*/
public function index(Folder $folder)
{
$folders = Auth::user()->folders()->get();
$tasks = $folder->tasks()->get();
return view('tasks/index', [
'folders' => $folders,
'current_folder_id' => $folder->id,
'tasks' => $tasks,
]);
}
/**
* タスク作成フォーム
* @param Folder $folder
* @return \Illuminate\View\View
*/
public function showCreateForm(Folder $folder)
{
return view('tasks/create', [
'folder_id' => $folder->id,
]);
}
/**
* タスク作成
* @param Folder $folder
* @param CreateTask $request
* @return \Illuminate\Http\RedirectResponse
*/
public function create(Folder $folder, CreateTask $request)
{
$task = new Task();
$task->title = $request->title;
$task->due_date = $request->due_date;
$folder->tasks()->save($task);
return redirect()->route('tasks.index', [
'id' => $folder->id,
]);
}
/**
* タスク編集フォーム
* @param Folder $folder
* @param Task $task
* @return \Illuminate\View\View
*/
public function showEditForm(Folder $folder, Task $task)
{
$this->checkRelation($folder, $task);
return view('tasks/edit', [
'task' => $task,
]);
}
/**
* タスク編集
* @param Folder $folder
* @param Task $task
* @param EditTask $request
* @return \Illuminate\Http\RedirectResponse
*/
public function edit(Folder $folder, Task $task, EditTask $request)
{
$this->checkRelation($folder, $task);
$task->title = $request->title;
$task->state = $request->state;
$task->due_date = $request->due_date;
$task->save();
return redirect()->route('tasks.index', [
'id' => $task->folder_id,
]);
}
/**
* フォルダとタスクの関連性があるか調べる
* @param Folder $folder
* @param Task $task
*/
private function checkRelation(Folder $folder, Task $task)
{
if ($folder->id !== $task->folder_id) {
abort(404);
}
}
}
FolderController
<?php
namespace App\Http\Controllers;
use App\Folder;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\CreateFolder;
use Illuminate\Http\Request;
class FolderController extends Controller
{
public function showCreateForm()
{
return view('folders/create');
}
public function create(CreateFolder $request)
{
$folder = new Folder();
$folder->title = $request->title;
Auth::user()->folders()->save($folder);
return redirect()->route('tasks.index', [
'id' => $folder->id,
]);
}
}
環境
- mac os 10.14.6
- Homestead 9.0.2
- vagrant 2.2.4
- virtualbox 6.0.4
- laravel 5.8