大佬教程收集整理的这篇文章主要介绍了深入解析PHP的Laravel框架中的event事件操作,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过。下面就事件、事件监听举一个很简单的例子你@R_121_10585@。
这个例子是关于文章的浏览数的实现,当用户查看文章的时候文章的浏览数会增加1,用户查看文章就是一个事件,有了事件,就需要一个事件监听器,对监听的事件发生后执行相应的操作(文章浏览数加1),其实这种监听机制在 Laravel 中是通过观察者模式实现的.
然后项目根目录下执行如下命令
该命令完成后,会分别自动在 app/Events和app/Listensers目录下生成 BlogView.php和BlogViewListener.php文件。
定义事件
namespace App\Events;
use App\Events\Event;
use App\Post;
use Illuminate\Queue\serializesModels;
use Illuminate\Contracts\BroadcasTing\ShouldBroadcast;
class BlogView extends Event
{
use serializesModels;
/**
/**
其实看到这些你会发现该事件类只是注入了一个 Post实例罢了,并没有包含多余的逻辑。
namespace App\Listeners;
use App\Events\BlogView;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Session\Store;
class BlogViewListener
{
protected $session;
/**
/**
protected function hasViewedBlog($post)
{
return array_key_exists($post->id,$this->getViewedBlogs());
}
protected function getViewedBlogs()
{
return $this->session->get('viewed_Blogs',[]);
}
protected function storeViewedBlog($post)
{
$key = 'viewed_Blogs.'.$post->id;
$this->session->put($key,time());
}
}
注释中也已经说明了一些逻辑。
namespace App\@R_674_10107@\Controllers;
use Illuminate\@R_674_10107@\request;
use App\Post;
use Illuminate\Support\Facades\Event;
use App\@R_674_10107@\requests;
use App\Events\BlogView;
use App\@R_674_10107@\Controllers\Controller;
class BlogController extends Controller
{
public function showPost($slug)
{
$post = Post::whereSlug($slug)->firstOrFail();
Event::fire(new BlogView($post));
return view('home.blog.content')->withPost($post);
}
}
现在打开页面发现数据库中的`view_cache已经正常加1了,这样整个就完成了。
依赖:
配置:
定义一个被广播的事件: 根据Laravel文档的说明,想让事件被广播,必须让Event类实现一个Illuminate\Contracts\BroadcasTing\ShouldBroadcast接口,并且实现一个方法broadcastOn。broadcastOn返回一个数组,包含了事件发送到的chAnnel(频道)。如下:
use App\Events\Event;
use Illuminate\Queue\serializesModels;
use Illuminate\Contracts\BroadcasTing\ShouldBroadcast;
class SomeEvent extends Event implements ShouldBroadcast
{
use serializesModels;
public $user_id;
/**
/**
被广播的数据: 默认情况下,Event中的所有public属性都会被序列化后广播。上面的例子中就是$user_id这个属性。你也可以使用broadcastWith这个方法,明确的指出要广播什么数据。例如:
redis和Websocket服务器: 需要启动一个redis,事件广播主要依赖的就是redis的sub/pub功能,具体可以看redis文档 需要启动一个websocket服务器来和client通信,建议使用socket.io,代码如下:
var redis = require('ioredis');
var redis = new redis('6379','192.168.1.106');
app.listen(6001,function() {
console.log('Server is running!');
});
function handler(req,res) {
res.writeHead(200);
res.end('');
}
io.on('connection',function(socket) {
console.log('connected');
});
redis.psubscribe('*',function(err,count) {
console.log(count);
});
redis.on('pmessage',function(subscribed,chAnnel,messagE) {
console.log(subscribed);
console.log(chAnnel);
console.log(messagE);
message = JSON.parse(messagE);
io.emit(chAnnel + ':' + message.event,message.data);
});
这里需要注意的是redis.on方法的定义,接收到消息后,给client发送一个事件,事件名称为chAnnel + ':' + message.event。
客户端代码: 客户端我们也使用socket.io,作为测试,代码尽量简化,仅仅打印一个接受到的数据即可。如下:
服务器触发事件: 直接在router中定义个事件触发即可。如下:
测试:
这时就可以发现,第一个页面的console中打印出了Object{user_id: 3},说明广播成功。
以上是大佬教程为你收集整理的深入解析PHP的Laravel框架中的event事件操作全部内容,希望文章能够帮你解决深入解析PHP的Laravel框架中的event事件操作所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。