2

契約書の使い方に困っています。これは、単体テストを使用していないため、コントラクトがどのように機能するかが明らかではないためだと思います。

このコードを見てみましょう:

use Illuminate\Contracts\Auth\Guard;

...

public function __construct(Guard $auth)
{
    $this->auth = $auth;

    $this->middleware('guest', ['except' => 'getLogout']);
}

public function postRegister(RegisterRequest $request)
{
    // Registration form is valid, create user...

    $this->auth->login($user);

    return redirect('/');
}
  1. loginでは、どのクラスがこの行でコントラクトのメソッドを実装しているかを知るにはどうすればよい$this->auth->login($user)ですか? また、自分のクラスを使用したい場合、どうすればクラスを変更できますか?

  2. laravel 4では、例として書いAuth::user()たものを任意のコントローラーのどこでも使用し、機能しました。ここで、コントローラー メソッド内にコントラクトを挿入し、次のように使用する必要があり$auth->userます。

  3. また、うまくいけば、コントラクトは抽象化に使用されます。では、独自のクラス用に新しいインターフェイスを作成し、そのインターフェイスを実装する複数のクラスを作成したい場合、どこにコードを記述すればよいでしょうか? 例は思いつきませんが、ランプを有効/無効にするためのインターフェイスを実装する必要があると想像しon()off()みてください。そのために新しい契約を作成する必要がありますか?

4

1 に答える 1

7

これをもう少し明確にしていただければ幸いです...

Ad.1。( 792行目あたりの/vendor/laravel/framework/src/Illuminate/Foundation/Application.phpメソッド)でデフォルトのバインディングを確認できます。registerCoreContainerAliases独自のクラスを作成したり、既存のクラスを拡張したい場合は、Laravel の Auth Guard クラスを拡張する方法を参照することをお勧めします。またはhttp://laravel.com/docs/master/extending (これは Laravel 4.x に関するものですが、アイデアが得られるかもしれません)。

Ad.2。実際にはまだ Auth::user() を使用できますが、コンストラクターまたはメソッドにコントラクトを挿入し、$this->auth->user または $auth->user のように呼び出します。

Ad.3。インターフェイスと実装を配置する/app/Repositoriesフォルダーがあるので、あなたの例に従うために、サブフォルダーLampを作成LampInterfaceon()off()メソッドで作成してから、Lamp.php を実装するようなものを作成しますLampInterface/app/Providers次に、LampServiceProvider.php のように、バインディングを使用してサービス プロバイダーを作成します。

namespace Apps\Providers;

use Illuminate\Support\ServiceProvider;

class LampServiceProvider extends ServiceProvider {

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(
            'App\Repositories\Lamp\LampInterface',
            'App\Repositories\Lamp\Lamp'
        );
    }
} 

その後、新しいサービス プロバイダーを /app/config/app.php に登録し、最終的に次のようにインターフェイスを挿入できます。

public function switchLampOn(App\Repository\Lamp\LampInterface $lamp)
{
    $lamp->on();
}
于 2014-11-28T22:12:24.837 に答える