程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Symfoy2 HttpKernel事件驅動,symfoy2httpkernel

Symfoy2 HttpKernel事件驅動,symfoy2httpkernel

編輯:關於PHP編程

Symfoy2 HttpKernel事件驅動,symfoy2httpkernel


HttpKernel:事件驅動       Symfony2 框架層和應用層的工作都是在 HttpKernel::handle()方法中完成,HttpKernel::handle() 的內部的實現其實是通過調度事件(HttpKernel內的事件監聽器)來完成的,相當於把所有組件都整合成完整的應用。           使用 HttpKernel 很簡單,只需要創建一個 EventDispatcher(事件分發器) 和 controller resolver(Controller解析器),可以實現更多的事件監聽器豐富應用的功能:  kernel.request Event         實現kernel.request事件目的是為了添加更多信息到Request對象,或者得到返回的Response對象(例如:從緩存中獲取又或者security層拒絕訪問)         kernel.request事件是HttpKernel::handle()調度的第一個事件,那麼監聽該事件的多個監聽器就會被執行。 事件的監聽器多種多樣,它們的行為各不相同,例如security監聽器判斷用戶沒有足夠的權限的時候一個RedirectResponse對象,如果當前直接返回Response對象,那麼就會直接執行 kernel.response 事件: 事件的目的要麼就是直接創建和返回Response對象,要麼就是添加更多的信息到Request對象。  

RouterListener是Symfony框架中實現kernel.request事件的最重要監聽器,RouterListener在路由層中執行,返回一個包含符合當前請求的路由信息的數組,例如路由匹配模式裡面的_controller和請求的參數({name})。這些信息都會存放在Request裡的attributes數組裡面,目前只是會添加路由信息到Request對象中還沒有做其它的動作,但是解析Controller的時候會被用到。
        

       2) Resolve the Controller

        假設實現kernel.request事件的時候沒有創建和返回Response對象,那麼下一步就是確定、解析controller和controller需要的參數。controller部分是應用層的最後一個堡壘,負責創建和返回包含一個特定頁面的Response對象。如何確定被請求的controller完全取決於應用程序,這個工作有controller解析器來完成——一個是實現ControllerResolverInterface的類,同時也是HttpKernel構造函數的一個參數。  首先調用controller resolver 的 getController()方法,並向該方法傳入Request對象,controller resolver根據Request包含的信息確定並返回controller。         第二個方法,getArguments()會在kernel.controller事件被調度的時候執行。  

解析Controller
Symfony框架使用內置的ControllerResolver(實質上是使用了一個有額外的功能的子類),該解析器利用了RouterListener保存到Request對象的attributes屬性裡信息來確定controller。
 
getController
ControllerResolver 在Request對象的attributes數組中查找 _controller 鍵(這些信息實際上是由RouterListener存放進Request對象中的):
 
a) 如果_controller 鍵對應AcmeDemoBundle:Default:index 這個格式的值,那麼該值就包含了類名和方法名,可以被Symfony框架解析成為,例如:Acme\DemoBundle\Controller\DefaultController::indexAction,這個轉換是由Symfony框架的特定的ControllerResolver的子類完成的。
 
b) 你的controller類會被實例化,而且該controller類必須包含一個無參的構造函數。
 
c) 如果你的controller還實現了ContainerAwareInterface,那麼setContainer方法就會被調用,container就會被注入到controller中,這個實現也是由Symfony框架的特定的ControllerResolver的子類完成的。
 




上面也有一些其他變化過程,例如你把你的controller配置成為service。
 
      





        3) The kernel.controller Event

        kernel.controller事件是在controller被執行前初始化一些信息或者改變controller對象。

 


        被調用的controller確定之後,HttpKernel::handle()就會調度kernel.controller事件。在系統的某部分被確定後(例如:controller、路由信息等)但是這些部分被執行前,監聽kernel.controller事件的監聽器就會運行了。

 4)獲得controller的參數         getAttributes()方法是返回一個參數數組,這個參數數組會被傳遞給controller,我們也可以自定義該方法,也可以使用Symfony框架內置的。  ControllerResolver使用放射機制獲得被調用的controller的方法的參數列表。遍歷該列表,使用下面的步驟來確定參數列表中一一對應的值:
 
a) 使用參數作為鍵查找Request對象中的attributes數組,如果找到,那麼相應的值會傳入到controller的方法中,例如:controller方法的第一個參數是$name,那麼在Request的attributes數組中包含$attributes['name']的值,那麼$attributes['name']就會被使用。
 
