webentwicklung-frage-antwort-db.com.de

Laravel - Tippfehler: Zu wenige Argumente?

Ich bekomme einen Fehler:

Tippfehler: Zu wenige Argumente

Ich dachte, Laravel mag etwas dagegen, wenn die Argumente nicht vollständig bestanden werden?

Zum Beispiel:

Im Controller habe ich:

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

In der todoService-Klasse:

use App\Plan

class todoService {   

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

Wie Sie sehen, habe ich kein Plan-Klassenobjekt übergeben. Muss ich binden oder sowas?

5
I'll-Be-Back

Wenn Sie createList () selbst aufrufen, müssen Sie beide Parameter selbst übergeben. Sie können etwas mit Plan binden, aber wenn Sie etwas nicht Laravel nennen, sind Sie dafür verantwortlich, diese Funktionsparameter zu übergeben.

Dieser Typhinweis funktioniert nur, wenn Laravel diese Funktion aufruft. Sie müssen diese Funktionen also über Laravel aufrufen.

Wenn Sie versuchen, automatisch in den Konstruktor einer Klasse zu injizieren, können Sie dies einfach tun:

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

oder 

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

oder 

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

Dies funktioniert jedoch nur für Konstrukteure. Bitte beachten Sie, dass Sie auch Parameter als nächste Argumente von make() oder resolve() function angeben können.

Tatsächlich können verschiedene Methoden auch so aufgerufen werden.

Sie können einfach tun:

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

Hier ist $container Objekt von Illuminate\Contracts\Container\Container.

4
Hafiz

Laravel kann auf dieser Ebene keine Zauberei ausführen, da Ihr Codierungsfehler lediglich ein PHP - Syntaxfehler ist. Sie geben an, dass der zweite Parameter vom Typ Plan ist, weshalb er implizit obligatorisch ist. Laravel kann einfache Funktionsaufrufe wie diese nicht "patchen".

Ihre Verwirrung ist wahrscheinlich dahingehend, dass Laravel abhängig von Ihrem Routing den korrekten Plan-Parameter in die create-Controller-Methode einfügen kann, sodass Sie ihn in den Dienst weiterleiten können.

1

Sie müssen bind-Klassen nur dann verwenden, wenn sie von Schnittstellen abhängen. Wenn Sie eine bestimmte Klasse angeben, erledigt Reflection die Arbeit für Sie. Dokumentation

Die einzige Möglichkeit, dies zu erreichen, besteht darin, den Standardwert des zweiten Parameters festzulegen. In allen anderen Situationen wird eine Syntaxausnahme ausgelöst.

use App\Plan

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

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

Es wird funktionieren, aber wird das einen Sinn ergeben? 

1
wujt

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