SmartWiki开发日记之Laravel缓存扩展

public function register()
{
    //
    Auth::extend('loauth',function($app){});
}

SmartWiki简介请阅读:

折腾了一晚上,最终我把目光锁定在 AuthServiceProvider 的 $defer 属性。

澳门新葡亰赌995577 1澳门新葡亰赌995577 2

寻找原因

Session::extend('MemcachedExtend',function ($app){    $memcached = $this->createMemcached($app);    return new MemcachedSessionHandler($memcached);});
Call to undefined method IlluminateSupportFacadesAuth::extend()
<?php$connect = new Memcached;  //声明一个新的memcached链接$connect->setOption(Memcached::OPT_COMPRESSION, false); //关闭压缩功能$connect->setOption(Memcached::OPT_BINARY_PROTOCOL, true); //使用binary二进制协议$connect->addServer('00000000.ocs.aliyuncs.com', 11211); //添加OCS实例地址及端口号//$connect->setSaslAuthData('aaaaaaaaaa, 'password'); //设置OCS帐号密码进行鉴权,如已开启免密码功能,则无需此步骤$connect->set("hello", "world");echo 'hello: ',$connect->get("hello");print_r( $connect->getVersion;$connect->quit();
public function register()
{
    //
    $authProvider = new IlluminateAuthAuthServiceProvider($this->app);
    $authProvider->register();
    Auth::extend('loauth',function($app){});
}

所有的服务提供者都继承自IlluminateSupportServiceProvider类。大部分服务提供者都包含两个方法:
register 和 boot
。在register方法中,你唯一要做的事情就是绑事物到服务容器,不要尝试在其中注册事件监听器,路由或者任何其它功能。

经过研究,顺利在核心代码中找到证据
IlluminateFoundationProviderRepository

SmartWiki官网:

解决之道

如果需要把Session也储存到我们扩展的缓存中还需要调用Session::extend来扩展我们的Session储存:

虽然发现了问题所在,但并不代表问题就解决了,修改核心代码不是个明智的选择,所以只能在我们自己的包里想办法咯,一个解决方案如下:

SmartWikiCode

这个是 AuthServiceProvider
里的方法,当框架初始化的时候,会依次加载服务提供器,如果发现这个服务提供器protected
$defer=true 那么就会调用它的 provides()
方法,其返回的数组包含需要延迟加载的服务名称,这样当我们在路由、控制器或者其他地方调用
Auth::METHOD() 的时候,才会去调用提供器的 register() 方法。

澳门新葡亰赌995577,阿里云提供的脚本如下:

根据手册以及注释,我们得知 $defer
属性是用来延迟加载该服务提供器,说直白点就是延迟执行 register()
方法,只需要配合provides()方法即可实现。举个例子:

网上有流传的laravel缓存扩展的文章,其中对配置读取在5.2以上版本不适用。

当时就纳闷了,找原因,怀疑是Auth没注册?检查发现注册了,因为在路由中可以使用;php
artisan clear-compiled
没用;百思不得其解,甚至怀疑是我不小心修改了核心类,还重新下载了一次laravel包,问题依旧。

之后再.env中就可以配置我们扩展后的缓存了。完整代码如下:

昨天按照手册教程,动手写一个Auth扩展,按照包独立性的原则,我不希望将Auth::extend()这种方法写在
start.php
中,毫无疑问,我选择了在服务提供器register()方法中注册扩展驱动。然而,事与愿违……

要注册你自己的服务提供者,只需要将其追加到该数组中即可:

public function provides()
{
    return array('auth');
}

所有服务提供者都是通过配置文件config/app.php中进行注册,该文件包含了一个列出所有服务提供者名字的providers数组,默认情况下,其中列出了所有核心服务提供者,这些服务提供者启动Laravel核心组件,比如邮件、队列、缓存等等。

既然auth还未注册,那么我们手动调用它的register方法帮它注册。

很无奈,于是安装阿里云的手册写了一个脚本放到服务器上,结果可以连接,也可以写入。

报错

可以看到laravel的Memcached没有设置setOption方法的选项,仅仅包含最简连接建立,紧接着就调用getVersion来测试是否连通。而阿里云的演示代码是设置了关闭压缩和使用binary二进制协议的选项的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图