前言

既然要判断用户是否存在,然后创建用户,那么就要实现几个功能函数。为了方便调用,于是我尝试着写了第一个service 和 facade 。

创建 Facade

class Social extends Facade
{
protected static function getFacadeAccessor()
{
return 'social';
}
}

创建 Service

use Laravel\Socialite\Facades\Socialite;
use App\SocialUser;
use App\User; class SocialService
{
public function whetherRegistered()
{
$user = Socialite::driver('github')->user();
$newUser = array();
$newUser['id'] = $user->getId();
$newUser['nickname'] = $user->getNickname();
$newUser['name'] = $user->getName();
$newUser['email'] = $user->getEmail();
$newUser['avatar'] = $user->getAvatar();
$socialUser = SocialUser::where('type', 'github')->where('social_user_id', $newUser['id'])->first();
if ($socialUser) {
return $socialUser;
}
return $newUser;
} public function createSocialUser(User $user, $newUser)
{
$socialUser = new SocialUser();
$socialUser->type = 'github';
$socialUser->social_user_id = $newUser['id'];
$socialUser->user_id = $user->id;;
$socialUser->nickname = $newUser['nickname'];
$socialUser->name = $newUser['name'];
$socialUser->email = $newUser['email'];
$socialUser->avatar = $newUser['avatar'];
$socialUser->save();
return $socialUser;
} public function searchUser(SocialUser $socialUser)
{
$user = User::where('id', $socialUser->user_id)->first();
return $user;
} public function handle()
{
$newUser = $this->whetherRegistered();
if (is_a($newUser, 'App\SocialUser')) {
$user = $this->searchUser($newUser);
return $user;
}
return $newUser;
}
}

在 Service 里面实现了判断用户是否存在,创建用户,查找本站用户,放回用户信息三个函数。

创建 Service Provider

use App\Services\SocialService\SocialService;

public function register()
{
$this->app->singleton('social', function() //这里的'social'就是上面创建的 facade 的返回值
{
return new SocialService; //这里的 SocialService 就是刚刚创建的 Service
});
}

关于服务容器的具体使用:官方文档

注册 ServiceProvider 和 Facade

在config/app.php文件中注册:

'providers' => [   //只有注册了的服务才能用
// Other service providers... App\Providers\SocialServiceProvider::class,
], 'aliases' => [ //个人理解Facade就是将一些类的很长的路径用一个单词表示
// Other facades...
'Social' => App\Services\Facades\Social::class,
],

最后一步,安装插件:

composer install

现在就能使用服务了。

修改注册页面

use App\Services\SocialService;
use App\Services\Facades\Social; trait RegistersUsers
{
use RedirectsUsers; public function getRegister()
{
if (Input::has('code')) { //如果是从第三方哪里重定向回来的
$user = Social::handle(); //获取用户信息
if (is_a($user, 'App\User')) { //如果返回的是本站用户,证明存在该用户,登陆
Auth::login($user);
return redirect($this->redirectPath());
}
Session::put('newUser', $user); //否则存一下获取的第三方信息
return view('auth.register')->with('newUser', $user);
}
return view('auth.register');
} public function postRegister(Request $request)
{
$user = $this->create($request->all());
if (Session::get('newUser')) { //使用未注册用户的信息来绑定新注册账号
Social::createSocialUser($user, Session::get('newUser'));
}
Auth::login($user); return redirect($this->redirectPath());
}
}

运行结果

未注册:

则会跳转到注册页面,注册账号后退出登陆,然后重新访问http://suip.app/login/github就会直接进入首页啦~

