laravel 5如何知道我想使用哪个合同实现?

Vic*_*tor 2 laravel-5

我对如何使用合同感到困惑.我认为这是因为我没有使用单元测试,所以对我而言,合同的运作方式并不明显.

我们来看看这段代码:

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('/');
}
Run Code Online (Sandbox Code Playgroud)
  1. 所以,我怎么知道哪些类实现login合同法在这一行:$this->auth->login($user)?如果我想使用自己的课程怎么能改变课程呢?

  2. 在laravel 4中,我写Auth::user()了一个例子,我在任何控制器的任何地方都使用它并且它有效.现在我应该在控制器方法中注入一个契约并使用它$auth->user

  3. 此外,如果我做对了,合同用于制作抽象.好的,所以,如果我想为我自己的类构建一个新的接口,然后有多个实现我的接口的类,我应该在哪里编写代码?我想不出一个例子,但让我们来想象我需要实现一个接口,用于启用/禁用的灯,是我有两个方法,如on()off()我有多种方法可以做到这一点.我需要为此创建新合同吗?

小智 7

我希望我能让你对此更加清楚......

Ad.1.您可以检查默认绑定/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(registerCoreContainerAliases第792行附近的方法).如果你想创建自己的类或扩展现有的我建议看看如何扩展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'
        );
    }
} 
Run Code Online (Sandbox Code Playgroud)

之后我会在/app/config/app.php中注册新的服务提供者,最后我可以注入我的界面,如:

public function switchLampOn(App\Repository\Lamp\LampInterface $lamp)
{
    $lamp->on();
}
Run Code Online (Sandbox Code Playgroud)