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()andoff()我有多种方法可以做到这一点。我需要为此创建新合同吗?

4

1 回答 1

7

我希望我能让你更清楚一点......

广告1。您可以在(第 792 行附近的/vendor/laravel/framework/src/Illuminate/Foundation/Application.php方法)检查​​默认绑定。registerCoreContainerAliases如果您想创建自己的类或扩展现有的类,我建议您查看如何扩展 Laravel 的 Auth Guard 类?http://laravel.com/docs/master/extending(这个更多的是关于 Laravel 4.x,但可能会给你一个想法)。

广告 2。实际上你仍然可以使用 Auth::user() 但我在构造函数或方法中注入了一个合约,并像 $this->auth->user 或 $auth->user 一样调用它。

广告 3。我有一个/app/Repositories文件夹,用于放置我的接口和实现,因此按照您的示例,我将创建子文件夹Lamp,然后LampInterface使用on()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 回答