Nasłuchiwanie zdarzeń
Nasłuchiwanie zdarzeń
W obecnym szablonie brakuje nagłowka nawigacyjnego, ktory umożliwi powrot na stronęgłowną滑przejście做kolejnej konferencji。
Dodawanie nagłowka strony
Elementy wyświetlane na wszystkich斯特罗纳克aplikacji,木菠萝nagłowek strony, powinny zostaćzawarte w szablonie bazowym:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
- - - /模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -14 6 + 14,15 @@{% endblock %} < /头> <身体>+ <标题>+ < h1 > < a href = "{{路径(主页)}}" >留言板< / > < / h1 >+ < ul >+{%为会议会议%}+ <李> < a href = "{{路径(“会议”,{id:会议。id})}} " >{{会议}}< / > < /李>+ {% endfor %}+ < / ul >+ <人力资源/ >+ < /头>{%块体%}{% endblock %} < /身体> < / html >
Dodanie迪高kodu做szablonu oznacza,że wszystkie szablony rozszerzające去muszązdefiniowaćzmiennąo nazwie会议
,ktorej wartośćmusi zostaćutworzona我przekazana z poziomu kontrolerow。
Ponieważmamy tylko dwa kontrolery,możeszwykonaćnastępujące czynności (nie stosuj zmiany w kodzie ponieważwkrotce nauczymy sięlepszego sposobu):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -21年12 + 21日13 @@类ConferenceController延伸AbstractController} #(路线(“/会议/ {id}”,名字:“会议”))公共函数显示(请求美元请求、会议会议上,美元CommentRepository CommentRepository美元):反应+公共函数显示(请求美元请求、会议会议上,美元CommentRepository CommentRepository美元,ConferenceRepository ConferenceRepository美元):反应{$抵消= max(0, $请求- >查询- > getInt(“抵消”,0));$ paginator = $ commentRepository - > getCommentPaginator(会议,抵消美元);返回$ this - >渲染(会议/ show.html。嫩枝”,(+“会议”= > $ conferenceRepository - > findAll (),“会议”= > $发布会上,“评论”= > paginator美元,“之前”= >抵消美元- CommentRepository:: PAGINATOR_PER_PAGE,
Wyobraźsobie,że musisz wprowadzićzmianęw dziesiątkach istniejących kontrolerow, także我们wszystkich nowo utworzonych。聂jest zbyt praktyczne, musi istniećlepszy sposob。
树枝pozwala na tworzenie zmiennych globalnych。Zmienna globalnajest dostępna我们wszystkich renderowanych szablonach。Można我zdefiniowaćw pliku konfiguracyjnym,啤酒zadziała tylko w przypadku wartości statycznych。偿przekazaćwszystkie konferencje jako zmiennąglobalnąw树枝,stworzymy nasłuchiwacz zdarzeń(ang。事件监听器)。
Odkrywanie zdarzeńSob娱乐下载ymfony
ob娱乐下载Symfony posiada wbudowany komponent dyspozytora zdarzeń(ang。事件调度器)。Dyspozytor zdarzeńw odpowiednich momentach emituje określonezdarzenia,ktore mogąbyćnasłuchiwane przez nasłuchiwaczy zdarzeń。Nasłuchiwacze zdarzeńumożliwiająw tym przypadku wywołanie kodu w odpowiedzi na zdarzenia wyemitowane przez wewnętrzne mechanizmy frameworka。
Na przykład, niektore zdarzenia pozwalająNa interakcjęz cyklemżyciażądańHTTP。Podczas obsługiżądania dyspozytor zdarzeńemituje zdarzenia, gdyżądanie zostało utworzone, gdy kod kontrolera马zostaćwykonany, gdy odpowiedźjest gotowa wysłania,滑gdy zostałrzucony wyjątek。Nasłuchiwacz zdarzeńmoże oczekiwaćjednego滑kilku zdarzeń我wykonywaćdziałania w oparciu o kontekst przekazany w obiekcie zdarzenia。
Zdarzenia sąelementami frameworka, ktore czynią去łatwo rozszerzalnym我bardziej elastycznym。Wiele komponentow ob娱乐下载Symfony, takich木菠萝安全、信使、工作流czy梅勒,używa我w szerokim zakresie。
Inny przykład użycia wbudowanego我们框架mechanizmu zdarzeń我nasłuchiwaczy zdarzeńpowiązany jest z cyklemżycia poleceń(ang。命令):możesz utworzyćnasłuchiwacz zdarzeń,ktory wykona kod przed uruchomieniemjakiegolwiekpolecenia ob娱乐下载Symfony。
Dowolny rodzaj rozszerzenia,木菠萝paczka滑pakiet、może emitowaćwłasne生长标准的zdarzeń,co czyni jego kodłatwo rozszerzalnym。
偿uniknąćposiadania pliku konfiguracyjnego opisującego zdarzenia, ktorych nasłuchiwacz zdarzeńchce nasłuchiwać,utworzsubskrybenta zdarzeń(ang。事件订阅者)。Subskrybent zdarzeńjest rodzajem nasłuchiwacza zdarzeńposiadającym statycznąmetodęgetSubscribedEvents ()
,ktora zwraca jego konfigurację。Dzięki temu subskrybent może byćautomatycznie zarejestrowany w dyspozytorze zdarzeńSyob娱乐下载mfony。
Implementacja subskrybenta zdarzeń
Znasz jużtęśpiewkęużyj制造商包,赎wygenerowaćsubskrybenta zdarzeń:
1
美元ob娱乐下载symfony控制台:订户TwigEventSubscriber
Polecenie zapyta o, jakich zdarzeńchcesz nasłuchiwać。Wybierz zdarzenie typuob娱乐下载
,ktore jest emitowane tużprzed wykonaniem kodu kontrolera。Jest najlepszy时刻na wstrzyknięcie globalnej zmiennej会议
w塔基•sposob,赎树枝miał做niej dostęp, kiedy kontroler będzie renderowałszablon。Zaktualizuj swojego subskrybenta zdarzeńw następujący sposob:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29
- - - / src / EventSubscriber / TwigEventSubscriber.php+ + + b / src / EventSubscriber / TwigEventSubscriber.php25 @@ @@ 2 14 + 2名称空间的应用程序\ EventSubscriber;+使用App \ Repository \ ConferenceRepository;使用Syob娱乐下载mfony \ \ EventDispatcher \ EventSubscriberInterface组件;使用Syob娱乐下载mfony \组件\ HttpKernel \ \ ControllerEvent事件;+使用树枝\环境;类TwigEventSubscriber实现EventSubscriberInterface {+私人美元树枝;+私人conferenceRepository美元;++公共职能__construct(环境树枝美元,ConferenceRepository ConferenceRepository美元)+ {+ $ this - >枝= $树枝;+ $ this - > conferenceRepository = $ conferenceRepository;+}+公共函数onControllerEvent (ControllerEvent事件美元):空白{- / /…+ $ this - >树枝> addGlobal(“会议”,$ this - > conferenceRepository - > findAll ());}公共静态函数getSubscribedEvents():数组
Teraz możesz dodaćdowolnąliczbękontrolerow: zmienna会议
będzie zawsze dostępna w szablonach树枝。
请注意
W dalszej części książki rozważymy znacznie lepsze我bardziej wydajne rozwiązanie。
Sortowanie konferencji według roku我miasta
Sortowanie listy konferencji według roku ułatwi jej przeglądanie。Moglibyśmy stworzyćwłasnąmetodępobierania我sortowania wszystkich konferencji,啤酒zamiast迪高zastąpimy domyślnąimplementacjęmetodyfindAll ()
我们,赎upewnićsię,że sortowanie będzie użyte wszystkich wymaganych miejscach:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
- - - / src /仓库/ ConferenceRepository.php+ + + b / src /仓库/ ConferenceRepository.php@@ -21年6 + 21日11 @@ ConferenceRepository ServiceEntityRepository扩展父类::__construct(美元注册表、会议::类);}+公共职能findAll():数组+ {将其作为findBy +返回$ this - >([],[“年”= >“ASC”,“城市”= > ' ASC ']);+}+公共函数保存(会议实体美元,美元bool冲洗= false):空白{$ this - > getEntityManager() - >保存(实体);
Na koniec迪高etapu strona aplikacji powinna wyglądaćnastępująco:
Idąc dalej
- Cyklżycia请求-响应w aplikacjach ob娱乐下载Symfony;
- Wbudowane zdarzenia ob娱乐下载Symfony HTTP;
- Wbudowane zdarzenia ob娱乐下载Symfony控制台。