本文通过在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类的实现。详细的信息,可以参看官方文档。
我们在使用时,只需要在需要的类中注入就可以了。
暂时先写到这里,改天又继续。