Laravel5.1中加入手机号重置密码模块----------ICO容器,Facade,服务提供者。

本文通过在laravel中增加手机号重置密码服务的功能,介绍一些laravel的实际使用。网络上相关的文章很多了,写下这些东西,一方面是为了抛砖引玉,别一方面也算是工作笔记吧。个人水平有限,欢迎拍砖。

要实现一个功能,最好的办法就是先去看一下,相同(相似)功能模块的源码,这样更有利于我们一致性的代码。

先看一下原来的逻辑,先看一下PasswordController.php的内容:

发送邮件的方法,此方法没有什么特别的,其过程为验证email地址是否合法,如果合法的话,就执行Password::sendResetLink方法,此方法中有一个闭包,用于生成email的标题。

public function postEmail(Request $request)
    {
        $this->validate($request, ['email' => 'required|email']);

        $response = Password::sendResetLink($request->only('email'), function (Message $message) {
            $message->subject($this->getEmailSubject());
        });

        switch ($response) {
            case Password::RESET_LINK_SENT:
                return redirect()->back()->with('status', trans($response));

            case Password::INVALID_USER:
                return redirect()->back()->withErrors(['email' => trans($response)]);
        }
    }

Password就是整个功能的核心。其本质是ICO容器中的一个核心提供者。这里的Password是一个Facade 。Facade是什么,你可以看一下官方的文档,当然为了简单起见,你可以把它当作是一个可以快速从容器中获取到具体服务的类。后面会介络怎么实现一个Facade,现在我们先来看一下password这个东东。

dd(Password::getFacadeRoot());
<pre name="code" class="php">PasswordBroker {#384 ▼
  #tokens: DatabaseTokenRepository {#383 ▶}
  #users: EloquentUserProvider {#377 ▶}
  #mailer: Mailer {#222 ▶}
  #emailView: "emails.password"
  #passwordValidator: null
}
可以看到,这个Password,实际上是一个PasswordBroker的实例。我们打开Illuminate\Auth\Passwords\PasswordBroker.php,然后看一下它的构造方法。
 

public function __construct(TokenRepositoryInterface $tokens,
                                UserProvider $users,
                                MailerContract $mailer,
                                $emailView)
    {
        $this->users = $users;
        $this->mailer = $mailer;
        $this->tokens = $tokens;
        $this->emailView = $emailView;
    }
分别注入了一个tokens,$user,$mail。当然从参数名字我们就知道,passwordbroke它想做什么?我简单描述一下,当然,源码中的注释其实已经写得很清楚了。我这在里就画蛇添足一下。

1.通过$tokens生成令牌。

2.通过$mail发送邮件。

3.通过users验证用户。

4.通过Broker处理重置密码逻辑。

好了,具体的代码内容可以自已看一下,

由于password这个东东,涉及到的东西相当多,所以不得不对以下的内容进行介绍。ICO容器,Facade,服务提供者。之前没有接触过MVC框架,第一次见到这些内容时,我也晕了很久。硬着头皮看下来,总算是把那个简陋的文档算是看明白了几分。如果有错误,请大家指出,我会及时修改。

ICO容器:Laravel 服务容器是管理类依赖的强力工具。依赖注入是比较专业的说法,真正意思是将类依赖透过构造器或 「setter」 方法注入。

先来看看一个类依赖的例子:

//用户类
Class product{
   private $order; 
    function shopping(){
        $this->order =new order($a,$b,$c);
        ****
        *****
    }  
}
上面这个例子就是一个偶合的例子。当我们在shopping方法中使用实例化order,并在这里写下一些逻辑代码时,代码就开始陷入问题了。实例化order可能在系统的各个地方,与订单偶合的类都可能需要去修改,这显然是非常痛苦且不安全的。所以,我们需要解偶。解偶的方式很多,建议使用laravel框架的朋友一定要去读一本设计模式和面象对象的书。如果你用laravel来写一些面象

过程的代理,我觉得是不大合适的,此框架的核心我个人认为还是在于高扩展性。

显然,我们需要的对上面的代码解偶:

Class product {

    __construct(Order $order){
        $this->order=$order
    }

    function shopping(){

        $order->create();

    }
} 




当然,也可以通过setter方式注入。

我们可以看到在user类中,我们把下单的任务交到order类去处理了,这里看不到new 也看不到与order相关的逻辑代码,在一定程度上已经解偶了。在laravel中,我们经常使用这个方法来注入。下面的代码,就是注入了一个$request实例。

public function postEmail(Request $request)
}
那如何来实现呢?简单来说,就是把order的实例放到容器中。其它类使用它时,直接将实例从容器中拿出来用就可以了。

第一步:实现一个 Order类。

class Order{
   function  a{
   }
   function b{
   }
}
第二步:将Order类放入容器。

创建provider

php artisan make:provider OrderServiceProvider

在OrderServiceProvider中注册服务。

 public function register()
    {
        $this->app->singleton('App\Business\Order', function($app)
        {
            return new Order();
        });
    }

 将orderSeviceProvider加入到数组中:
'providers' => [
    // 其他的服务提供者

    'App\Providers\OrderServiceProvider',
],
到这里,我们的就在ICO容器中,放入了一个Order类的实现。详细的信息,可以参看官方文档。

我们在使用时,只需要在需要的类中注入就可以了。

暂时先写到这里,改天又继续。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值