【问题标题】:How does laravel 5 know which contract implementation I want to use?laravel 5 如何知道我要使用哪个合约实现?
【发布时间】:2015-02-09 12:46:02
【问题描述】:

我对如何使用合同感到有些困惑。我认为那是因为我没有使用单元测试,所以对我来说合同是如何工作的并不明显。

让我们看看这段代码:

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

【问题讨论】:

    标签: laravel-5


    【解决方案1】:

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

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

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

    广告 3。我有一个/app/Repositories 文件夹,我在其中放置了我的接口和实现,因此按照您的示例,我将创建子文件夹Lamp 并使用on()off() 方法创建LampInterface,然后我将创建类似的东西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();
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2018-09-15
      • 2012-04-29
      相关资源
      最近更新 更多