LoginSignup
keisuke19890521
@keisuke19890521

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

「Too few arguments to function, 0 passed in」 Laravel-9で開発中のアプリで発生したエラーを解決したい

「Too few arguments to function, 0 passed in」 Laravel-9で開発中のアプリで発生したエラーを解決したい

引数が不足している事は分かっているのですが、
以下のコードにて一体全体、どこが不足しているのかが分かりません。
似たような開発済のアプリでは、このようなエラーは発生しなかったので。

諸先輩方、宜しくお願いいたします。

発生している問題・エラー

Too few arguments to function App\Http\Controllers\ResultController::create(), 0 passed in C:\xampp\htdocs\pointmaster\vendor\laravel\framework\src\Illuminate\Routing\Controller.php on line 54 and exactly 1 expected

app\Http\Controllers\ResultController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;

use Symfony\Component\HttpFoundation\StreamedResponse;

use App\Http\Controllers\GroupController;

use App\Models\User;
use App\Models\Group;
use App\Models\Result;

class ResultController extends Controller
{
    ~省略~
    
    public function create($id)
    {
        $group = Group::findOrFail($id);

        $owner = $group->user_id;

        $user = Auth::user()->id;

        if ($owner != $user) {
            return redirect('/');
        }

        $result = new Result;

        return view('results.create', [
            'result' => $result,
            'group' => $group,
        ]);
    }

    ~省略~


routes\web.php

<?php

use App\Http\Controllers\ProfileController;
use App\Http\Controllers\ResultController;
use App\Http\Controllers\RankController;
use App\Http\Controllers\GroupController;

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get('/dashboard', [GroupController::class, 'index'])->middleware(['auth', 'verified'])->name('dashboard');

Route::middleware('auth')->group(function () {
    Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
    Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
    Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});


require __DIR__.'/auth.php';


Route::group(['middleware' => ['auth']], function () {
    Route::group(['prefix' => 'users/{id}'], function() {
        Route::post('store', [GroupController::class, 'store'])->name('groups.store');
        Route::delete('destroy', [GroupController::class, 'destroy'])->name('groups.destroy');
    });

    Route::group(['prefix' => 'groups/{id}'], function() {
        Route::get('index', [ResultController::class, 'index'])->name('results.index');
        Route::get('create', [ResultController::class, 'create'])->name('results.create');
        Route::post('store', [ResultController::class, 'store'])->name('results.store');
        Route::delete('destroy', [ResultController::class, 'destroy'])->name('results.destroy');
    });

    Route::resource('groups', GroupController::class, [ 'only' => ['create', 'show', 'edit', 'update']]);
    Route::resource('results', ResultController::class, [ 'only' => ['create', 'show', 'edit', 'update']]);
});

resources\views\results\index.blade.php

~省略~
    <button type="button" class="btn btn-primary mt-3" onclick="window.location='{{ route('results.create', $group->id) }}'">出場者登録 </button>
~省略~

resources\views\results\index.blade.phpの
上記ボタンをクリック時に該当のエラーが発生してしまいます。
色々と調べましたが、お手上げ状態です。
簡単なことで解決はできそうなのですが。。。

0

2Answer

results.createのルート名が2つ定義されてるから。

    Route::group(['prefix' => 'groups/{id}'], function() {
        Route::get('create', [ResultController::class, 'create'])->name('results.create');
    });

    Route::resource('results', ResultController::class, [ 'only' => ['create', 'show', 'edit', 'update']]);

Route::resourceを使ったらresults.createresults.showなどが自動的に定義される。
この状態でのroute('results.create', $group->id)はどっちが使われるか分からないけどおそらく後から書いてる方。
idがないので生成されるURLはhttp://127.0.0.1:8000/results/create?1
ResultController@createにidが渡されてないので質問のエラーとなる。

bladeの確認は自分の書いたコードではなく「レンダリングされた生のhtmlを確認する」。
これをやっていればresults/create?1を見て期待と違う動作をしていてどこか間違えてると気付く。

Laravel初心者の行動はなぜかみんな同じ。「Laravel使うよりも前に身に付けてて当然の基礎知識」がごっそり抜けてる。

教えてる側が上級者の場合。常識すぎてわざわざ教えない。
教えてる側が初心者の場合。本人も分かってないので教えられない。今のLaravel界隈にいるのはほとんどこっち側。onclick="window.location=なんて変なことしてる時点で初心者が教えてる間違った情報に騙されてる。
基礎がないままLaravelだけ覚えようとしても使えるようには絶対にならない。

1Like

Comments

  1. ありがとうございます。
    取り急ぎ解決はできました!

    onclick="window.location=についてですが、
    aタグにhrefでclass="btn btn-primarymt-3"でも動くのですが
    自分の好みの問題で文字に対するボタンの余白が気に入らなかったので、
    buttonタグを使用しています。

    buttonタグの場合、hrefでは動かないので、他に良い記述はありますか?
    onclick="loction.href=も試してみましたが結果は同じでした。

Comments

  1. ありがとうございます。
    ややこしい表現ですみません。

    このボタンをクリックすると
    登録処理が実行されるのではなく、
    createページに移動するので
    requestでないことは間違いないかと思うのですが。

Your answer might help someone💌