web-dev-qa-db-ja.com

Laravel-タイプエラー:引数が少なすぎますか?

エラーが発生します:

型エラー:引数が少なすぎます

Laravel=引数が完全に渡されなかった場合に魔法をかける?

例えば:

コントローラーには:

public function create(CreateRequest $request)
{
    return $this->todoService->createList($request);
}

todoServiceクラス内:

use App\Plan

class todoService {   

    public function createList($request, Plan $plan)
    {
      //
    }
}

ご覧のとおり、Planクラスオブジェクトを渡しませんでした。バインドする必要がありますか?

6
I'll-Be-Back

自分でcreateList()を呼び出す場合、両方のパラメーターを自分で渡す必要があります。 Planで何かをバインドできますが、それでもLaravel以外のものを呼び出す場合は、その関数パラメーターを渡す必要があります。

このタイプのヒントは、Laravelがその関数を呼び出している場合にのみ機能します。したがって、Laravelを介してこれらの関数を呼び出す必要があります。

クラスのコンストラクターに自動的に注入しようとしている場合、これを行うことができます。

_$service = $this->app->make('App\Plan\todoservice');
_

または

_$service = App::make('App\Plan\todoservice');
_

または

_$service = resolve('App\Plan\todoservice');
_

しかし、これはコンストラクタに対してのみ機能します。 make()またはresolve()関数の次の引数としてパラメーターを提供することもできます。

実際、別のメソッドもそのように呼び出すことができます。

簡単にできます:

_    $service = App::make('App\Plan\todoservice');
    $container->call([$service, 'createList'], ['request' => $request] );
_

ここで_$container_は_Illuminate\Contracts\Container\Container_のオブジェクトです。

5
Hafiz

bindクラスは、インターフェースに依存している場合にのみ必要です。特定のクラスを指定すると、リフレクションが自動的にジョブを実行します。 ドキュメント

これが機能する唯一の方法は、2番目のパラメーターのデフォルト値を設定することです。その他の状況では、構文例外がスローされます。

use App\Plan

class todoService    
{  
    public function createList($request, Plan $plan = null)
    {
      //
    }
}

public function create(CreateRequest $request)
{
    return $this->todoService->createList($request);
}

それは動作しますが、それは意味がありますか?

2
wujt

Laravelは、このレベルで魔法をかけることはできません。コーディングエラーは単にPHP構文エラーです。2番目のパラメーターはPlan型であり、必須です。 Laravelは、このような単純な関数呼び出しを「パッチ」することはできません。

あなたの混乱は、ルーティングに応じて、Laravelが正しいPlanパラメーターをcreateコントローラーメソッドに注入できるため、転送することができるという点にあります。サービスに。

1

1

/**
 * Create a new personal access token for the user.
 *
 * @param  string  $name
 * @param  array  $scopes
 * @return \Laravel\Passport\PersonalAccessTokenResult
 */
public function createToken($name, array $scopes = [])
{
    return Container::getInstance()->make(PersonalAccessTokenFactory::class)->make(
        $this->getKey(), $name, $scopes
    );
}

/**
 * Set the current access token for the user.
 *
 * @param  \Laravel\Passport\Token  $accessToken
 * @return $this
0
edfgdfgdfg