前言

既然要判断用户是否存在,然后创建用户,那么就要实现几个功能函数。为了方便调用,于是我尝试着写了第一个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. 通过一个模拟程序让你明白WCF大致的执行流程

    原文http://www.cnblogs.com/artech/archive/2011/12/07/wcf-how-to-work.html 在<通过一个模拟程序让你明白ASP.NET MVC ...

  2. Azure Traffic Manager 现可与 Azure 网站集成!

     编辑人员注释:本文章由 WindowsAzure 网站团队高级专家级工程师 Jim Cheshire撰写. AzureTraffic Manager 已经推出有一段时间,这是一种跨多个区域管理网 ...

  3. HDU 5769 Substring(后缀数组)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5769 [题目大意] 在一个串中求出包含字母的子串个数, 只要存在一个字符不相等的子串即可视为不同的 ...

  4. 1396 - Most Distant Point from the Sea

    点击打开链接 题意: 按顺序给出一小岛(多边形)的点 求岛上某点离海最远的距离 解法: 不断的收缩多边形(求半平面交) 直到无限小 二分收缩的距离即可 如图 //大白p263 #include < ...

  5. 经常使用的时间同步server地址

    转载出处http://www.minunix.com/2013/03/ntpserver/ 感谢原作者,一切的权利都属于原作者,假设有所不适,我会马上删除 中国大概能用的NTP时间server地址 s ...

  6. [poj 3159]Candies[差分约束详解][朴素的考虑法]

    题意 编号为 1..N 的人, 每人有一个数; 需要满足 dj - di <= c 求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是" ...

  7. cocos2d-x 3.0 新特性样例

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzMyMTMyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  8. 不是技术牛人,如何拿到国内IT巨头的Offer(1)

    转自:http://developer.51cto.com/art/201404/436685.htm 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,N ...

  9. ios学习Day3xiawu

    switch #include <stdio.h> int main(int argc, char * argv[]) { int i; scanf("%d",& ...

  10. BootStrap 智能表单系列 四 表单布局介绍

    表单的布局分为自动布局和自定义布局两种: 自动布局就是根据配置项中第二级配置项中数组的长度来自动使用不同的bootstrap栅格,通过设置autoLayout为true可以实现自动布局 自动以布局就是 ...