前言

既然要判断用户是否存在,然后创建用户,那么就要实现几个功能函数。为了方便调用,于是我尝试着写了第一个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. 分享一个MD5加密工具类

    来自:http://blog.csdn.net/zranye/article/details/8234480 Es:http://blog.csdn.net/longxibendi/article/d ...

  2. android下tcpdump抓包

    tcpdump是最快捷方便的抓包方式,还可以加深对网络协议的理解.android下可以通过如下方式抓包: 1 Android上启动tcpdump Android设备可以把tcpdump的可执行文件上传 ...

  3. UVA 11549 Calculator Conundrum (Floyd判圈算法)

    题意:有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 思路:这个题一定会出现 ...

  4. 第八届acm省赛 A挑战密室(模拟)

    10406: A.挑战密室 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 29  Solved: 10 [Submit][Status][Web Bo ...

  5. mvc 防止客服端多次提交

    但凡web开发中都会有户多次点击了提交按钮导致多次提交的情况,一般的集中做法 1.通过js在用户点击的时候将按钮disabled掉,但是这样并不是很可靠(我就可以跳过这个,用一个for循环 我直接自己 ...

  6. sp_makewebtask

      Transact-SQL 参考 sp_makewebtask 创建一项生成 HTML 文档的任务,该文档包含执行过的查询返回的数据. 说明  所有 Web 作业在企业管理器的"作业分类& ...

  7. 小猪猪C++笔记基础篇(五)表达式、语句

    小猪猪C++笔记基础篇(五) 关键词:表达式.语句 本章的内容比较简单,基本上没有什么理解上的困难,都是知识上的问题.先开始想要不要写呢,本来是不准备写的,但是既然读了书就要做笔记,还是写一写,毕竟还 ...

  8. windows下fitness python版本安装测试

    FitNesse介绍¶ FitNesse是一套软件开发协作工具. 伟大的软件需要协作和交流,FitNesse可以帮助大家加强软件开发过程中的协作.能够让客户.测试人员和开发人员了解软件要做成什么样,自 ...

  9. nrf51 SDK自带例程的解读

    简单的pwm电机控制示例 simple_pwm_motor_control_example 其实就是pwm控制led的亮度 1.首先设置gpiote 设置初始为高电平2.接着设置ppi 定时器time ...

  10. xfire发布的Webservice中Spring注入为空的解决方案

    Spring框架使用中注入为空是一个比较头疼的问题,遇到Webservice和Spring框架配合时,这个问题更容易出现并很难发现问题的原因. 在做SSO系统中就遇到这样的问题,在Service的实现 ...