Laravel OAuth2 (三) ---使用 services 和 facades的更多相关文章

  1. Laravel教程 三:视图变量传递和Blade

    Laravel教程 三:视图变量传递和Blade 此文章为原创文章,未经同意,禁止转载. Blade 上一篇我们简单地说了Router,Views和Controllers的工作流程,这一次我就按照上一 ...

  2. Laravel OAuth2 (一) ---简单获取用户信息

    前言 本来要求是使用微信进行第三方登陆,所以想着先用 github 测试成功再用微信测试,可是最近拖了好久都还没申请好微信开放平台的 AppID ,所以就只写 github 的第三方登陆吧,估计微信的 ...

  3. Laravel 门面实例教程 —— 创建自定义 Facades 类

    我们首先创建一个需要绑定到服务容器的Test类: <?php namespace App\Facades; class Test { public function doSomething() ...

  4. laravel(三):larave基本使用

    1.基本视图显示 前文已经介绍如何创建控制器.动作和视图,下面我们来创建一些更实质的功能. 在此之前我们需要修改一些配置: app/config/app.php 文件中的 debug 选项设置为 tr ...

  5. 朱晔和你聊Spring系列S1E10:强大且复杂的Spring Security(含OAuth2三角色+三模式完整例子)

    Spring Security功能多,组件抽象程度高,配置方式多样,导致了Spring Security强大且复杂的特性.Spring Security的学习成本几乎是Spring家族中最高的,Spr ...

  6. Laravel OAuth2 (二) ---配置与数据库设计

    前言 使用 OAuth2 进行第三方登陆分为好几种情况,例如完全第三方登陆,不保存任何用户信息,或者第三方登陆后保存用户信息关联本站账号.个人觉得保存一下用户信息比较妥当(虽然这样注册的时候让用户觉得 ...

  7. laravel中的Contracts, ServiceContainer, ServiceProvider, Facades关系

    Contracts, ServiceContainer, ServiceProvider, Facades  Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方 ...

  8. Laravel的三种安装方法总结

    Laravel号称巨匠级PHP框架,越来越多的PHPer选择它作为开发框架,作为一个Laravel初学者相信很多人向我一样被安装挡在了门外.所以今天结合文档和自己的学习经历总结一下Laravel的安装 ...

  9. laravel oauth2.0 文件上传报错

    报错信息:   "message": "Invalid stream or file provided for UploadedFile",    " ...

随机推荐

  1. 完美解决CTRL+空格不能切换中/英文输入法的问题

    首先任务栏上的输入法图标上点右键选择设置. 然后选择键设置,双击第一个“在不同的输入语言之间切换”先勾选“切换输入语言”下面选择左手ALT.取消右边“切换键盘布局”前的勾. 然后进入“中文(简体)输入 ...

  2. 第七届河南省赛B.海岛争霸(并差集)

    B.海岛争霸 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 130  Solved: 48 [Submit][Status][Web Board] D ...

  3. hdu2554-N对数的排列问题

    http://acm.hdu.edu.cn/showproblem.php?pid=2554 假设所有的2n个数据的位置分别从1~2n标号. 现在假设其中第ai个数据(双胞胎),和bi.那么他们的位置 ...

  4. C# 对象拷贝问题 =等同于浅拷贝

    大家都知道,在C#中变量的存储分为值类型和引用类型两种,而值类型和引用类型在数值变化是产生的后果是不一样的,值类型我们可以轻松实现数值的拷贝,那么引用类型呢,在对象拷贝上存在着一定的难度.     下 ...

  5. poj 3259Wormholes (spfa最短路径)

    #include<stdio.h> #include<string.h> #include<limits.h> #include<queue> usin ...

  6. iOS 10 创建iMessage App

    原文作者 澳大利亚19岁少年--Davis Allie ----原文地址 时值中秋佳节, 送给出门在外的程序猿们 ! 骚年们, 自己写个表情包斗图可否 ! 斗-seal.svg.png 第一. 介绍 ...

  7. beanUtils操作bean的属性

    beanUtils操纵bean属性: 需要jar包commons-beanutils-x.x.x.jar    同时commons-beanutils-x.x.x.jar需要commons-loggi ...

  8. dedecms(织梦)自定义表单后台显示不全 自定义模型当中添加自定义字段后在后台添加内容后不显示解决方案

    我们常用dedecms 自定义表单做留言功能.但是偶尔会遇到这样一个问题,就是 在前台提交表单后..后天显示不全.特别是中文字符  都不会显示, 比如下图: 这是因为  如果你织梦是gbk的话那就对了 ...

  9. A Byte of Python 笔记(7)数据结构:列表、元组、字典,序列

    第9章 数据结构 数据结构,即可以处理一些数据的结构.或者说,它们是用来存储一组相关数据的. python 有三种内建的数据结构--列表.元组和字典. list = ['item1', 'item2' ...

  10. SIF与CIF

    SIF 动态图像专家组(MPEG)在1992年推出的MPEG-1标准中首次定义了SIF(Source Input Format,源输入格式).CCIR 601标准(现改为ITU-R BT.601标准) ...