Laravel 服务容器实例教程 —— 深入理解控制反转和依赖注入
友情提示:本文有点长,但绝对都是干货,请耐心读完,必有收获!
容器,字面上理解就是装东西的东西。常见的变量、对象属性等都可以算是容器。一个容器能够装什么,全部取决于你对该容器的定义。当然,有这样一种容器,它存放的不是文本、数值,而是对象、对象的描述(类、接口)或者是提供对象的回调,通过这种容器,我们得以实现许多高级的功能,其中最常提到的,就是 “解耦” 、“依赖注入(DI)”。本文就从这里开始。
IoC 容器 —— Laravel 的核心
Laravel 的核心就是一个 IoC 容器,根据文档,称其为“服务容器”,顾名思义,该容器提供了整个框架中需要的一系列服务。作为初学者,很多人会在这一个概念上犯难,因此,我打算从一些基础的内容开始讲解,通过理解面向对象开发中依赖的产生和解决方法,来逐渐揭开“依赖注入”的面纱,逐渐理解这一神奇的设计理念。
本文一大半内容都是通过举例来让读者去理解什么是 IoC(控制反转) 和 DI(依赖注入),通过理解这些概念,来更加深入。更多关于 laravel 服务容器的用法建议阅读文档即可。
IoC 容器诞生的故事
讲解 IoC 容器有很多的文章,我之前也写过。但现在我打算利用当下的灵感重新来过,那么开始吧。
超人和超能力,依赖的产生
面向对象编程,有以下几样东西无时不刻的接触:接口、类还有对象。这其中,接口是类的原型,一个类必须要遵守其实现的接口;对象则是一个类实例化后的产物,我们称其为一个实例。当然这样说肯定不利于理解,我们就实际的写点中看不中用的代码辅助学习。
怪物横行的世界,总归需要点超级人物来摆平。
我们把一个“超人”作为一个类,
class Superman {}
我们可以想象,一个超人诞生的时候肯定拥有至少一个超能力,这个超能力也可以抽象为一个对象,为这个对象定义一个描述他的类吧。一个超能力肯定有多种属性、(操作)方法,这个尽情的想象,但是目前我们先大致定义一个只有属性的“超能力”,至于能干啥,我们以后再丰富:
class Power { /** * 能力值 */ protected $ability; /** * 能力范围或距离 */ protected $range; public function __construct($ability, $range) { $this->ability = $ability; $this->range = $range; } }
这时候我们回过头,修改一下之前的“超人”类,让一个“超人”创建的时候被赋予一个超能力:
class Superman { protected $power; public function __construct() { $this->power = new Power(999, 100); } }
这样的话,当我们创建一个“超人”实例的时候,同时也创建了一个“超能力”的实例,但是,我们看到了一点,“超人”和“超能力”之间不可避免的产生了一个依赖。
所谓“依赖”,就是 “我若依赖你,我就不能离开你”。
在一个贯彻面向对象编程的项目中,这样的依赖随处可见。少量的依赖并不会有太过直观的影响,我们随着这个例子逐渐铺开,让大家慢慢意识到,当依赖达到一个量级时,是怎样一番噩梦般的体验。当然,我也会自然而然的讲述如何解决问题。
一堆乱麻 —— 可怕的依赖
之前的例子中,超能力类实例化后是一个具体的超能力,但是我们知道,超人的超能力是多元化的,每种超能力的方法、属性都有不小的差异,没法通过一种类描述完全。我们现在进行修改,我们假设超人可以有以下多种超能力:
- 飞行,属性有:飞行速度、持续飞行时间
- 蛮力,属性有:力量值
- 能量弹,属性有:伤害值、射击距离、同时射击个数
我们创建了如下类:
class Flight { protected $speed; protected $holdtime; public function __construct($speed, $holdtime) {} } class Force { protected $force; public function __construct($force) {} } class Shot { protected $atk; protected $range; protected $limit; public function __construct($atk, $range, $limit) {} }
为了省事儿我没有详细写出 __construct()
这个构造函数的全部,只写了需要传递的参数。
好了,这下我们的超人有点“忙”了。在超人初始化的时候,我们会根据需要来实例化其拥有的超能力吗,大致如下:
class Superman { protected $power; public function __construct() { $this->power = new Fight(9, 100); // $this->power = new Force(45); // $this->power = new Shot(99, 50, 2); /* $this->power = array( new Force(45), new Shot(99, 50, 2) ); */ } }
我们需要自己手动的在构造函数内(或者其他方法里)实例化一系列需要的类,这样并不好。可以想象,假如需求变更(不同的怪物横行地球),需要更多的有针对性的新的超能力,或者需要变更超能力的方法,我们必须 重新改造 超人。换句话说就是,改变超能力的同时,我还得重新制造个超人。效率太低了!新超人还没创造完成世界早已被毁灭。
这时,灵机一动的人想到:为什么不可以这样呢?超人的能力可以被随时更换,只需要添加或者更新一个芯片或者其他装置啥的(想到钢铁侠没)。这样的话就不要整个重新来过了。
对,就是这样的。
我们不应该手动在 “超人” 类中固化了他的 “超能力” 初始化的行为,而转由外部负责,由外部创造超能力模组、装置或者芯片等(我们后面统一称为 “模组”),植入超人体内的某一个接口,这个接口是一个既定的,只要这个 “模组” 满足这个接口的装置都可以被超人所利用,可以提升、增加超人的某一种能力。这种由外部负责其依赖需求的行为,我们可以称其为 “控制反转(IoC)”。
工厂模式,依赖转移!
当然,实现控制反转的方法有几种。在这之前,不如我们先了解一些好玩的东西。
我们可以想到,组件、工具(或者超人的模组),是一种可被生产的玩意儿,生产的地方当然是 “工厂(Factory)”,于是有人就提出了这样一种模式: 工厂模式。
工厂模式,顾名思义,就是一个类所依赖的外部事物的实例,都可以被一个或多个 “工厂” 创建的这样一种开发模式,就是 “工厂模式”。
我们为了给超人制造超能力模组,我们创建了一个工厂,它可以制造各种各样的模组,且仅需要通过一个方法:
class SuperModuleFactory { public function makeModule($moduleName, $options) { switch ($moduleName) { case 'Fight': return new Fight($options[0], $options[1]); case 'Force': return new Force($options[0]); case 'Shot': return new Shot($options[0], $options[1], $options[2]); } } }
这时候,超人 创建之初就可以使用这个工厂!
class Superman { protected $power; public function __construct() { // 初始化工厂 $factory = new SuperModuleFactory; // 通过工厂提供的方法制造需要的模块 $this->power = $factory->makeModule('Fight', [9, 100]); // $this->power = $factory->makeModule('Force', [45]); // $this->power = $factory->makeModule('Shot', [99, 50, 2]); /* $this->power = array( $factory->makeModule('Force', [45]), $factory->makeModule('Shot', [99, 50, 2]) ); */ } }
可以看得出,我们不再需要在超人初始化之初,去初始化许多第三方类,只需初始化一个工厂类,即可满足需求。但这样似乎和以前区别不大,只是没有那么多 new 关键字。其实我们稍微改造一下这个类,你就明白,工厂类的真正意义和价值了。
class Superman { protected $power; public function __construct(array $modules) { // 初始化工厂 $factory = new SuperModuleFactory; // 通过工厂提供的方法制造需要的模块 foreach ($modules as $moduleName => $moduleOptions) { $this->power[] = $factory->makeModule($moduleName, $moduleOptions); } } } // 创建超人 $superman = new Superman([ 'Fight' => [9, 100], 'Shot' => [99, 50, 2] ]);
现在修改的结果令人满意。现在,“超人” 的创建不再依赖任何一个 “超能力” 的类,我们如若修改了或者增加了新的超能力,只需要针对修改 SuperModuleFactory 即可。扩充超能力的同时不再需要重新编辑超人的类文件,使得我们变得很轻松。但是,这才刚刚开始。
IoC 容器的重要组成 —— 依赖注入
由 “超人” 对 “超能力” 的依赖变成 “超人” 对 “超能力模组工厂” 的依赖后,对付小怪兽们变得更加得心应手。但这也正如你所看到的,依赖并未解除,只是由原来对多个外部的依赖变成了对一个 “工厂” 的依赖。假如工厂出了点麻烦,问题变得就很棘手。
其实大多数情况下,工厂模式已经足够了。工厂模式的缺点就是:接口未知(即没有一个很好的契约模型,关于这个我马上会有解释)、产生对象类型单一。总之就是,还是不够灵活。虽然如此,工厂模式依旧十分优秀,并且适用于绝大多数情况。不过我们为了讲解后面的依赖注入 ,这里就先夸大一下工厂模式的缺陷咯。
我们知道,超人依赖的模组,我们要求有统一的接口,这样才能和超人身上的注入接口对接,最终起到提升超能力的效果。
事实上,我之前说谎了,不仅仅只有一堆小怪兽,还有更多的大怪兽。嘿嘿。额,这时候似乎工厂的生产能力显得有些不足 —— 由于工厂模式下,所有的模组都已经在工厂类中安排好了,如果有新的、高级的模组加入,我们必须修改工厂类(好比增加新的生产线):
class SuperModuleFactory { public function makeModule($moduleName, $options) { switch ($moduleName) { case 'Fight': return new Fight($options[0], $options[1]); case 'Force': return new Force($options[0]); case 'Shot': return new Shot($options[0], $options[1], $options[2]); // case 'more': ....... // case 'and more': ....... // case 'and more': ....... // case 'oh no! its too many!': ....... } } }
看到没。。。噩梦般的感受!
其实灵感就差一步!你可能会想到更为灵活的办法!对,下一步就是我们今天的主要配角 —— DI (依赖注入)
由于对超能力模组的需求不断增大,我们需要集合整个世界的高智商人才,一起解决问题,不应该仅仅只有几个工厂垄断负责。不过高智商人才们都非常自负,认为自己的想法是对的,创造出的超能力模组没有统一的接口,自然而然无法被正常使用。这时我们需要提出一种契约,这样无论是谁创造出的模组,都符合这样的接口,自然就可被正常使用。
interface SuperModuleInterface { /** * 超能力激活方法 * * 任何一个超能力都得有该方法,并拥有一个参数 *@param array $target 针对目标,可以是一个或多个,自己或他人 */ public function activate(array $target); }
上文中,我们定下了一个接口 (超能力模组的规范、契约),所有被创造的模组必须遵守该规范,才能被生产。
其实,这就是 php 中接口( interface )的用处和意义!很多人觉得,为什么 php 需要接口这种东西?难道不是 java 、 C# 之类的语言才有的吗?这么说,只要是一个正常的面向对象编程语言(虽然 php 可以面向过程),都应该具备这一特性。因为一个 对象(object) 本身是由他的模板或者原型 —— 类 (class) ,经过实例化后产生的一个具体事物,而有时候,实现统一种方法且不同功能(或特性)的时候,会存在很多的类(class),这时候就需要有一个契约,让大家编写出可以被随时替换却不会产生影响的接口。这种由编程语言本身提出的硬性规范,会增加更多优秀的特性。
虽然有些绕,但通过我们接下来的实例,大家会慢慢领会接口带来的好处。
这时候,那些提出更好的超能力模组的高智商人才,遵循这个接口,创建了下述(模组)类:
/** * X-超能量 */ class XPower implements SuperModuleInterface { public function activate(array $target) { // 这只是个例子。。具体自行脑补 } } /** * 终极炸弹 (就这么俗) */ class UltraBomb implements SuperModuleInterface { public function activate(array $target) { // 这只是个例子。。具体自行脑补 } }
同时,为了防止有些 “砖家” 自作聪明,或者一些叛徒恶意捣蛋,不遵守契约胡乱制造模组,影响超人,我们对超人初始化的方法进行改造:
class Superman { protected $module; public function __construct(SuperModuleInterface $module) { $this->module = $module; } }
改造完毕!现在,当我们初始化 “超人” 类的时候,提供的模组实例必须是一个 SuperModuleInterface
接口的实现。否则就会提示错误。
正是由于超人的创造变得容易,一个超人也就不需要太多的超能力,我们可以创造多个超人,并分别注入需要的超能力模组即可。这样的话,虽然一个超人只有一个超能力,但超人更容易变多,我们也不怕怪兽啦!
现在有人疑惑了,你要讲的依赖注入呢?
其实,上面讲的内容,正是依赖注入。
什么叫做依赖注入?
本文从开头到现在提到的一系列依赖,只要不是由内部生产(比如初始化、构造函数 __construct 中通过工厂方法、自行手动 new 的),而是由外部以参数或其他形式注入的,都属于依赖注入(DI) 。是不是豁然开朗?事实上,就是这么简单。下面就是一个典型的依赖注入:
// 超能力模组 $superModule = new XPower; // 初始化一个超人,并注入一个超能力模组依赖 $superMan = new Superman($superModule);
关于依赖注入这个本文的主要配角,也就这么多需要讲的。理解了依赖注入,我们就可以继续深入问题。慢慢走近今天的主角……
更为先进的工厂 —— IoC 容器
刚刚列了一段代码:
$superModule = new XPower; $superMan = new Superman($superModule);
读者应该看出来了,手动的创建了一个超能力模组、手动的创建超人并注入了刚刚创建超能力模组。呵呵,手动。
现代社会,应该是高效率的生产,干净的车间,完美的自动化装配。
一群怪兽来了,如此低效率产出超人是不现实,我们需要自动化 —— 最多一条指令,千军万马来相见。我们需要一种高级的生产车间,我们只需要向生产车间提交一个脚本,工厂便能够通过指令自动化生产。这种更为高级的工厂,就是工厂模式的升华 —— IoC 容器。
class Container { protected $binds; protected $instances; public function bind($abstract, $concrete) { if ($concrete instanceof Closure) { $this->binds[$abstract] = $concrete; } else { $this->instances[$abstract] = $concrete; } } public function make($abstract, $parameters = []) { if (isset($this->instances[$abstract])) { return $this->instances[$abstract]; } array_unshift($parameters, $this); return call_user_func_array($this->binds[$abstract], $parameters); } }
这时候,一个十分粗糙的容器就诞生了。现在的确很简陋,但不妨碍我们进一步提升他。先着眼现在,看看这个容器如何使用吧!
// 创建一个容器(后面称作超级工厂) $container = new Container; // 向该 超级工厂添加超人的生产脚本 $container->bind('superman', function($container, $moduleName) { return new Superman($container->make($moduleName)); }); // 向该 超级工厂添加超能力模组的生产脚本 $container->bind('xpower', function($container) { return new XPower; }); // 同上 $container->bind('ultrabomb', function($container) { return new UltraBomb; }); // ****************** 华丽丽的分割线 ********************** // 开始启动生产 $superman_1 = $container->make('superman', 'xpower'); $superman_2 = $container->make('superman', 'ultrabomb'); $superman_3 = $container->make('superman', 'xpower'); // ...随意添加
看到没?通过最初的 绑定(bind
) 操作,我们向 超级工厂 注册了一些生产脚本,这些生产脚本在生产指令下达之时便会执行。发现没有?我们彻底的解除了 超人 与 超能力模组 的依赖关系,更重要的是,容器类也丝毫没有和他们产生任何依赖!我们通过注册、绑定的方式向容器中添加一段可以被执行的回调(可以是匿名函数、非匿名函数、类的方法)作为生产一个类的实例的 脚本 ,只有在真正的 生产(make
) 操作被调用执行时,才会触发。
这样一种方式,使得我们更容易在创建一个实例的同时解决其依赖关系,并且更加灵活。当有新的需求,只需另外绑定一个“生产脚本”即可。
实际上,真正的 IoC 容器更为高级。我们现在的例子中,还是需要手动提供超人所需要的模组参数,但真正的 IoC 容器会根据类的依赖需求,自动在注册、绑定的一堆实例中搜寻符合的依赖需求,并自动注入到构造函数参数中去。Laravel 框架的服务容器正是这么做的。实现这种功能其实理论上并不麻烦,但我并不会在本文中写出,因为……我懒得写。
不过我告诉大家,这种自动搜寻依赖需求的功能,是通过反射(Reflection)实现的,恰好的,php 完美的支持反射机制!关于反射,php 官方文档有详细的资料,并且中文翻译基本覆盖,足够学习和研究:
http://php.net/manual/zh/book.reflection.php
现在,到目前为止,我们已经不再惧怕怪兽们了。高智商人才集思广益,井井有条,根据接口契约创造规范的超能力模组。超人开始批量产出。最终,人人都是超人,你也可以是哦!
重新审视 Laravel 的核心
现在,我们开始慢慢解读 Laravel 的核心。其实,Laravel 的核心就是一个 IoC 容器,也恰好是我之前所说的高级的 IoC 容器。
可以说,Laravel 的核心本身十分轻量,并没有什么很神奇很实质性的应用功能。很多人用到的各种功能模块比如 Route(路由)、Eloquent ORM(数据库 ORM 组件)、Request(请求)以及 Response(响应)等等等等,实际上都是与核心无关的类模块提供的,这些类从注册到实例化,最终被你所使用,其实都是 Laravel 的服务容器负责的。
我们以大家最常见的 Route 类作为例子。大家可能经常见到路由定义是这样的:
Route::get('/', function() { // bla bla bla... });
实际上, Route 类被定义在这个命名空间:Illuminate\Routing\Router
,文件 vendor/laravel/framework/src/Illuminate/Routing/Router.php
。
我们通过打开发现,这个类的这一系列方法,如 get
,post
,any
等都不是静态(static
)方法,这是怎么一回事儿?不要急,我们继续。
服务提供者
我们在前文介绍 IoC 容器的部分中,提到了,一个类需要绑定、注册至容器中,才能被“制造”。
对,一个类要被容器所能够提取,必须要先注册至这个容器。既然 Laravel 称这个容器叫做服务容器,那么我们需要某个服务,就得先注册、绑定这个服务到容器,那么提供服务并绑定服务至容器的东西,就是服务提供者(Service Provider)。
虽然,绑定一个类到容器不一定非要通过服务提供者。
但是,我们知道,有时候我们的类、模块会有需要其他类和组件的情况,为了保证初始化阶段不会出现所需要的模块和组件没有注册的情况,Laravel 将注册和初始化行为进行拆分,注册的时候就只能注册,初始化的时候就是初始化。拆分后的产物就是现在的服务提供者。
服务提供者主要分为两个部分,register
(注册) 和 boot
(引导、初始化),具体参考文档。register
负责进行向容器注册“脚本”,但要注意注册部分不要有对未知事物的依赖,如果有,就要移步至 boot
部分。
门面(Facade)
我们现在解答之前关于 Route 的方法为何能以静态方法访问的问题。实际上这个问题文档上有写,简单说来就是模拟一个类,提供一个静态魔术方法__callStatic
,并将该静态方法映射到真正的方法上。
我们使用的 Route 类实际上是 Illuminate\Support\Facades\Route
通过 class_alias()
函数创造的别名而已,这个类被定义在文件 vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php
。
我们打开文件一看……诶?怎么只有这么简单的一段代码呢?
<?php
namespace Illuminate\Support\Facades;
/**
* @see \Illuminate\Routing\Router
*/
class Route extends Facade {
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'router';
}
}
其实仔细看,会发现这个类继承了一个叫做 Facade
的类,到这里谜底差不多要解开了。
上述简单的定义中,我们看到了 getFacadeAccessor
方法返回了一个 route
,这是什么意思呢?事实上,这个值被一个 ServiceProvider
注册过,大家应该知道注册了个什么,当然是那个真正的路由类!
有人会问,Facade 是怎么实现的。我并不想说得太细,一个是我懒,另一个原因就是,自己发现一些东西更容易理解,并不容易忘记。很多细节我已经说了,建议大家自行去研究。
167 Comments
漫画呢 😄
你好,我看你在这篇文章下面的留言你理解的很透彻,我想问一下这篇文章中我在操作的时候打断点,发现他并没有去往Container类的make方法中array_unshift($parameters, $this);的地方,都是在上面的if (isset($this->instances[$abstract])) { 直接返回了,想问一下是怎么回事谢谢了。
人氣NO.1茶莊北.中.南鮑魚外送茶賴kk7417或qw9886【Telegram:bjbj003】官網:www.jk5822.com 18歲學生超大奶–淫蕩少婦人妻單親奶水媽媽—貧乳幼齒未開苞 饑渴熟女姐姐—喜歡哪一腫加賴告訴我 好康熟線—ID:ns6688【Telegram:bjbj003】官網:www.jk5822.com →新客戶加入鮑魚外送茶坊優惠:↓↓↓↓↓ →約妹妹送情趣用品/內衣+原味內褲 →約妹時間升級鮑魚Vip/ ViP升甜美尊貴ViP →約妹後每天送妹妹自慰影片 →約妹加節可NS →約妹達到限定次數可半價優惠 →特俗服務 69 奶泡 顏射 口爆 中出 火車便當 →約妹加入色群組可與兼職妹妹視訊 ◆◆超甜美新屋-美胸氣質正妹-巨乳正妹 ◆◆宅男女神-內衣麻豆-美日航空姐-大學笑花 ◆◆單親奶水媽媽-火辣二線女模-噴血爆乳內衣妹 ◆◆卡哇伊幼齒妹-外貌協會-派對正妹-韓日混血美女 ◆◆爆乳吸精護士-G奶浪蕩女-性感潮吹妹-裸露女教師-雙飛3p 推薦一個偷吃官網:Telegram賬號:bjbj003 加入頻道看照選妹咯加入的大大儘管放心你們可觀看不可發言相互看不到對方的資料 ◆鮑魚外約賴:kk7417 ◆◆純正台灣妹妹 正派經營 各行各業 帝王般的享受 看到妹妹本人見面滿意現金消費/不轉賬/不匯款/不買點數/誠信服務 外約地點:台北-林口-新竹-台中-彰化-南投-草屯-高雄-台南
小隻馬可愛系列:【加賴kk7417】 小甄 158cm.46kg.Dcup.21歲 會撒嬌有女友fu內裝粉嫩穴緊多汁白皙陶瓷肌溫柔似水的眼眸甜美蜜糖般的模樣 小白白 160cm.44kg.Ccup.21歲 鄰家小妹妹!很好互動配合度很高相處起來自然 隨性 安荷 157cm.45kg.Ccup.20歲 清秀的五官纖細的身軀偷偷下海嘗試愛的禁果 吉拉 155cm.39kg.Bcup.19歲 #學生妹小穴夾很緊很敏感技術沒有到特別好 但是在床上很聽話 嘟嘟 157cm.44kg.Ccup.21歲 小可愛的男科小護士床上職業服裝 超小女人給你滿滿戀愛感
人妻主動敢玩系列:【加賴kk7417】 冰心 162cm.49kg.Fcup.36歲 短髮姐姐D罩杯36歲看上去有點老氣但技術很好饑渴淫蕩穴穴很騷很敏感 陽陽 164cm.50kg.Ccup.28歲 性感人妻 床上功夫淫蕩 要是你沒有什麼技術的話 可以讓她教你幾招哦 雨蓉 164cm.48kg.D+cup.37歲 身材很贊高挑類型的熟女顏射 口爆 無套吹、毒龍.配合高各種服務 林恩 167cm.49kg.Dcup.30歲 風騷熟女 單親媽媽生活艱辛下班后出來兼職 貼補家用服務很貼心 佳佳 165cm.48kg.Ecup.26歲 是瑜伽老師喔 身體很柔軟 適合玩各種姿勢超有氣質的女生
氣質大奶美腿系列:【加賴kk7417】 玲瓏 165cm.Dcup.48kg.25歲 #美腿修長窈窕身姿撫媚多嬌 俏麗性感無比魂引夢牽電臀細腰超級會扭動 珊珊 165cm.Fcup.50kg.24歲 #車模 大奶白皙 超級會玩淫蕩的身體等著哥哥愛撫讓男人欲火焚身 夢娜 163cm.Ecup.47kg.23歲 職業【大奶正妹】甜美貼心婚紗小助理 月亮 162cm.Dcup.46kg.21歲 大學校花 身材凹凸有型沒有刺青沒有煙味外貌氣質外加可愛 媛媛 163cm.Gcup.52kg.28歲 氣質人妻飽滿柔軟大奶 手感揉捏起來超讚的 可無套bj 添蛋蛋 深喉嚨 LG
鮑魚北中南外送選妃網址:【Telegram:bjbj003】【淫妹網:http://jk5822.com/】 鮑魚王牌高檔3官網:【http://www.jk5822.com/forum.php?mod=forumdisplay&fid=87】 客人真實售後官網:【http://www.jk5822.com/forum.php?mod=forumdisplay&fid=90】 Telegram:bjbj003:【http://www.jk5822.com/forum.php?mod=forumdisplay&fid=91】 北部外送茶選妃官網:【http://jk5822.com/forum.php?mod=forumdisplay&fid=41】 中部外送茶選妃官網:【http://jk5822.com/forum.php?mod=forumdisplay&fid=42】 南部外送茶選妃官網:【http://jk5822.com/forum.php?mod=forumdisplay&fid=50】
樂樂外送茶瀨59551/telegram:@line59551全套服務外約茶莊超優質外約~讓你享受前所未有的舒暢感
#台灣 #外約 #成人舒壓 #外送茶 #叫小姐 #找茶 #美女 #全省外約 #汽車旅館 #交友 #約妹#高雄找女人#高雄約會#高雄正妹推薦 #高雄美女外送#高雄叫雞服務#高雄無套小姐#高雄找茶#高雄找茶論壇#高雄成人推薦#高雄看照約妹#高雄看照約炮#高雄打炮 #高雄約炮#茶莊#喝茶#約茶#台中找女人#台中約會#台中正妹推薦#台中叫小姐#台中美女外送#台中叫雞服務#台中無套小姐 #台中找茶#台中找茶論壇#台中成人推薦#台中看照約妹#台中打炮#台中約炮#台北找女人#台北約會#台北正妹推薦 #台北美女外送#台北叫雞服務#台北無套小姐#台北找茶#台北找茶論壇#台北成人推薦#台北看照約妹#台北看照約炮 #台北打炮#台北約炮#騷 #浪 #敢玩 #完全的慾女級別 #長腿秘書 #風騷 #主動#學生 #青春 #幼齒 #蘿莉 #可愛 #活潑 #初次兼差#大學生新生 #大四畢業生 #甜美可愛 #青春肉體 #外約學生妹 #蘿莉送茶#學生外送 #學生援交妹 #學生下海 #大學新生兼差 #大四畢業生短期兼職 #高顏值學生妹 #靚麗大學生大一新生下海 #秘書 #爆乳 #大奶 #辦公室誘惑 #偷情的刺激 #約愛 #淫蕩風騷 #OL #高跟鞋誘惑 #美腿 #大長腿 #喝茶#OL#美腿#絲襪#大長腿#高跟鞋#轉推 #點愛心 #關注我
瀨043821 Telegram:av8526#高中畢業生暑假試車 資訊:萌萌 153.B.39.18歲 嬌小學生妹妹#年僅18歲乖巧可愛非常順從,葛格讓她吹她還帶點舔,輕巧嬌嫩的小巧體型#很適合葛格抱起來玩火車便當呢!喜歡清音蘿莉的不要錯過囉~#合法蘿莉【消費立減500-1000 消費買三送一 營業時間:下午13:00凌晨03:00 約旅館 現金消費】電報頻道:https://t.me/lineck287官網www.ppp8669.com
嗨!你好唷!我是小米粒賴fb2238介紹台灣本土妹外送旅館、酒店、飯店、商旅、熟客可住家的 ★介紹純兼差正妹、選擇多、不定時有三線小模、三線藝人、學生、空姐、處女、單親媽媽、熟女人妻不等報班、孕婦也有哦比較少 ★全套服務:主動熱情、健談好聊、敢玩配合高、主要不偷時間、還有100%真實客評專區不做假、專做口碑 ★外約地區:台北、新北、林口龜山萬壽路、新竹、台中、彰化南投、高雄、台南 ●外送地點:旅館●飯店●商旅●酒店【熟客住家到府●外約】 ★聯絡方式:賴:賴fb2238官網:www.nos998.com下載Telegram加nos998【現約現折500-3000現金、加節更優待哦】 ★佳麗官網: 《 http://www.nos998.com》 【建議一定保存哦】 ★付費方式:見到妹本人現金收費、不點數、不匯款、不勉強消費、可退換、以客為尊,約妹滿意在付費 ★營業時間:下午:13:00 ~ 凌晨:04:00 性福可獲得茶裏王福利賴fb2238 省荷包優惠如下:↓ 優惠1:生客特權優惠1000 優惠2:單月消費兩次以上,第三次折扣2K 優惠3:攜友同行,折扣1K人人有份 優惠4:一次購買兩節,折扣2K 優惠5:當月生日送絲襪.另有神秘禮物贈送 優惠6:各類型美眉推出買二送二.買一送一,
生活的酸甜苦辣~總是習慣自己承擔,往心裡藏嗎? 哥哥~工作帶給你的壓力大嗎? 還在為家裡的事而心情不開心嗎?不是 你是不是時常羨慕別人有著漂亮女友? 也希望自己能跟漂亮女生做愛 小米粒讓你有機會!! 不要讓自己的DD感到寂寞嚕*~*
賴fb2238官網:www.nos998.com 下載【Telegram加nos998】
小米粒頂級茶坊賴fb2238主推全台各地本土大學學生妹孕婦人妻熟女兼職 台中外約學生妹賴fb2238逢甲學生妹 #東海學生妹 #靜宜學生妹兼職外約電報:nos998 台北外約學生妹賴fb2238台大學生妹 #輔仁學生妹 #淡江學生妹兼職外約電報:nos998 新竹外約學生妹賴fb2238清華學生妹 #育達學生妹 #交通大學生兼職外約電報:nos998 台南外約學生妹瀨fb2238科技學生妹 #長榮學生妹 #護理學生妹兼職外約電報:nos998 高雄外約學生妹瀨fb2238樹德學生妹 #守義學生妹 #輔英學生妹兼職外約電報:nos998 文澡外約學生妹瀨fb2238醫科學生妹 #守義學生妹 #樹德學生妹兼職外約電報:nos998
小米粒外送茶外送地區: 【新北】三重區 土城區 汐止區 新莊區 板橋區 永和區 瀘州區 中和區 五股區 泰山區 新店區 八里區 淡水區 林口龜山萬壽路 【台北】大同區 大安區 士林區 中山區 中正區 內湖區 文山區 北投區 松山區 信義區 南港區 萬華區 【新竹】新竹《東區》竹北 香山 【彰化】員林鎮 鹿港鎮 埔心鄉 和美鎮 溪湖鎮 田尾區 南投市 草屯區 田中鎮 彰化市 【台中】東區 南區 西區 北區 中區 南屯區 西屯區 北屯區 大里區 大雅區 烏日區 豐原區 沙鹿區 太平區 【高雄】左營區 三民區 苓雅區 新興區 前鎮區 前金區 鼓山區 楠梓區 小港區 鳳山區 【台南】東區 北區 南區 中西區 永康區-仁德區
賴:fb2238官網:www.nos998.com 下載Telegram加nos998 台北外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=57 台中外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=58 高雄外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=59 新竹外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=57 彰化外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=58 台南外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=59 吃魚喝茶新手區:http://www.nos998.com/forum.php?mod=forumdisplay&fid=53 真實客評售後區:http://www.nos998.com/forum.php?mod=forumdisplay&fid=55
小米粒台灣本土外送茶坊 為你而制定 在這個壓力大的年代 每個人都需要抒壓 您詢問 我們介紹 你滿意現金消費 不轉帳 不點數 請各位互相尊重 誠心了解 非誠勿擾 謝謝~
這裡給講解一下第一次約外送茶流程 1.首先要給您的電話及怎樣稱呼,這樣方便聯絡~ 2.你可先告訴我您的”消費預算及喜歡類型的mm“,方便準確安排! 3.再來您要約的 ”時間 ”及指定的 ”地點 ”我們會準時赴約! 4.若是去旅館,會先問您房號,美眉直接進房間/ 5.美眉看過滿意再現金消費‧不強迫‧免轉帳‧免受騙‧以客為尊! 如果安排的小姐不滿意,我們可以換外送茶小姐,但打槍畢竟對雙方都不好,也浪費彼此的時間. 所以在您聯絡時請詳細說明您的需求及條件 這樣可以更能夠符合您的要求~+ 若臨時有事須取消,也請提前告知! 服務時間:am.13:00-pm.04:00
推薦一個適合偷吃的app噢 1:手機安裝:Telegram 2:設定帳號(用電話號碼綁定接收驗證碼即可) 3:完成帳號設定後搜尋id:@nos998 4:然後密我一下 5:切換中文版Telegram: https://t.me/setlanguage/taiwan 北中南看照選妹影片選妹【 https://t.me/wl9970】 加入頻道看照選妹咯加入的大大儘管放心你們可觀看不可發言相互看不到對方的資料 嘿 建立了色色的+幽默趣圖 有興趣可加哦 【https://t.me/wl9970】
大奶小支馬可愛系列【LINE:fb2238 寧靜 158.D.45kg.19歲 甜美可愛水嫩肌膚 令很多大哥哥為之傾倒! 凱麗 166.H.52kg.28歲 大屁股翹起來給哥哥插 肥美鮑魚餵飽你 熊熊.160.E.46kg.20歲 敏感型.小妹妹緊實蜜多 可以吸舔 茜茜 161.F.47kg.22歲 可愛小隻馬 臉蛋楚楚可人
高挑纖細氣質CP值系列【LINE:fb2238 小汐 168cm.C奶.26歲氣質的外表 凹凸有型的身材脫下衣服 又是另外一種風姿 婉瑜 166cm.B杯.19歲妹妹一邊幫你口交一邊含情脈脈的看著你讓你感受到掌控天下的成就感 千禧 165cm.E奶.24歲妹妹主動淫蕩 欲求不滿 只求被滿足下面很敏感喔 雅心 170cm.D奶.21歲高檔正妹 #採取預約制清純外貿學生 有兼職主播
鄉下少婦知性熟女系列【LINE:fb2238 欣欣 162 C 46 30歲 單親媽媽兼職 賺奶粉錢咯 舒舒 161 E 48 28歲 超大奶姐姐 很騷 尺度大 敢玩 子晴 167 E 50 27歲 便宜大碗耐乾 很騷偷情少婦 小雅 158 C 44 25歲 vip客人約住家的口碑好妹!嬌小羅莉 很性感!
肉肉女重量級豐滿大奶系列【LINE:fb2238 瑞瑞 163.F奶.53.30歲 好大一顆 皮膚白滑摸起來有手感 月月 155.G奶.65.27歲下面緊實 肥美的鮑魚會夾著你不放喔 喵喵 163.H奶.70.23歲 乾淨 青澀 呆萌好控制內裝還是粉嫩嫩滴 小茹 163.F奶.60.30歲 可預約 全程無套 什麼姿勢都ok
嗨!你好唷!我是小米粒賴fb2238介紹台灣本土妹外送旅館、酒店、飯店、商旅、熟客可住家的 ★介紹純兼差正妹、選擇多、不定時有三線小模、三線藝人、學生、空姐、處女、單親媽媽、熟女人妻不等報班、孕婦也有哦比較少 ★全套服務:主動熱情、健談好聊、敢玩配合高、主要不偷時間、還有100%真實客評專區不做假、專做口碑 ★外約地區:台北、新北、林口龜山萬壽路、新竹、台中、彰化南投、高雄、台南 ●外送地點:旅館●飯店●商旅●酒店【熟客住家到府●外約】 ★聯絡方式:賴:賴fb2238官網:www.nos998.com下載Telegram加nos998【現約現折500-3000現金、加節更優待哦】 ★佳麗官網: 《 http://www.nos998.com》 【建議一定保存哦】 ★付費方式:見到妹本人現金收費、不點數、不匯款、不勉強消費、可退換、以客為尊,約妹滿意在付費 ★營業時間:下午:13:00 ~ 凌晨:04:00 性福可獲得茶裏王福利賴fb2238 省荷包優惠如下:↓ 優惠1:生客特權優惠1000 優惠2:單月消費兩次以上,第三次折扣2K 優惠3:攜友同行,折扣1K人人有份 優惠4:一次購買兩節,折扣2K 優惠5:當月生日送絲襪.另有神秘禮物贈送 優惠6:各類型美眉推出買二送二.買一送一,
生活的酸甜苦辣~總是習慣自己承擔,往心裡藏嗎? 哥哥~工作帶給你的壓力大嗎? 還在為家裡的事而心情不開心嗎?不是 你是不是時常羨慕別人有著漂亮女友? 也希望自己能跟漂亮女生做愛 小米粒讓你有機會!! 不要讓自己的DD感到寂寞嚕*~*
賴fb2238官網:www.nos998.com 下載【Telegram加nos998】
小米粒頂級茶坊賴fb2238主推全台各地本土大學學生妹孕婦人妻熟女兼職 台中外約學生妹賴fb2238逢甲學生妹 #東海學生妹 #靜宜學生妹兼職外約電報:nos998 台北外約學生妹賴fb2238台大學生妹 #輔仁學生妹 #淡江學生妹兼職外約電報:nos998 新竹外約學生妹賴fb2238清華學生妹 #育達學生妹 #交通大學生兼職外約電報:nos998 台南外約學生妹瀨fb2238科技學生妹 #長榮學生妹 #護理學生妹兼職外約電報:nos998 高雄外約學生妹瀨fb2238樹德學生妹 #守義學生妹 #輔英學生妹兼職外約電報:nos998 文澡外約學生妹瀨fb2238醫科學生妹 #守義學生妹 #樹德學生妹兼職外約電報:nos998
小米粒外送茶外送地區: 【新北】三重區 土城區 汐止區 新莊區 板橋區 永和區 瀘州區 中和區 五股區 泰山區 新店區 八里區 淡水區 林口龜山萬壽路 【台北】大同區 大安區 士林區 中山區 中正區 內湖區 文山區 北投區 松山區 信義區 南港區 萬華區 【新竹】新竹《東區》竹北 香山 【彰化】員林鎮 鹿港鎮 埔心鄉 和美鎮 溪湖鎮 田尾區 南投市 草屯區 田中鎮 彰化市 【台中】東區 南區 西區 北區 中區 南屯區 西屯區 北屯區 大里區 大雅區 烏日區 豐原區 沙鹿區 太平區 【高雄】左營區 三民區 苓雅區 新興區 前鎮區 前金區 鼓山區 楠梓區 小港區 鳳山區 【台南】東區 北區 南區 中西區 永康區-仁德區
賴:fb2238官網:www.nos998.com 下載Telegram加nos998 台北外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=57 台中外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=58 高雄外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=59 新竹外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=57 彰化外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=58 台南外送茶官網:http://www.nos998.com/forum.php?mod=forumdisplay&fid=59 吃魚喝茶新手區:http://www.nos998.com/forum.php?mod=forumdisplay&fid=53 真實客評售後區:http://www.nos998.com/forum.php?mod=forumdisplay&fid=55
小米粒台灣本土外送茶坊 為你而制定 在這個壓力大的年代 每個人都需要抒壓 您詢問 我們介紹 你滿意現金消費 不轉帳 不點數 請各位互相尊重 誠心了解 非誠勿擾 謝謝~
這裡給講解一下第一次約外送茶流程 1.首先要給您的電話及怎樣稱呼,這樣方便聯絡~ 2.你可先告訴我您的”消費預算及喜歡類型的mm“,方便準確安排! 3.再來您要約的 ”時間 ”及指定的 ”地點 ”我們會準時赴約! 4.若是去旅館,會先問您房號,美眉直接進房間/ 5.美眉看過滿意再現金消費‧不強迫‧免轉帳‧免受騙‧以客為尊! 如果安排的小姐不滿意,我們可以換外送茶小姐,但打槍畢竟對雙方都不好,也浪費彼此的時間. 所以在您聯絡時請詳細說明您的需求及條件 這樣可以更能夠符合您的要求~+ 若臨時有事須取消,也請提前告知! 服務時間:am.13:00-pm.04:00
推薦一個適合偷吃的app噢 1:手機安裝:Telegram 2:設定帳號(用電話號碼綁定接收驗證碼即可) 3:完成帳號設定後搜尋id:@nos998 4:然後密我一下 5:切換中文版Telegram: https://t.me/setlanguage/taiwan 北中南看照選妹影片選妹【 https://t.me/wl9970】 加入頻道看照選妹咯加入的大大儘管放心你們可觀看不可發言相互看不到對方的資料 嘿 建立了色色的+幽默趣圖 有興趣可加哦 【https://t.me/wl9970】
大奶小支馬可愛系列【LINE:fb2238 寧靜 158.D.45kg.19歲 甜美可愛水嫩肌膚 令很多大哥哥為之傾倒! 凱麗 166.H.52kg.28歲 大屁股翹起來給哥哥插 肥美鮑魚餵飽你 熊熊.160.E.46kg.20歲 敏感型.小妹妹緊實蜜多 可以吸舔 茜茜 161.F.47kg.22歲 可愛小隻馬 臉蛋楚楚可人
高挑纖細氣質CP值系列【LINE:fb2238 小汐 168cm.C奶.26歲氣質的外表 凹凸有型的身材脫下衣服 又是另外一種風姿 婉瑜 166cm.B杯.19歲妹妹一邊幫你口交一邊含情脈脈的看著你讓你感受到掌控天下的成就感 千禧 165cm.E奶.24歲妹妹主動淫蕩 欲求不滿 只求被滿足下面很敏感喔 雅心 170cm.D奶.21歲高檔正妹 #採取預約制清純外貿學生 有兼職主播
鄉下少婦知性熟女系列【LINE:fb2238 欣欣 162 C 46 30歲 單親媽媽兼職 賺奶粉錢咯 舒舒 161 E 48 28歲 超大奶姐姐 很騷 尺度大 敢玩 子晴 167 E 50 27歲 便宜大碗耐乾 很騷偷情少婦 小雅 158 C 44 25歲 vip客人約住家的口碑好妹!嬌小羅莉 很性感!
肉肉女重量級豐滿大奶系列【LINE:fb2238 瑞瑞 163.F奶.53.30歲 好大一顆 皮膚白滑摸起來有手感 月月 155.G奶.65.27歲下面緊實 肥美的鮑魚會夾著你不放喔 喵喵 163.H奶.70.23歲 乾淨 青澀 呆萌好控制內裝還是粉嫩嫩滴 小茹 163.F奶.60.30歲 可預約 全程無套 什麼姿勢都ok