亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

深入解析PHP的Laravel框架中的event事件操作

2020-03-22 18:12:57
字體:
來源:轉載
供稿:網友
有時候當我們單純的看 Laravel 手冊的時候會有一些疑惑,比如說系統服務下的授權和事件,這些功能服務的應用場景是什么,其實如果沒有經歷過一定的開發經驗有這些疑惑是很正常的事情,但是當我們在工作中多加思考會發現有時候這些服務其實我們一直都見過。下面就事件、事件監聽舉一個很簡單的例子你就會發現。 這個例子是關于文章的瀏覽數的實現,當用戶查看文章的時候文章的瀏覽數會增加1,用戶查看文章就是一個事件,有了事件,就需要一個事件監聽器,對監聽的事件發生后執行相應的操作(文章瀏覽數加1),其實這種監聽機制在 Laravel 中是通過觀察者模式實現的.注冊事件以及監聽器
首先我們需要在 app/Providers/目錄下的EventServiceProvider.php中注冊事件監聽器映射關系,如下:protected $listen = [ 'App/Events/BlogView' = [ 'App/Listeners/BlogViewListener',然后項目根目錄下執行如下命令php artisan event:generate該命令完成后,會分別自動在 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;html' target='_blank'>class BlogView extends Event use SerializesModels; * Create a new event instance. * @return void public function __construct(Post $post) $this- post = $post; * Get the channels the event should be broadcast on. * @return array public function broadcastOn() return [];其實看到這些你會發現該事件類只是注入了一個 Post實例罷了,并沒有包含多余的邏輯。定義監聽器
事件監聽器在handle方法中接收事件實例,event:generate命令將會自動在handle方法中導入合適的事件類和類型提示事件。在handle方法內,你可以執行任何需要的邏輯以響應事件,我們的代碼實現如下:namespace App/Listeners;use App/Events/BlogView;use Illuminate/Queue/InteractsWithQueue;use Illuminate/Contracts/Queue/ShouldQueue;use Illuminate/Session/Store;class BlogViewListener protected $session; * Create the event listener. * @return void public function __construct(Store $session) $this- session = $session; * Handle the event. * @param BlogView $event * @return void public function handle(BlogView $event) $post = $event- post; //先進行判斷是否已經查看過 if (!$this- hasViewedBlog($post)) { //保存到數據庫 $post- view_cache = $post- view_cache + 1; $post- save(); //看過之后將保存到 Session $this- storeViewedBlog($post); 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- $this- session- put($key, time());注釋中也已經說明了一些邏輯。觸發事件
事件和事件監聽完成后,我們要做的就是實現整個監聽,即觸發用戶打開文章事件在此我們使用和 Event提供的 fire方法,如下:namespace App/Http/Controllers;use Illuminate/Http/Request;use App/Post;use Illuminate/Support/Facades/Event;use App/Http/Requests;use App/Events/BlogView;use App/Http/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 5.1 之中新加入了事件廣播的功能,作用是把服務器中觸發的事件通過websocket服務通知客戶端,也就是瀏覽器,客戶端js根據接受到的事件,做出相應動作。本文會用簡單的代碼展示一個事件廣播的過程。依賴: redis nodejs, socket.io laravel 5.1配置: config/broadcasting.php中,如下配置'default' = env('BROADCAST_DRIVER', 'redis'),,使用redis作為php和js的通信方式。 config/database.php中配置redis的連接。定義一個被廣播的事件:
根據Laravel文檔的說明,想讓事件被廣播,必須讓Event類實現一個Illuminate/Contracts/Broadcasting/ShouldBroadcast接口,并且實現一個方法broadcastOn。broadcastOn返回一個數組,包含了事件發送到的channel(頻道)。如下:namespace App/Events;use App/Events/Event;use Illuminate/Queue/SerializesModels;use Illuminate/Contracts/Broadcasting/ShouldBroadcast;class SomeEvent extends Event implements ShouldBroadcast use SerializesModels; public $user_id; * Create a new event instance. * @return void public function __construct($user_id) $this- user_id = $user_id; * Get the channels the event should be broadcast on. * @return array public function broadcastOn() return ['test-channel'];被廣播的數據:
默認情況下,Event中的所有public屬性都會被序列化后廣播。上面的例子中就是$user_id這個屬性。你也可以使用broadcastWith這個方法,明確的指出要廣播什么數據。例如:public function broadcastWith() return ['user_id' = $this- user_id];Redis和Websocket服務器:
需要啟動一個Redis,事件廣播主要依賴的就是redis的sub/pub功能,具體可以看redis文檔
需要啟動一個websocket服務器來和client通信,建議使用socket.io,代碼如下:
var app = require('http').createServer(handler);var io = require('socket.io')(app);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??蛻舳舜a:
客戶端我們也使用socket.io,作為測試,代碼盡量簡化,僅僅打印一個接受到的數據即可。如下:var socket = io('http://localhost:6001');socket.on('connection', function (data) { console.log(data);socket.on('test-channel:App//Events//SomeEvent', function(message){ console.log(message);console.log(socket);服務器觸發事件:
直接在router中定義個事件觸發即可。如下:Route::get('/event', function(){ Event::fire(new /App/Events/SomeEvent(3)); return "hello world";測試: 啟動redis 啟動websocket 打開帶有客戶端代碼的頁面,可以看到websocket已經連接成功。 觸發事件,打開另一個頁面 localhost/event。這時就可以發現,第一個頁面的console中打印出了Object{user_id: 3},說明廣播成功。PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
69国产精品成人在线播放| 成人激情视频免费在线| 51精品国产黑色丝袜高跟鞋| 亚洲成人久久电影| 成人黄色中文字幕| 北条麻妃99精品青青久久| 欧洲精品毛片网站| 97视频在线观看免费高清完整版在线观看| 日韩精品在线影院| 成人av色在线观看| 国产精品久久久久久久久久东京| 色一情一乱一区二区| 欧洲美女免费图片一区| 欧美性猛交xxxx免费看| 欧美一级大片在线免费观看| 色偷偷亚洲男人天堂| 久久久久在线观看| 欧美怡春院一区二区三区| 不卡av电影在线观看| 国产亚洲欧洲高清一区| 欧美一级电影免费在线观看| 国产精品自拍小视频| 日韩不卡在线观看| 欧美成人免费va影院高清| 另类视频在线观看| 欧美性猛交xxxx乱大交蜜桃| 亚洲黄页网在线观看| 国产欧美一区二区三区久久人妖| 欧美精品一二区| 日韩美女在线看| 久久精品久久久久电影| 亚洲精品理论电影| 国产精品xxx视频| 日韩免费精品视频| 国产精品久久久久久久久男| 一区二区三区精品99久久| 亚洲欧美国产一区二区三区| 欧美野外猛男的大粗鳮| 亚洲欧美一区二区三区在线| 欧美一级视频免费在线观看| 超碰日本道色综合久久综合| 亚洲第一黄色网| 69av在线视频| 91视频九色网站| 久久久欧美一区二区| 国产精品大陆在线观看| 在线成人激情视频| 亚洲一区av在线播放| 黑人巨大精品欧美一区二区一视频| 欧美激情免费视频| 国产精品欧美激情在线播放| 欧美日韩亚洲网| 精品久久久久久中文字幕| 91在线直播亚洲| 69av成年福利视频| 91香蕉嫩草神马影院在线观看| 搡老女人一区二区三区视频tv| 国产日韩av在线| 91精品国产综合久久香蕉| 国产精品日韩专区| 在线视频欧美日韩精品| 欧美专区国产专区| 亚洲精品视频在线播放| 69av在线播放| 国产精品第一页在线| 欧美精品video| 日韩在线观看免费全集电视剧网站| 亚洲精品电影在线| 日韩欧美国产成人| 欧美性xxxx极品hd满灌| 国内成人精品一区| 伊人伊人伊人久久| 欧美亚洲成人xxx| 日韩欧美在线中文字幕| 国产精品扒开腿做爽爽爽的视频| 国产亚洲精品一区二555| 国产精品久久久久久av| 成人h视频在线观看播放| 亚洲欧美中文日韩在线v日本| 日韩久久午夜影院| 成人亚洲综合色就1024| 久热精品视频在线免费观看| 亚洲电影成人av99爱色| 国产自产女人91一区在线观看| 色老头一区二区三区在线观看| www.日韩不卡电影av| 亚洲高清一二三区| 91免费看视频.| 亚洲社区在线观看| 国产成+人+综合+亚洲欧洲| 欧美怡红院视频一区二区三区| 亚洲人成自拍网站| 国产精品91视频| 精品视频一区在线视频| 大荫蒂欧美视频另类xxxx| 色小说视频一区| 亚洲人成电影在线播放| 久久久精品国产| 久久视频国产精品免费视频在线| 97国产真实伦对白精彩视频8| 色综合伊人色综合网| 亚洲国产精品网站| 日韩美女在线观看| 7m第一福利500精品视频| 亚洲一区二区三区乱码aⅴ| 欧美成人性生活| 亚洲一级一级97网| 狠狠久久五月精品中文字幕| 亚洲永久在线观看| 成人黄色生活片| 97免费中文视频在线观看| 久久亚洲私人国产精品va| 国产自产女人91一区在线观看| 亚洲欧美中文日韩在线v日本| 久久精品2019中文字幕| 国产欧美亚洲精品| 欧美大肥婆大肥bbbbb| 欧美国产日韩一区二区在线观看| 最近中文字幕mv在线一区二区三区四区| 国产精品成人av性教育| 7777精品视频| 亚洲经典中文字幕| 亚洲欧美一区二区激情| 国产精品www色诱视频| 91探花福利精品国产自产在线| 久久久www成人免费精品张筱雨| 欧洲成人免费aa| www.欧美精品一二三区| 中文字幕在线亚洲| 日韩精品极品在线观看播放免费视频| 欧美大片免费观看| 狠狠躁18三区二区一区| 久99久在线视频| 4438全国亚洲精品在线观看视频| 国产精品日韩欧美| 91麻豆桃色免费看| 日韩一区二区三区国产| 国产精品久久久久久亚洲调教| 国产成人精品视频在线| 国产视频久久网| 麻豆国产精品va在线观看不卡| 欧美日韩国产中文字幕| 国产精品a久久久久久| 国产精品中文字幕在线| 国产极品jizzhd欧美| 久久精品视频网站| 夜夜狂射影院欧美极品| 中文字幕在线看视频国产欧美在线看完整| 亚洲在线免费视频| 亚洲精品资源在线| 亚洲成人黄色网址| 97精品在线观看| 97香蕉超级碰碰久久免费软件| 国产日韩精品在线播放| 久久91超碰青草是什么| 国产欧美精品一区二区三区-老狼| 蜜臀久久99精品久久久久久宅男| 日韩免费高清在线观看| 国产精品视频自在线| 亚洲性av网站| 亚洲一区二区三区四区视频| 91探花福利精品国产自产在线| 欧美高清视频在线| 欧美午夜精品久久久久久浪潮|