59204


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**

[code]

    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();
    
    
[/code]

**TaskController**

[code]

    <?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);
            }
        }
    }
    
    
[/code]

**FolderController**

[code]

    <?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,
            ]);
        }
    }
    
[/code]

**環境**  
\- mac os 10.14.6  
\- Homestead 9.0.2  
\- vagrant 2.2.4  
\- virtualbox 6.0.4  
\- laravel 5.8


CC BY-SA 4.0
2019-09-22T16:11:44.767
59203
2019-09-23T00:24:45.643
2019-09-22T17:16:36.317
32986
35938
question
laravel
Laravel 5.8 でルーティングが上手くいかない


`{id}`を`{foldet}`に変えたのに合わせ、

[code]

    redirect()->route('tasks.index', [
         'folder' => $folder->id,
    ]);
    
[/code]

のようにリダイレクトのパラメーターを直す必要があります。（この引数はURL中のパラメータなら置換、そうでなければクエリ文字列として付加します）（当該チュートリアルの参考githubでも間違っているのは不思議ですが）


CC BY-SA 4.0
2019-09-23T00:24:45.643
59204
2019-09-23T00:24:45.643
2376
59203
answer