b) 如果該該參數在Symfony配置routing的時候被指定,那麼就會跳過對該參數的查找。
 

        5)調用controller

        這一步,controller就會被執行。         controller會創建包含特定頁面或者json的Response對象,這也是應用層的最後一個步驟。    Symfony框架中沒有缺省的監聽器實現kernel.view事件,可是,有一個核心Bundle——SensioFrameworkExtraBundle裡有個監聽改事件的監聽器。如果你的controller返回一個數組,並且在controller類的頂部有@Template的注解,那麼該監聽器就會渲染一個模板,把controller返回的數組傳入到模板中,最後利用模板返回的內容創建一個Response對象,並返回該Response對象。   除此之外,FOSRestBundle也實現了監聽該事件的監聽器,a listener on this event which aims to give you a robust view layer capable of using a single controller to return many different content-type responses (e.g. HTML, JSON, XML, etc).             7) kernel.response 事件       在發送Response對象到客戶端前修改它。                 kernel的目的是把Request對象轉換成為Response對象。Response對象可能是在kernel.request事件中創建,可能是由controller返回,又或者是由監聽kernel.view事件的監聽器返回。         不管是在哪一個環節創建Response對象,最後kernel.response事件都會被觸發。監聽kernel.response事件的監聽器都會以某種方式修改Response對象,例如:修改Response的header部分,修改cookie,或者甚至會修改Response對象返回的內容(注入javascript到</body>標簽前等等)          kernel.response事件完成後,HttpKernel::handle()返回最終的Response對象,調用Response::send()箱客戶端發送headers頭部和Response實體。  
Symfony框架實現kernel.response事件
 
Symfony框架內置幾個監聽器監聽kernel.response事件,更多的可以通過開發者社區獲得。例如:在dev開發環境下WebDebugToolbarListener向頁面的底部注入javascript代碼,debug工具條就會顯示出來。還有另一個監聽器,ContextListener序列化當前用戶的信息保存到session中,下一次請求的時候直接在session中重載用戶信息。

   

        8) kernel.terminate事件

      監聽該事件的監聽器通常都是處理一些耗時的後台程序。           HttpKernel進程的最後一個事件是kernel.terminate事件,而且該事件的觸發是在HttpKernel::handle()方法之後,並且響應的內容已經發送給用戶。  Symfony框架一個完整的工作流程           使用HttpKernel組件的時候,我們不需要實現任何監聽器添加到內核事件中,也不需要實現controller resolver。HTTp組件自帶的監聽器和controller resolver就能夠正常工作了:   子請求           除了把“main request”傳入到HttpKernel::handle之外,還可以把所謂的“sub request”傳入HttpKernel::handle中。子請求看起來和其它的請求差不多,不同的是,一般的請求是渲染完整的一個頁面,而子請求渲染的是一個頁面的一部分。通常我們都是在controller裡面創建一個子請求(或者在模板裡面創建)。           HttpKernel::handle方法運行子請求的時候,需要修改第二個參數的值:         子請求也是創建一個完整的請求——響應周期。唯一不同的是,有些監聽器可能只會在“main request”中運行(security)。KernelEvent的子類傳遞給監聽器,監聽器通過KernelEvent::getRequestType()判斷當前請求是“main request”還是“sub request”。         例如一個監聽器只會在“main request”的請求下才會執行:  

 


linux24 and linux26 的kernel有什不同?大概是加了一些驅動?裡面有所有硬件的驅動?例如USB

你不知道這些不是你的錯,你錯就錯在總是想等別人給你端現成的。自己去尋找答案吧!~慢慢找 這樣你才能成長。別再浪費時間提這些毫無意義的問題了。
 

聯想G450,新裝了win81,驅動用驅動人生裝的,經常出現自動重啟的現象,查看一下事件是kernel-power

尊敬的聯想用戶您好!
這是本身文件缺失或不完整或者是和其他軟件沖突造成的。
建議您到官網下載顯卡驅動,鏈接:
support1.lenovo.com.cn/lenovo/wsi/Modules/Drive.aspx
建議您在卸載前先到控制面板-設備管理器處卸載對應的驅動,然後開機按F8進入安全模式進行安裝。
無效可以嘗試win+r,輸入msconfig,關閉啟動項來排查沖突的軟件程序。
或者是輸入cmd,命令提示符下輸入sfc/scannow修復系統文件。
問題仍得不到解決,建議您重裝系統。
更多問題您可以咨詢
idea論壇:lenovobbs.lenovo.com.cn/...ureply
Think論壇:thinkbbs.lenovo.com.cn/...ureply
聯想樂社區:bbs.lenovomobile.com/...ureply
期待您滿意的評價,感謝您對聯想的支持,祝您生活愉快!
聯想企業平台 [官方認證]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved