Commit 60306679 by Borales

[Uk] Guide corrections [skip ci]

parent 874c6331
......@@ -49,7 +49,7 @@ All Rights Reserved.
* [Огляд](runtime-overview.md)
* [Bootstrapping](runtime-bootstrapping.md)
* [Роутінг та створення URL](runtime-routing.md)
* [Маршрутизація та створення URL](runtime-routing.md)
* [Запити](runtime-requests.md)
* [Відповіді](runtime-responses.md)
* [Сесії та кукі](runtime-sessions-cookies.md)
......@@ -112,7 +112,7 @@ All Rights Reserved.
* [Авторизація](security-authorization.md)
* [Робота з паролями](security-passwords.md)
* **TBD** [Клієнти авторизації](security-auth-clients.md)
* **TBD** [Кращі практики](security-best-practices.md)
* [Кращі практики](security-best-practices.md)
Кешування
......@@ -131,7 +131,7 @@ RESTful веб-сервіси
* [Швидкий старт](rest-quick-start.md)
* [Ресурси](rest-resources.md)
* [Контролери](rest-controllers.md)
* [Роутінг](rest-routing.md)
* [Маршрутизація](rest-routing.md)
* [Форматування відповіді](rest-response-formatting.md)
* [Аутентифікація](rest-authentication.md)
* [Обмеження частоти запитів](rest-rate-limiting.md)
......@@ -193,7 +193,7 @@ RESTful веб-сервіси
* [Огляд](helper-overview.md)
* [ArrayHelper](helper-array.md)
* **TBD** [Html](helper-html.md)
* [Html](helper-html.md)
* [Url](helper-url.md)
* **TBD** [Security](helper-security.md)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
<!--Created by yEd 3.13-->
<key for="graphml" id="d0" yfiles.type="resources"/>
<key for="port" id="d1" yfiles.type="portgraphics"/>
<key for="port" id="d2" yfiles.type="portgeometry"/>
<key for="port" id="d3" yfiles.type="portuserdata"/>
<key attr.name="url" attr.type="string" for="node" id="d4"/>
<key attr.name="description" attr.type="string" for="node" id="d5"/>
<key for="node" id="d6" yfiles.type="nodegraphics"/>
<key attr.name="Description" attr.type="string" for="graph" id="d7"/>
<key attr.name="url" attr.type="string" for="edge" id="d8"/>
<key attr.name="description" attr.type="string" for="edge" id="d9"/>
<key for="edge" id="d10" yfiles.type="edgegraphics"/>
<graph edgedefault="directed" id="G">
<data key="d7"/>
<node id="n0" yfiles.foldertype="group">
<data key="d4"/>
<data key="d6">
<y:ProxyAutoBoundsNode>
<y:Realizers active="0">
<y:GroupNode>
<y:Geometry height="570.7368214925131" width="763.2772213171534" x="-1269.9373595143054" y="-206.46394602457679"/>
<y:Fill color="#FFCC0024" transparent="false"/>
<y:BorderStyle hasColor="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FFCC00" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="763.2772213171534" x="0.0" y="0.0">Вхідний скрипт (index.php або yii)</y:NodeLabel>
<y:Shape type="rectangle"/>
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
</y:GroupNode>
<y:GroupNode>
<y:Geometry height="50.0" width="50.0" x="313.2978515625" y="225.33495140075684"/>
<y:Fill color="#F5F5F5" transparent="false"/>
<y:BorderStyle color="#000000" type="dashed" width="1.0"/>
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 4</y:NodeLabel>
<y:Shape type="roundrectangle"/>
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
</y:GroupNode>
</y:Realizers>
</y:ProxyAutoBoundsNode>
</data>
<graph edgedefault="directed" id="n0:">
<node id="n0::n0">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="324.9258883570935" x="-1249.511914911339" y="-169.79793039957679"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="219.583984375" x="52.67095199104665" y="5.93359375">Завантаження конфігурації додатка<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n1" yfiles.foldertype="group">
<data key="d4"/>
<data key="d6">
<y:ProxyAutoBoundsNode>
<y:Realizers active="0">
<y:GroupNode>
<y:Geometry height="308.66601562499994" width="330.35133296005984" x="-1254.9373595143054" y="35.983324686686274"/>
<y:Fill color="#FFEFD6" transparent="false"/>
<y:BorderStyle hasColor="false" type="dashed" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FF9900" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="330.35133296005984" x="0.0" y="0.0">Створення екземпляру додатка</y:NodeLabel>
<y:Shape type="roundrectangle"/>
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
<y:BorderInsets bottom="19" bottomF="19.15489692687993" left="5" leftF="5.425444602966309" right="0" rightF="0.0" top="0" topF="0.0"/>
</y:GroupNode>
<y:GroupNode>
<y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
<y:Fill color="#F5F5F5" transparent="false"/>
<y:BorderStyle color="#000000" type="dashed" width="1.0"/>
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 5</y:NodeLabel>
<y:Shape type="roundrectangle"/>
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
</y:GroupNode>
</y:Realizers>
</y:ProxyAutoBoundsNode>
</data>
<graph edgedefault="directed" id="n0::n1:">
<node id="n0::n1::n0">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="294.92588835709347" x="-1234.511914911339" y="72.64934031168627"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="49.814453125" x="122.55571761604665" y="5.93359375">preInit()<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n1::n1">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="294.92588835709347" x="-1234.511914911339" y="122.64524027506516"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="192.185546875" x="51.37017074104665" y="5.93359375">Реєстрація обробника помилок<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n1::n2">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="294.92588835709347" x="-1234.511914911339" y="174.96110788981125"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="226.3515625" x="34.28716292854665" y="5.93359375">Налаштування властивостей додатка<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n1::n3">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="294.92588835709347" x="-1234.511914911339" y="226.56779181162517"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="30.677734375" x="132.12407699104665" y="5.93359375">init()<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n1::n4">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="294.9258883570935" x="-1234.511914911339" y="280.4944433848063"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="68.283203125" x="113.32134261604665" y="5.93359375">bootstrap()<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
</graph>
</node>
<node id="n0::n2" yfiles.foldertype="group">
<data key="d4"/>
<data key="d6">
<y:ProxyAutoBoundsNode>
<y:Realizers active="0">
<y:GroupNode>
<y:Geometry height="410.9838918050131" width="324.9258883570935" x="-846.5860265542456" y="-169.08748118082679"/>
<y:Fill color="#FFEFD6" transparent="false"/>
<y:BorderStyle hasColor="false" type="dashed" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FF9900" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="324.9258883570935" x="0.0" y="0.0">Виконання додатка</y:NodeLabel>
<y:Shape type="roundrectangle"/>
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="1.1368683772161603E-13"/>
</y:GroupNode>
<y:GroupNode>
<y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
<y:Fill color="#F5F5F5" transparent="false"/>
<y:BorderStyle color="#000000" type="dashed" width="1.0"/>
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 3</y:NodeLabel>
<y:Shape type="roundrectangle"/>
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
</y:GroupNode>
</y:Realizers>
</y:ProxyAutoBoundsNode>
</data>
<graph edgedefault="directed" id="n0::n2:">
<node id="n0::n2::n0">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="294.9258883570935" x="-831.5860265542456" y="-132.42146555582667"/>
<y:Fill color="#99CC00" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="148.84375" x="73.04106917854676" y="5.93359375">EVENT_BEFORE_REQUEST<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n2::n1" yfiles.foldertype="group">
<data key="d4"/>
<data key="d6">
<y:ProxyAutoBoundsNode>
<y:Realizers active="0">
<y:GroupNode>
<y:Geometry height="203.666015625" width="294.9258883570935" x="-831.5860265542456" y="-78.08748118082679"/>
<y:Fill color="#99336635" transparent="false"/>
<y:BorderStyle hasColor="false" type="dashed" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#993366" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#FFFFFF" visible="true" width="294.9258883570935" x="0.0" y="0.0">Обробка запиту</y:NodeLabel>
<y:Shape type="roundrectangle"/>
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
<y:BorderInsets bottom="8" bottomF="7.929194132486941" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
</y:GroupNode>
<y:GroupNode>
<y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
<y:Fill color="#F5F5F5" transparent="false"/>
<y:BorderStyle color="#000000" type="dashed" width="1.0"/>
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 4</y:NodeLabel>
<y:Shape type="roundrectangle"/>
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
</y:GroupNode>
</y:Realizers>
</y:ProxyAutoBoundsNode>
</data>
<graph edgedefault="directed" id="n0::n2::n1:">
<node id="n0::n2::n1::n0">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="264.9258883570935" x="-816.5860265542456" y="-41.421465555826785"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="199.9375" x="32.49419417854676" y="5.93359375">Запит -&gt; маршрут та параметри<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n2::n1::n1">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="264.9258883570935" x="-816.5860265542456" y="18.578534444173215"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="228.267578125" x="18.329155116046763" y="5.93359375">Створення модуля, контролера та дії<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n2::n1::n2">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="264.9258883570935" x="-816.5860265542456" y="72.64934031168627"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="86.78125" x="89.07231917854676" y="5.93359375">Виконання дії<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
</graph>
</node>
<node id="n0::n2::n2">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="294.9258883570935" x="-831.5860265542456" y="149.20206960042316"/>
<y:Fill color="#99CC00" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="141.982421875" x="76.47173324104676" y="5.93359375">EVENT_AFTER_REQUEST<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n2::n3">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="294.92588835709347" x="-831.5860265542456" y="196.89641062418633"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="263.611328125" x="15.657280116046763" y="5.93359375">Відправка відповіді кінцевому користувачу<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
</graph>
</node>
<node id="n0::n3">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="324.9258883570935" x="-846.5860265542456" y="319.2728754679363"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="173.9921875" x="75.46685042854676" y="5.93359375">Завершення обробки запиту<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
</graph>
</node>
<edge id="e0" source="n0" target="n0::n1">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="-179.83580569315376" sy="-180.3944529152355" tx="-13.869777491410105" ty="-154.8008369539754"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e0" source="n0::n0" target="n0::n1">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:EdgeLabel alignment="center" backgroundColor="#99CCFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="120.455078125" x="-137.9645704847153" y="78.82421875000006">Масив конфігурації<y:LabelModel>
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="77.04379339868619" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
</y:ModelParameter>
<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::n1::e0" source="n0::n1::n0" target="n0::n1::n1">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::n1::e1" source="n0::n1::n1" target="n0::n1::n2">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::n1::e2" source="n0::n1::n2" target="n0::n1::n3">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::n1::e3" source="n0::n1::n3" target="n0::n1::n4">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e1" source="n0::n1" target="n0::n2">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="2.8060680342755404" sy="-48.37646484374994" tx="-162.49660512430125" ty="105.53540293375653"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::n2::e0" source="n0::n2::n0" target="n0::n2::n1">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::n2::n1::e0" source="n0::n2::n1::n0" target="n0::n2::n1::n1">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::n2::n1::e1" source="n0::n2::n1::n1" target="n0::n2::n1::n2">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::n2::e1" source="n0::n2::n1" target="n0::n2::n2">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::n2::e2" source="n0::n2::n2" target="n0::n2::n3">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e2" source="n0::n2" target="n0::n3">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/>
<y:EdgeLabel alignment="center" backgroundColor="#99CCFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="64.90234375" x="-96.45114634054266" y="28.626707953545406">Exit status<y:LabelModel>
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="63.99999999999999" distanceToCenter="true" position="right" ratio="0.47945569632951074" segment="-1"/>
</y:ModelParameter>
<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
</graph>
<data key="d0">
<y:Resources/>
</data>
</graphml>
......@@ -2,120 +2,149 @@
================
Ви можете встановити Yii двома шляхами: використовуючи [Composer](http://getcomposer.org/) або завантаживши архів.
Перший варіант бажаніший тому, що дозволить встановити всі нові [розширення](structure-extensions.md)
Перший варіант э бажанішим, тому що дозволить встановити всі нові [розширення](structure-extensions.md)
або оновити Yii однією командою.
> Примітка: На відміну від Yii 1, після стандартного встановлення Yii 2 ми отримуємо як фреймворк, так і шаблон додатка.
Встановлення за допомогою Composer <a name="installing-via-composer"></a>
----------------------------------
Якщо Composer все ще не встановлено, то це можна зробити за допомогою інструкції на [getcomposer.org](https://getcomposer.org/download/), або одним із перерахованих способів:
Якщо у вас все ще не вставновлено Composer, то це можна зробити за допомогою інструкції на [getcomposer.org](https://getcomposer.org/download/).
Користувачам Linux та Mac OS X потрібно виконати наступні команди:
* на Linux або Mac, використовуйте наступну команду:
curl -s http://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```
curl -s http://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```
* на Windows, завантажте і запустіть [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe).
При роботі з Windows, необхідно завантажити та запустити [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe).
В разі наявності проблем або якщо вам необхідна додаткова інформація, зверніться до [документації Composer](https://getcomposer.org/doc/) .
В разі наявності проблем або якщо вам необхідна додаткова інформація, зверніться до [документації Composer](https://getcomposer.org/doc/).
Після встановлення Composer встановити Yii можна виконавши наступну команду з директорії, яка доступна через Web:
Якщо ж Composer вже було встановлено раніше, переконайтесь, що використовуюєте його останню версію.
Ви можете оновити Composer простою командою `composer self-update`.
```
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
```
Після встановлення Composer, встановити Yii можна виконавши наступну команду з директорії, яка доступна через Web:
Composer встановить Yii (базовий додаток basic) в директорію `basic`.
composer global require "fxp/composer-asset-plugin:1.0.0-beta4"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
> **Підказка**: Якщо хочете встановити останню нестабільну версію Yii, ви можете добавити ключ `stability`:
```
composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
```
Варто замітити, що нестабільну версію Yii неможна використовувати на робочому сервері.
Перша команда встановить [плагін ресурсів composer (composer-asset-plugin)](https://github.com/francoispluchino/composer-asset-plugin/),
що дозволить керувати залежностями пакетів Bower та NPM за допомогою Composer. Цю команду потрібно виконати лише один раз.
Друга команда встановить Yii у директорію під назвою `basic`. За бажанням, ви можете обрати іншу директорію.
> Примітка: Під час встановлення може статися так, що Composer запитає облікові дані від вашого профілю на Github,
> через встановлені обмеження запитів Github API. Це є нормальним, оскільки Composer повинен отримати багато інформації
> для всіх пакетів із Github. Надання облікових даних профіля Github збільшить кількість запитів до API, потрібних для
> подальшої роботи Composer. Для більш детальної інформації, будь ласка, зверніться до
> [документації Composer](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens).
> Підказка: Якщо ви хочете встановити останню нестабільну версію Yii, ви можете виконати наступну команду,
> яка додає опцію [stability](https://getcomposer.org/doc/04-schema.md#minimum-stability):
>
> composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
>
> Варто зауважити, що нестабільну версію Yii не можна використовувати на робочому сервері, оскільки вона може порушити
> виконання робочого коду.
Встановлення з архіву <a name="installing-from-archive-file"></a>
-------------------------------
---------------------
Встановлення Yii з архіву складається з двох кроків:
Встановлення Yii з архіву складається з трьох кроків:
1. Завантажте архів за адресою [yiiframework.com](http://www.yiiframework.com/download/yii2-basic);
1. Завантажте архів за адресою [yiiframework.com](http://www.yiiframework.com/download/);
2. Розпакуйте архів в директорію, доступну через Web.
3. Відредагуйте файл конфігурації `config/web.php` - необхідно заповнити секретний ключ до пункту `cookieValidationKey`
(це виконуєтся автоматично при вставленні Yii через Composer):
```php
// !!! встановити секретний ключ до наступного пункту (якщо порожній) - це необхідно для валідації кукі
'cookieValidationKey' => 'enter your secret key here',
```
Інші параметри встановлення <a name="other-installation-options"></a>
--------------------------
---------------------------
Вище наведені інструкції по встановленню Yii у вигляді базового додатку готового до роботи.
Вище наведені інструкції по встановленню Yii, які також створюють базовий веб-додаток, готового до роботи.
Це відмінний варіант для невеликих проектів або для тих, хто тільки розпочинає вивчати Yii.
Є два основних варіанта данного встановлення:
Але є ще й інші варіанти встановлення:
* Якщо вам потрібен тільки один фреймворк і ви хотіли б створити додаток з нуля, використовуйте інструкцію, яка описана у розділі «[Створення додатка з нуля](tutorial-start-from-scratch.md)».
* Якщо вам потрібен тільки один фреймворк і ви хотіли б створити додаток з нуля, використовуйте інструкцію,
що описана у розділі [Створення додатка з нуля](tutorial-start-from-scratch.md).
* Якщо хочете розпочати з більш насиченого додатка, який добре підходить для роботи в команді, використовуйте
[шаблон додатка advanced](tutorial-advanced-app.md).
[разширений шаблон додатка](tutorial-advanced-app.md).
Перевірка встановлення <a name="verifying-installation"></a>
----------------------
Якщо ви встановили додаток в теку `basic` базової директорії вашого веб сервера і ім’я сервера `hostname`,
запустити додаток можна відкривши наступний URL через браузер:
Після встановлення, ви можете перевірити за допомогою браузера свій встановлений додаток Yii за наступним URL:
```
http://hostname/basic/web/index.php
http://localhost/basic/web/index.php
```
![Успішно встановленний Yii](../guide/images/start-app-installed.png)
Даний URL передбачає встановлення додатка в директорію `basic` базової директорії вашого локального веб-сервера (`localhost`).
Можливо вам знадобиться підкорегувати налаштування свого сервера.
![Успішно встановленний Yii](images/start-app-installed.png)
Ви повинні побачити сторінку привітання «Congratulations!». Якщо ні — провірте вимоги Yii одним із способів:
Ви повинні побачити сторінку браузера із привітанням "Congratulations!". Якщо ні — провірте, чи задовільняють
налаштування PHP вимогам Yii одним із способів:
* Браузером перейдіть на адресу `http://hostname/basic/requirements.php`
* Або виконайте команду в консолі:
* Браузером перейдіть на URL `http://localhost/basic/requirements.php`
* Або виконайте наступні команди в консолі:
```
cd basic
php requirements.php
```
Для коректної роботи фреймворка вам необхідно мати PHP, який відповідає його мінімальним вимогам. Основна вимога — PHP версії 5.4 и вище. Якщо ваш додаток працює з базою даних, необхідно встановити
[розширення PHP PDO](http://www.php.net/manual/ru/pdo.installation.php) і відповідний драйвер
Для коректної роботи фреймворка вам необхідно мати PHP, який відповідає його мінімальним вимогам.
Основна вимога — PHP версії 5.4 або вище. Якщо ваш додаток працює з базою даних, необхідно встановити
[розширення PHP PDO](http://www.php.net/manual/en/pdo.installation.php) та відповідний драйвер
(наприклад, `pdo_mysql` для MySQL).
Налаштування веб сервера <a name="configuring-web-servers"></a>
-----------------------
Налаштування веб серверів <a name="configuring-web-servers"></a>
-------------------------
> Інформація: можете пропустити даний підрозділ, якщо ви тільки розпочали знайомитися з фреймворком і не розгортаєте його на робочому сервері.
> Інформація: можете пропустити даний підрозділ, якщо ви тільки розпочали знайомитися з фреймворком
і не розгортаєте його на робочому сервері.
Додаток, встановлений за інструкціями, наведеними вище, буде працювати зразу як з [Apache](http://httpd.apache.org/),
так і з [Nginx](http://nginx.org/) під Windows і Linux.
Додаток, встановлений за інструкціями, наведеними вище, буде працювати одразу як з [Apache HTTP server](http://httpd.apache.org/),
так і з [Nginx HTTP server](http://nginx.org/) під Windows, Mac OS X чи Linux із встановленим PHP 5.4 або вище.
Yii 2.0 також сумісний із віртуальною машиною [HHVM](http://hhvm.com/) фейсбука, однак є деякі крайні випадки,
де HHVM поводиться інакше, ніж рідний PHP, тому ви повинні бути дуже уважними при використанні HHVM.
На рабочому сервері вам напевно захочеться змінити URL додатку з `http://hostname/basic/web/index.php`
на `http://hostname/index.php`. Для цього необхідно змінити кореневу директорію в налаштуваннях веб сервера так, щоб ті
вказували на `basic/web`. Додатково можно сховати `index.php` відповідно описанню в розділі «[Розбір і генерація URL](runtime-url-handling.md)».
Далі буде показано як налаштувати Apache і Nginx.
На рабочому сервері вам напевно захочеться змінити URL додатку з `http://www.example.com/basic/web/index.php`
на `http://www.example.com/index.php`. Для цього необхідно змінити кореневу директорію в налаштуваннях веб сервера на `basic/web`.
Додатково можно сховати `index.php` із URL, як це описано у розділі [Маршрутизація та створення URL](runtime-routing.md).
Далі буде показано як налаштувати Apache і Nginx для цих цілей.
> Інформація: Встанновлюючи `basic/web` кореневою директорією веб сервера ви захищаете від небажаного доступа код і дані, які знаходяться на одному рівні з `basic/web`. Це робить додаток більш захищенним.
> Інформація: Встанновлюючи `basic/web` кореневою директорією веб-сервера, ви забороняєте кінцевим користувачам доступ
до приватного коду додатка та важливим даним, які знаходяться на одному рівні з `basic/web`. Це робить додаток більш захищенним.
> Інформація: Якщо додаток працює на хостингу, де немає доступу до налаштувань сервера, то можна змінити структуру додатка, як описано в розділі «[Робота на Shared хостингу](tutorial-shared-hosting.md)».
> Інформація: Якщо додаток працює на хостингу, де немає доступу до налаштувань сервера, ви всеодно можете змінити структуру
додатка для покращення безпеки, як описано в розділі [Робота на shared хостингу](tutorial-shared-hosting.md).
### Рекомендовані налаштування Apache <a name="recommended-apache-configuration"></a>
Добавте наступне в `httpd.conf` Apache або в конфігураційний файл віртуального хоста. Не забудьте замінити
`path/to/basic/web` на коректний шлях до `basic/web`.
Додайте наступний код до файлу конфігурации Apache `httpd.conf` або в конфігураційний файл віртуального хоста.
Не забудьте замінити `path/to/basic/web` на коректний шлях до `basic/web`.
```
# Встановлюємо кореневою директорією "basic/web"
DocumentRoot "path/to/basic/web"
<Directory "path/to/basic/web">
# використаємо mod_rewrite для підтримки гарних URL
RewriteEngine on
# Якщо запитувана в URL директорія або файл відсутні звертаємось до них напряму
# Якщо запитуваний файл або директорія існують - звертаємось до них напряму
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Якщо ні - перенаправляємо запит на index.php
......@@ -128,8 +157,9 @@ DocumentRoot "path/to/basic/web"
### Рекомендовані налаштування Nginx <a name="recommended-nginx-configuration"></a>
PHP повинен бути встановлений як [FPM SAPI](http://php.net/manual/ru/install.fpm.php) для [Nginx](http://wiki.nginx.org/).
Використовуйте наступні параметри Nginx і не забудьте замінити `path/to/basic/web` на коректний шлях до `basic/web`.
Для використання [Nginx](http://wiki.nginx.org/) вам потрібно встановити PHP як [FPM SAPI](http://php.net/install.fpm).
Використовуйте наступні параметри Nginx, замінивши `path/to/basic/web` на коректний шлях до `basic/web`,
а `mysite.local` на бажаний домен.
```
server {
......@@ -137,21 +167,21 @@ server {
client_max_body_size 128M;
listen 80; ## listen for ipv4
#listen [::]:80 default_server ipv6only=on; ## слухаєм ipv6
#listen [::]:80 default_server ipv6only=on; ## слухаємо ipv6
server_name mysite.local;
root /path/to/basic/web;
index index.php;
access_log /path/to/project/log/access.log main;
error_log /path/to/project/log/error.log;
access_log /path/to/basic/log/access.log main;
error_log /path/to/basic/log/error.log;
location / {
# Перенаправляємо всі запити до неіснуючих директорій або файлів на index.php
# Перенаправляємо всі запити від неіснуючих директорій або файлів на index.php
try_files $uri $uri/ /index.php?$args;
}
# розкоментуйте строки нище для запобігання обробки Yii звернень до неіснуючих статичних файлів
# розкоментуйте строки нижче для запобігання обробки звернень Yii до неіснуючих статичних файлів
#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
# try_files $uri =404;
#}
......@@ -161,6 +191,7 @@ server {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
try_files $uri =404;
}
location ~ /\.(ht|svn|git) {
......@@ -169,7 +200,7 @@ server {
}
```
Використовуючи дану конфігурацію встановіть `cgi.fix_pathinfo=0` в `php.ini` щоб запобігти зайвим системним визовам `stat()`.
Використовуючи дану конфігурацію встановіть `cgi.fix_pathinfo=0` в `php.ini`, щоб запобігти зайвим системним викликам `stat()`.
Врахуйте також, що при використанні HTTPS необхідно задавати `fastcgi_param HTTPS on;` щоб Yii міг корректно оприділяти захищене
з’єднання.
Врахуйте також, що при використанні HTTPS необхідно задавати `fastcgi_param HTTPS on;` щоб Yii міг корректно
визначати захищене з’єднання.
Компоненти додатка
=====================
==================
Додатки є [сервіс локаторами](concept-service-locators.md). Вони зберігають багато так званих
*компонентів додатку*, які надають різноманітні інструменти для опрацювання запитів. Наприклад,
компоненти `urlManager` відповідає за маршрутизацію веб запитів до потрібного контролера; компонент `db` надає інструменти для работи з базою даних; і т. д.
*компонентів додатку*, які надають різноманітні інструменти для обробки запитів. Наприклад,
компонент `urlManager` відповідає за маршрутизацію веб запитів до потрібного контролера;
компонент `db` надає інструменти для работи з базою даних; і т. д.
Кожний компонент додатка має свій унікальний ID, який дозволяє ідентифікувати його серед інших різноманітних компонентів
в одному і тому ж додатку. Ви можете отримати доступ до компонента наступним чином:
```php
\Yii::$app->ComponentID
\Yii::$app->componentID
```
Наприклад, ви можете використовувати `\Yii::$app->db` для отримання [[yii\db\Connection|з’єднання з БД]],
і `\Yii::$app->cache` для отримання доступу до основного компонента [[yii\caching\Cache|кеша]], зареєстрованого в додатку.
Компонентами додатку можуть бути любі об’єкти. Ви можете зареєструвати їх з допомогою властивості [[yii\base\Application::components]] в [конфігурації](structure-applications.md#application-configurations) додатка.
Компонент додатка створюється при першому звертанні через попередній вираз.
Будь-які подальші звертання будуть повертати той же примірник компонента.
Компонентами додатку можуть бути будь-які об’єкти. Ви можете зареєструвати їх за допомогою властивості
[[yii\base\Application::components]] в [конфігурації](structure-applications.md#application-configurations) додатка.
Наприклад,
```php
[
'components' => [
// реєстрація "cache" компонента з допомогою назви класу
// реєстрація "cache" компонента за допомогою назви класу
'cache' => 'yii\caching\ApcCache',
// реєстрація "db" компонента з допомогою масива конфігурації
// реєстрація "db" компонента за допомогою масива конфігурації
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo',
......@@ -32,7 +37,7 @@
'password' => '',
],
// реєстрація "search" компонента з допомогою анонімної функції
// реєстрація "search" компонента за допомогою анонімної функції
'search' => function () {
return new app\components\SolrService;
},
......@@ -41,47 +46,74 @@
```
> Інформація: Хоча ви можете зареєструвати стільки компонентів в додатку скільки вам потрібно,
все ж таки варто робити це осмислено. Компоненти додатку схожі на глобальні змінні. Використання дуже великої кількості компонетів додатку може потенційно зробити ваш код складним для розробки і тестування.
В більшості випадків ви можете просто створити локальний компонент і використовувати його при необхідності.
все ж таки варто робити це осмислено. Компоненти додатку схожі на глобальні змінні.
Використання дуже великої кількості компонетів додатку може потенційно зробити ваш код складним для розробки і тестування.
У більшості випадків ви можете просто створити локальний компонент і використовувати його при необхідності.
## Попереднє завантаження компонентів <a name="bootstrapping-components"></a>
Як згадувалося вище, компонент додатка буде створено при першому звертанні.
Якщо до нього не буде зроблено звертань під час запиту - його взагалі не буде створено.
Однак іноді, ви можете створити екземпляр компонента додатка для кожного запиту, навіть якщо до нього не зверталися явно.
Щоб зробити це, ви можете додати ідентифікатор до властивості [[yii\base\Application::bootstrap|bootstrap]] додатка.
Наприклад, наступна конфігурація додатка завжди гарантує створення компонента `log`:
```php
[
'bootstrap' => [
'log',
],
'components' => [
'log' => [
// конфігурація для компонента "log"
],
],
]
```
## Вбудовані компоненти додатку <a name="core-application-components"></a>
В Yii є декілька *вбудованих* компонентів додатку, з фіксованими ID і конфігураціями за замовчуванням. Наприклад,
компонент [[yii\web\Application::request|request]] використовується для отримання інформації про запит користувача і розбору його в
певний [маршрут](runtime-routing.md); компонент [[yii\base\Application::db|db]] являє собою з’єднання з базою даних,
через яке ви можете виконувати запити. Саме з допомогою цих вбудованих компонентів Yii додатки можуть обрабляти
запит користувача.
В Yii є декілька *вбудованих* компонентів додатку із фіксованими ID та конфігураціями за замовчуванням.
Наприклад, компонент [[yii\web\Application::request|request]] використовується для збору інформації про запит
користувача і розбору його у певний [маршрут](runtime-routing.md); компонент [[yii\base\Application::db|db]]
являє собою з’єднання з базою даних, через яке ви можете виконувати запити.
Саме з допомогою цих вбудованих компонентів Yii додатки можуть обрабляти запит користувача.
Нижче наведений перелік вбудованих компонентів додатку. Ви можете конфігурувати їх так само як і інші компоненти додатку.
Коли ви конфігуруєте вбудований компонент додатку і не вказуєте клас цього компонента, то буде використовуватись значення за замовчуванням.
Нижче наведено перелік вбудованих компонентів додатку. Ви можете конфігурувати їх так само, як і інші компоненти додатку.
Коли ви конфігуруєте вбудований компонент додатку і не вказуєте клас цього компонента, то буде використовуватись
значення за замовчуванням.
* [[yii\web\AssetManager|assetManager]]: використовується для керування і відображенням ресурсів додатку.
Більш детальна інформація представлена ​​в розділі [Ресурси](output-assets.md);
Більш детальна інформація наведена у розділі [Ресурси](output-assets.md).
* [[yii\db\Connection|db]]: являє собою з’єднання з базою даних, через яке ви можете виконувати запити.
Зверніть увагу, що коли конфігуруєте даний компонент, ви маєте вказати клас компонента так як і решту необхідних параметрів, а саме такі як [[yii\db\Connection::dsn]].
Більш детальна інформація представлена ​​в розділі [Об’єкти доступу до даних (DAO)](db-dao.md);
* [[yii\base\Application::errorHandler|errorHandler]]: здійснює опрацювання PHP помилок і виключень.
Більш детальна інформація представлена ​​в розділі [Обробка помилок](runtime-handling-errors.md);
* [[yii\base\Formatter|formatter]]: форматує дані для відображення їх кінцевому користувачу. Наприклад, число може
бути зображене з різноманітними розділителями, дата може бути зображена в форматі `long`.
Більш детальна інформація представлена ​​в розділі [Форматування даних](output-formatting.md);
Зверніть увагу, що, коли конфігуруєте даний компонент, ви маєте вказати клас компонента, разом із рештою
необхідних параметрів, наприклад [[yii\db\Connection::dsn]].
Більш детальна інформація наведена у розділі [Об’єкти доступу до даних (DAO)](db-dao.md).
* [[yii\base\Application::errorHandler|errorHandler]]: здійснює обработку PHP помилок і виключень.
Більш детальна інформація наведена у розділі [Обробка помилок](runtime-handling-errors.md).
* [[yii\i18n\Formatter|formatter]]: форматує дані для відображення їх кінцевому користувачу. Наприклад, число може
бути відображене із різноманітними роздільниками, дата може бути зображена у розширеному форматі.
Більш детальна інформація наведена у розділі [Форматування даних](output-formatter.md).
* [[yii\i18n\I18N|i18n]]: використовується для перекладу повідомлень і форматування.
Більш детальна інформація представлена ​​в розділі [Інтернаціоналізація](tutorial-i18n.md);
Більш детальна інформація наведена у розділі [Інтернаціоналізація](tutorial-i18n.md).
* [[yii\log\Dispatcher|log]]: обробка і маршрутизація логів.
Більш детальна інформація представлена ​​в розділі [Логування](runtime-logging.md);
* [[yii\swiftmailer\Mailer|mail]]: надає можливості для побудови і розсилки поштових повідомлень.
Більш детальна інформація представлена ​​в розділі [Відправлення пошти](tutorial-mailing.md);
* [[yii\base\Application::response|response]]: являє собою дані від серверу, які будуть направлені користувачу.
Більш детальна інформація представлена ​​в розділі [Відповіді](runtime-responses.md);
* [[yii\base\Application::request|request]]: являє собою запит, отриманий від кінцевого користувача.
Більш детальна інформація представлена ​​в розділі [Запити](runtime-requests.md);
* [[yii\web\Session|session]]: інформація про сесії. Даний компонент доступний тільки в [[yii\web\Application|веб додатках]].
Більш детальна інформація представлена ​​в розділі [Сесії і куки](runtime-sessions-cookies.md);
Більш детальна інформація наведена у розділі [Логування](runtime-logging.md).
* [[yii\swiftmailer\Mailer|mail]]: надає можливості для побудови і відправки поштових повідомлень.
Більш детальна інформація наведена у розділі [Відправлення пошти](tutorial-mailing.md).
* [[yii\base\Application::response|response]]: являє собою об’єкт відповіді сервера кінцевим користувачам.
Більш детальна інформація наведена у розділі [Відповіді](runtime-responses.md).
* [[yii\base\Application::request|request]]: являє собою об’єкт запиту, який сервер отримує від кінцевих користувачів.
Більш детальна інформація наведена у розділі [Запити](runtime-requests.md).
* [[yii\web\Session|session]]: надає інформація про сесії.
Даний компонент доступний тільки у [[yii\web\Application|веб додатках]].
Більш детальна інформація наведена у розділі [Сесії і куки](runtime-sessions-cookies.md).
* [[yii\web\UrlManager|urlManager]]: використовується для розбору і побудови URL.
Більш детальна інформація представлена ​​в розділі [Розбір і генерація URL](runtime-url-handling.md);
Більш детальна інформація наведена у розділі [Маршрутизація та створення URL](runtime-routing.md).
* [[yii\web\User|user]]: являє собою інформацію авторизованого користувача.
Даний компонент доступний тільки в [[yii\web\Application|веб додатках]].
Більш детальна інформація представлена ​​в розділі [Аутентифікація](security-authentication.md);
Даний компонент доступний тільки у [[yii\web\Application|веб додатках]].
Більш детальна інформація наведена у розділі [Аутентифікація](security-authentication.md).
* [[yii\web\View|view]]: використовується для відображення представлень.
Більш детальна інформація представлена ​​в розділі [Представлення](structure-views.md).
Більш детальна інформація наведена у розділі [Представлення](structure-views.md).
Додатки
==========
=======
Додатки це об’єкти, які керують всією структурою і життєвим циклом прикладної системи Yii.
Кожна Yii прикладна система містить у собі один об’єкт додатка, який створбється у [вхідному скрипті](structure-entry-scripts.md)
і глобально доступний через `\Yii::$app`.
Кожна Yii прикладна система містить у собі один об’єкт додатка, який створюється у
[вхідному скрипті](structure-entry-scripts.md) і глобально доступний через `\Yii::$app`.
> Інформація: В залежності від контексту, коли ми говорим "додаток", це може означати як об’єкт додатка, так і прикладну систему додатка вцілому.
> Інформація: В залежності від контексту, коли ми говорим "додаток", це може означати як об’єкт додатка,
так і прикладну систему додатка вцілому.
Існує два вида додатків: [[yii\web\Application|веб додатки]] і [[yii\console\Application|консольні додатки]].
Як можна здогадатись із назви, перший тип в основному займається обробкою веб запитів, в той час як останній - консольних команд.
Існує два типи додатків: [[yii\web\Application|веб додатки]] та [[yii\console\Application|консольні додатки]].
Як можна здогадатися із назв, перший тип, в основному, займається обробкою веб запитів, а другий - консольними командами.
## Конфігурації додатка <a name="application-configurations"></a>
Коли [вхідний скрипт](structure-entry-scripts.md) створює додаток, він завантажить [конфігурацію](concept-configurations.md)
і примінить її до додатка, наприклад:
Коли [вхідний скрипт](structure-entry-scripts.md) створює додаток, він завантажить
[конфігурацію](concept-configurations.md) та застосує її до додатка, наприклад:
```php
require(__DIR__ . '/../vendor/autoload.php');
......@@ -27,45 +28,57 @@ $config = require(__DIR__ . '/../config/web.php');
(new yii\web\Application($config))->run();
```
Так як і звичайні [конфігурації](concept-configurations.md), конфігурації додатка вказують як слід ініціювати властивості об’єктів додатка. Через те, що конфігурації додатків часто є складними, вони розбиваються на декілька
[конфігураційних файлів](concept-configurations.md#configuration-files), наприклад, `web.php` файл в наведеному вище прикладі.
Як і звичайні [конфігурації](concept-configurations.md), конфігурації додатка вказують як саме слід ініціювати
властивості об’єктів додатка. Через те, що конфігурації додатків часто є складними, вони розбиваються на декілька
[конфігураційних файлів](concept-configurations.md#configuration-files), наприклад, файл `web.php` у наведеному вище прикладі.
## Властивості додатків <a name="application-properties"></a>
## Властивості додатка <a name="application-properties"></a>
Існує багато важливих властивостей додатка, які ви налаштовуєте в конфігураціях додатка. Ці властивості зазвичай описують середовище, в якому працює додаток. Наприклад, додаток мусить знати яким чином завантажувати [контролери](structure-controllers.md), де зберігати тимчасові файли, і т.п. Нижче ми розглянемо дані властивості.
Існує багато важливих властивостей додатка, які ви налаштовуєте в конфігураціях додатка.
Ці властивості, зазвичай, описують середовище, у якому працює додаток. Наприклад,
додаток мусить знати яким чином завантажувати [контролери](structure-controllers.md),
де зберігати тимчасові файли, і т.п. Нижче ми розглянемо дані властивості.
### Об’язкові властивості <a name="required-properties"></a>
В кодному додатку, ви маєте налаштувати мінімум дві властивості: [[yii\base\Application::id|id]]
і [[yii\base\Application::basePath|basePath]].
В кожному додатку, ви маєте налаштувати мінімум дві властивості: [[yii\base\Application::id|id]]
та [[yii\base\Application::basePath|basePath]].
#### [[yii\base\Application::id|id]] <a name="id"></a>
Властивість [[yii\base\Application::id|id]] це унікальний індекс додатка, який відрізняє його від решти інших додатків.
В основному це використовується всередені системи. Хоч і не є обов’язковим, але для кращої сумістності рекомендується використовувати буквено-цифрові символи при налаштуванні індекса додатка.
Властивість [[yii\base\Application::id|id]] є унікальним ID додатка, який відрізняє його від решти інших додатків.
Здебільшого, це використовується всередені системи. Хоч і не є обов’язковим, але для кращої сумістності рекомендується
використовувати буквено-цифрові символи при налаштуванні ID додатка.
#### [[yii\base\Application::basePath|basePath]] <a name="basePath"></a>
Властивість [[yii\base\Application::basePath|basePath]] вказує на кореневу директорію додатка. Ця директорія, яка містить весь код прикладної системи додатка. В цій директорії зазвичай можуть знаходитись теки `models`, `views`, `controllers`, які містять код, що відповідає шаблону проектування MVC.
Властивість [[yii\base\Application::basePath|basePath]] вказує на кореневу директорію додатка. Ця директорія,
яка містить весь код прикладної системи додатка. В цій директорії, зазвичай, можуть знаходитись підкаталоги `models`,
`views`, `controllers`, які містять код, що відповідає шаблону проектування MVC.
Ви можете налаштувати властивість [[yii\base\Application::basePath|basePath]] вказавши прямий шлях до директорії через [псевдоніми шляху](concept-aliases.md). В обох випадках, вказана директорія має існувати, інакше буде отримано виняток. Шлях буде нормалізований за допомогою виклику функції `realpath()`.
Ви можете налаштувати властивість [[yii\base\Application::basePath|basePath]], вказавши прямий шлях до директорії
через [псевдонім шляху](concept-aliases.md). В обох випадках, вказана директорія має існувати, інакше буде отримано
виняток. Шлях буде нормалізовано за допомогою виклику функції `realpath()`.
Властивість [[yii\base\Application::basePath|basePath]] часто використовується для важливих шляхів, наприклад, шлях до runtime директорії, котра використовується в процесі робити додатка. Саме по цій причині, псевдонім шляху `@app` є зумовленим і вказує на дану директорію. Інші шляхи можуть бути визначеними шляхом використання псевдоніму шляху, наприклад,
`@app/runtime`.
Властивість [[yii\base\Application::basePath|basePath]] часто використовується для важливих шляхів (наприклад, шлях до
runtime директорії). Саме з цієї причини, псевдонім шляху `@app` є зумовлений вказувати на дану директорію.
Похідні шляхи потім можуть бути сформовані за допомогою цього псевдоніму шляху (наприклад, `@app/runtime` для
звертання до runtime директорії).
### Важливі властивості <a name="important-properties"></a>
Властивості, перелічені в даному підрозділі, частіш за все повинні бути налаштовані так як вони можуть відрізнятися в різних додатках.
Властивості, перелічені в даному підрозділі, частіш за все повинні бути визначені, тому що вони можуть
відрізнятися у різних додатках.
#### [[yii\base\Application::aliases|aliases]] <a name="aliases"></a>
Дана властивість дозволяє налаштувати вам безліч [псевдонімів](concept-aliases.md) в рамках масива.
Дана властивість дозволяє налаштувати вам безліч [псевдонімів](concept-aliases.md) у рамках масиву.
Ключами масива є імена псевдонімів, а значеннами - відповідні значення шляхів. Наприклад,
```php
......@@ -77,20 +90,24 @@ $config = require(__DIR__ . '/../config/web.php');
]
```
Ця властивість доступна таким чином, аби ви змогли вказувати псевдоніми в рамках конфігурації додатка, а не викликаючи метод [[Yii::setAlias()]].
Ця властивість доступна таким чином, аби ви змогли вказувати псевдоніми в рамках конфігурації додатка,
а не викликаючи метод [[Yii::setAlias()]].
#### [[yii\base\Application::bootstrap|bootstrap]] <a name="bootstrap"></a>
Дана властивість є дуже зручною, вона дозволяє вказувати масив компонентів, котрі мусять бути завантажені
у процесі [[yii\base\Application::bootstrap()|початкового завантаження]] додатка. Наприклад, якщо ви хочете,
щоб [модуль](structure-modules.md) виконував тонке налаштування [URL правил](runtime-routing.md),
ви можете вказати його ID в якості елемента даної властивості.
Дана властивість є дуже зручною, вона дозволяє вказувати масив компонентів, котрі мусять бути завантажені в процесі [[yii\base\Application::bootstrap()|початкового завантаження]] додатка. Наприклад, якщо ви хочете, щоб [модуль](structure-modules.md) виконував тонке налаштування [URL правил](runtime-url-handling.md), ви можете вказати його ID в якості елемента даної властивості.
Кожен із елементів даної властивості може вказуватись в одному із наступних форматів:
Кожний з елементів даної властивості може вказуватись в одному з наступних форматів:
- ID, вказаний в [компонентах](#components);
- ID модуля, вказаний в [модулях](#modules);
- назва класа;
- ID компонента додатка, що вказаний у [компонентах](#components).
- ID модуля, що вказаний у [модулях](#modules).
- назва класа.
- масив конфігурації.
- анонімна функциія, яка створює та повертає об’єкт компонента.
Наприклад,
......@@ -101,20 +118,39 @@ $config = require(__DIR__ . '/../config/web.php');
'demo',
// назва класа
'app\components\TrafficMonitor',
'app\components\Profiler',
// масив конфігурації
[
'class' => 'app\components\Profiler',
'level' => 3,
]
],
// анонімна функція
function () {
return new app\components\Profiler();
}
],
]
```
В процесі початкового завантаження, буде створено кожний компонент. Якщо клас компонента містить інтерфейс [[yii\base\BootstrapInterface]], то також буде викликаний метод [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]].
> Інформація: Якщо ID модуля співпадає з ID компонента додатка, перевага буде віддана ініціалізації компонента додатка
під час початкового завантаження. Якщо ж ви хочете використати модуль, вам потрібно використати анонімну функцію,
як показано нижче:
> ```php
[
function () {
return Yii::$app->getModule('user');
},
]
```
Ще одним практичним прикладом є конфігурація [базового шаблону додатка](start-installation.md), в якій модулі `debug` і `gii` вказані як `bootstrap` компоненти, коли додаток знаходиться у відлагоджувальному режимі.
Під час початкового завантаження, буде створено кожний компонент. Якщо клас компонента реалізує інтерфейс
[[yii\base\BootstrapInterface]], то буде викликаний його метод [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]].
Ще одним практичним прикладом є конфігурація [базового шаблону додатка](start-installation.md), у якій модулі
`debug` і `gii` визначені як компоненти початкового завантаження, коли додаток знаходиться режимі розробки.
```php
if (YII_ENV_DEV) {
......@@ -127,14 +163,19 @@ if (YII_ENV_DEV) {
}
```
> Примітка: Якщо вказувати велику кількість компонентів у `bootstrap`, то це приведе до зниження продуктивності додатка, тому що для кожного запиту буде завантажуватись однакова кількість компонентів. Таким чином ви мусите розумно використовувати початкове завантаження.
> Примітка: Якщо вказувати велику кількість компонентів у `bootstrap` - це негативно позначиться на продуктивності
додатка, оскільки для кожного запиту буде виконуватись один й той самий набір компонентів. Таким чином, потрібно
розсудливо використовувати компоненти початкового завантаження.
#### [[yii\web\Application::catchAll|catchAll]] <a name="catchAll"></a>
Дана властивість підтримується тільки [[yii\web\Application|веб додатками]].Вона вказує на [події контролера](structure-controllers.md), які мусять опрацьовувати всі вхідні запити від користувача. В основному це використовується коли додаток знаходиться в режимі обслуговування і мусить опрацьовувати всі запити через одну подію.
Дана властивість підтримується тільки [[yii\web\Application|веб додатками]]. Вона вказує на
[дії контролера](structure-controllers.md), які мусять обробляти всі вхідні запити від користувача. Переважно,
це використовується, коли додаток знаходиться в режимі обслуговування і повинен обробити всі запити через одну дію.
Конфігурація це масив, перший елемент якого вказує на маршрут події. Решта елементів в форматі ключ-значення вказують на додаткові параметри, які мають бути передані події. Наприклад,
Конфігурація є масивом, перший елемент якого вказує на маршрут події. Решта елементів масиву у форматі ключ-значення
вказують на додаткові параметри, які мають бути передані події. Наприклад,
```php
[
......@@ -149,7 +190,8 @@ if (YII_ENV_DEV) {
#### [[yii\base\Application::components|components]] <a name="components"></a>
Дана властивість є найважливішою. Вона дозволяє вам вказати перелік компонентів під назвою [компоненти додатку](#structure-application-components.md), які ви можете використовувати в інших місцях. Наприклад,
Дана властивість є найважливішою. Вона дозволяє вам зареєструвати іменні компоненти у
[компонентах додатку](structure-application-components.md), які ви можете використовувати в інших місцях. Наприклад,
```php
[
......@@ -165,17 +207,22 @@ if (YII_ENV_DEV) {
]
```
Кожний компонент додатка вказаний масивом в форматі ключ-значення. Ключ являє собою ID компонента додатка, в той час як значення являє собою назву класа або [конфігурацію](concept-configurations.md).
Кожен компонент додатка вказаний масивом у форматі ключ-значення. Ключ являє собою ID компонента додатка,
у той час як значення являє собою назву класа або [конфігурацію](concept-configurations.md).
Ви можете зареєструвати будь-який компонент в додатку, пізніше цей компонент буде доступний глобально через вираз `\Yii::$app->ComponentID`.
Ви можете зареєструвати будь-який компонент у додатку, який потім буде доступний глобально
за допомогою виразу `\Yii::$app->ComponentID`.
Більш детальна інформація наведена в розділі [Компоненти додатка](structure-application-components.md).
#### [[yii\base\Application::controllerMap|controllerMap]] <a name="controllerMap"></a>
Дана властивість дозволяє вам встановлювати залежності між ID контролера і його класом. За замовчуванням, Yii встановлює відповідність між ID контролера і його класом згідно даної [домовленості](#controllerNamespace) (таким чином,
ID `post` буде відповідати `app\controllers\PostController` ). За допомогою налаштування даної властивості ви можете змінити домовленість для потрібних контролерів. В наведеному прикладі, `account` буде відповідати `app\controllers\UserController`, в той час як `article` буде відповідати `app\controllers\PostController`.
Дана властивість дозволяє вам встановлювати відповідність між ID контролера та його класом. За замовчуванням,
Yii встановлює відповідність між ID контролера та його класом згідно [домовленості](#controllerNamespace)
(таким чином, ID `post` буде відповідати `app\controllers\PostController`). За допомогою налаштування даної властивості
ви можете змінити домовленість для необхідних контролерів. У наведеному прикладі, `account` буде
відповідати `app\controllers\UserController`, в той час, як `article` буде відповідати `app\controllers\PostController`.
```php
[
......@@ -191,49 +238,59 @@ ID `post` буде відповідати `app\controllers\PostController` ). З
]
```
Ключами даної властивості є ID контролерів, а значеннями є назва класа контролера або [конфігурація](concept-configurations.md).
Ключами масиву даної властивості є ID контролерів, а значеннями є назви класів контролерів або
[конфігурації](concept-configurations.md).
#### [[yii\base\Application::controllerNamespace|controllerNamespace]] <a name="controllerNamespace"></a>
Дана властивість вказує на простір імен, де за замовчуванням мусять міститись назви класів контролерів.
За замовчуванням значення рівне `app\controllers`. Якщо ID контролера `post`, то згідно домовленості, відповідний клас контролера (без простору імен) буде рівним `PostController`, а повна назва класа буде `app\controllers\PostController`.
Дана властивість вказує на простір імен за замовчуванням, під яким повинні знаходитись класи контролерів.
За замовчуванням, це значення рівне `app\controllers`. Якщо ID контролера є `post`, то, згідно домовленості,
відповідна назва класу контролера (без простору імен) буде `PostController`, а повна назва класу буде
`app\controllers\PostController`.
Клас контролера також може знаходитись в підпапці теки, що відповідає цьому простору імен. Наприклад, даному ID контролера `admin/post`, відповідає повне ім’я класа контролера `app\controllers\admin\PostController`.
Класи контролерів можуть також знаходитись у підкаталогах директорії, що відповідає її простору імені.
Наприклад, ID контролера `admin/post` відповідає повне ім’я класа контролера `app\controllers\admin\PostController`.
Дуже важливо, щоб ім’я класа контролера могло бути використане [автозавантаженням](concept-autoloading.md) і відповідний простір імен вашого контролера відповідав даній властивості. Інакше, ви отримаєте помилку "Сторінка не знайдена", коли спробуєте отримати доступ до додатка.
Дуже важливо, щоб повне ім’я класа контролера могло бути використане [автозавантаженням](concept-autoloading.md)
і фактичний простір імен вашого контролера відповідав цій властивості. В іншому випадку, ви отримаєте помилку
із заголовком "Сторінка не знайдена", коли спробуєте отримати доступ до додатка.
У випадку, якщо ви хочете змінити домовленість яку розглянуто вище, ви можете використовувати властивість [controllerMap](#controllerMap).
У випадку, якщо ви хочете змінити домовленість, яку розглянуто вище, ви можете використовувати властивість
[controllerMap](#controllerMap).
#### [[yii\base\Application::language|language]] <a name="language"></a>
Дана властивість вказує на мову додатка, на якій вміст сторінки мусить бути зображений кінцевому користувачу.
За замовчуванням, значення даної властивості рівне `en`, що значить "Англійський". Якщо ваш додаток підтримує декілька мов, ви мусите налаштувати дану властивість.
Дана властивість вказує на мову додатка, на якій додаток повинен відображати зміст кінцевому користувачу.
За замовчуванням, значення даної властивості рівне `en`, означаючи англійську мову.
Якщо ваш додаток підтримує декілька мов, ви необхідно налаштувати дану властивість.
Значення даної властивості визначається декількома різними аспектами [інтернаціоналізації](tutorial-i18n.md), в тому числі
перекладом повідомлень, форматуванням дат, форматуванням чисел, і т. п. Наприклад, віджет [[yii\jui\DatePicker]] використовує дану властивість для визначення мови за замовчуванням, на якій має бути зображений календар і формат даних для календаря.
Значення даної властивості визначає кілька різних аспектів [інтернаціоналізації](tutorial-i18n.md), в тому числі
переклади повідомлень, форматування дат, форматування чисел, і т. п. Наприклад, віджет [[yii\jui\DatePicker]]
використовує дану властивість для визначення мови за замовчуванням, на якій має бути зображений календар і
формат даних для календаря.
Рекомендується, щоб ви вказували мову в рамках стандатра [IETF](http://en.wikipedia.org/wiki/IETF_language_tag).
Рекомендується вказувати мову у рамках стандатру [IETF](http://en.wikipedia.org/wiki/IETF_language_tag).
Наприклад, для англійської мови використовується `en`, в той час як для англійської в США - `en-US`.
Більш детальна інформація наведена в розділі [Інтернаціоналізація](tutorial-i18n.md).
Більш детальна інформація наведена у розділі [Інтернаціоналізація](tutorial-i18n.md).
#### [[yii\base\Application::modules|modules]] <a name="modules"></a>
Дана властивість вказує на [модулі](structure-modules.md), які містяться в додатку.
Дана властивість визначає [модулі](structure-modules.md), які містить додаток.
Значеннями властивості можуть бути масиви імен класів модулів або [конфігурацій](concept-configurations.md), а ключами -
ID модулів. Наприклад,
Значенням властивості є масив імен класів модулів або [конфігурацій](concept-configurations.md), а ключами цього масиву
виступають ID модулів. Наприклад,
```php
[
'modules' => [
// a "booking" module specified with the module class
// модуль "booking" визначено класом модуля
'booking' => 'app\modules\booking\BookingModule',
// a "comment" module specified with a configuration array
// модуль "comment" визначено масивом конфігурації
'comment' => [
'class' => 'app\modules\comment\CommentModule',
'db' => 'db',
......@@ -242,19 +299,23 @@ ID модулів. Наприклад,
]
```
Більш детальна інформація наведена в розділі [Модулі](structure-modules.md).
Більш детальна інформація наведена у розділі [Модулі](structure-modules.md).
#### [[yii\base\Application::name|name]] <a name="name"></a>
Властивість вказує на ім’я додатка, яке може бути зображене кінцевому користувачу. На відміну від властивості [[yii\base\Application::id|id]], яка має бути унікальною, значення даної властивості потрібне в основному для відображення і не є обов’язково унікальною.
Дана властивість вказує на ім’я додатка, яке може бути відображене кінцевому користувачу. На відміну від властивості
[[yii\base\Application::id|id]], яка має бути унікальною, значення даної властивості потрібне в основному для
відображення і не є обов’язково є унікальною.
Якщо ваш код не використовує дану властивість, то ви можете не налаштовувати її.
#### [[yii\base\Application::params|params]] <a name="params"></a>
Дана властивість описує масив глобально доступних параметрів додатка. Замість того, щоб використовувати жорстко фіксовані числа і строки у вашому коді, краще оголосити їх параметрами додатка в єдиному місці і використовувати в необхідних місцях кода. Наприклад, ви можете визначити розмір прев’ю для зображеннь наступним чином:
Дана властивість описує масив глобально доступних параметрів додатка. Замість того, щоб використовувати жорстко
фіксовані числа і строки у вашому коді, краще оголосити їх параметрами додатка в одному місці і використовувати
в необхідних місцях коду. Наприклад, ви можете визначити розмір прев’ю-зображень для зображеннь наступним чином:
```php
[
......@@ -264,68 +325,88 @@ ID модулів. Наприклад,
]
```
Потім, коли вам потрібно використати дані значення у вашому коді, ви робите так як показано нижче:
Потім, коли вам потрібно використати дані значення у вашому коді, ви можете зробити це наступним чином:
```php
$size = \Yii::$app->params['thumbnail.size'];
$width = \Yii::$app->params['thumbnail.size'][0];
```
Якщо пізніше вам знадобиться змінити розмір прев’ю зображення, то потрібно буде змінити лише це значення в налаштуваннях додатка не торкаючись залежного коду.
Якщо пізніше вам знадобиться змінити розмір прев’ю зображення, то вам потрібно буде змінити це значення лише у
конфігураційному файлі додатка, не змінюючи будь-який залежний код.
#### [[yii\base\Application::sourceLanguage|sourceLanguage]] <a name="sourceLanguage"></a>
Дана властивість вказує мову на якій написаний код додатка. За замовчуванням значення рівне `'en-US'`, що значить "Англійський" (США). Ви мусите налаштувати дану властивість відповідним чином, якщо зміст у вашому коді вказаний не англійською.
Дана властивість вказує мову, на якій написаний код додатка. За замовчуванням значення рівне `'en-US'`,
що означає англійську мову (США). Ви повинні змінити дану властивість, якщо мовою змісту у вашому коді
є не англійська мова.
Аналогічно властивості [language](#language), ви мусите вказати дану властивість в рамках стандарту [IETF](http://en.wikipedia.org/wiki/IETF_language_tag).
Наприклад, для англійської мови використовується `en`, в той час як для англійської в США - `en-US`.
Аналогічно властивості [language](#language), ви повинні вказати дану властивість у рамках стандарту
[IETF](http://en.wikipedia.org/wiki/IETF_language_tag). Наприклад, для англійської мови
використовується `en`, в той час як для англійської в США - `en-US`.
Більш детальна інформація наведена в розділі [Інтернаціоналізація](tutorial-i18n.md).
Більш детальна інформація наведена у розділі [Інтернаціоналізація](tutorial-i18n.md).
#### [[yii\base\Application::timeZone|timeZone]] <a name="timeZone"></a>
Дана властивість надає альтернативний спосіб встановлення часової зони в процесі роботи додатка. Таким чином, вказуючи дану властивість, ви викликаєте PHP функцію [date_default_timezone_set()](http://www.php.net/manual/ru/function.date-default-timezone-set.php). Наприклад,
Дана властивість надає альтернативний спосіб встановлення часової зони за замовчуванням у процесі роботи додатка.
Таким чином, вказуючи дану властивість, ви, по суті, викликаєте PHP функцію
[date_default_timezone_set()](http://php.net/manual/en/function.date-default-timezone-set.php). Наприклад,
```php
[
// Europe/Kiev для України
// 'Europe/Kiev' для України
'timeZone' => 'America/Los_Angeles',
]
```
#### [[yii\base\Application::version|version]] <a name="version"></a>
Дана властивість вказує на версію додатка. За замовчуванням значення рівне `'1.0'`. Ви можете не використовувати дану властивість, якщо ваш код не використовує її.
Дана властивість вказує на версію додатка. За замовчуванням значення рівне `'1.0'`. Ви можете не змінювати
дану властивість, якщо ваш код не використовує її.
### Корисні властивості <a name="useful-properties"></a>
Властивості, які перераховані в даному розділі не є часто конфігуруємими, так як їх значення за замовчуванням відповідають загальноприйнятим домовленостям. Однак, ви можете їх налаштувати, якщо вам потрібно використовувати інші значення.
Властивості, які перераховані в даному розділі, не є часто змінюваними, так як їх значення за замовчуванням
відповідають загальноприйнятим домовленостям. Однак, ви можете їх налаштувати, якщо вам потрібно використовувати
інші значення.
#### [[yii\base\Application::charset|charset]] <a name="charset"></a>
Властивість вказує кодування, яке використовує додаток. За замовчуванням значення рівне `'UTF-8'`, яке мусить бути залишеним для більшості додатків, тільки якщо ви не працюєте з устарівшим кодом, який використовує більшу кількість даних не юнікода.
Властивість вказує кодування, яке використовує додаток. За замовчуванням значення рівне `'UTF-8'`,
яке має бути незмінним для більшості додатків, тільки якщо ви не працюєте із застарілим кодом, який використовує
значний об’єм не юнікод даних.
#### [[yii\base\Application::defaultRoute|defaultRoute]] <a name="defaultRoute"></a>
Властивість вказує [маршрут](runtime-routing.md), який мусить використовувати додаток, коли він не вказаний у вхідному запиті. Маршрут може складатись із ID модуля, ID контролера і/або ID події. Наприклад, `help`,
`post/create`, `admin/post/create`. Якщо подію не вказано, то буде використано значення за замовчуванням вказане в [[yii\base\Controller::defaultAction]].
Властивість вказує [маршрут](runtime-routing.md), який повинен використовувати додаток, коли його не вказано у
вхідному запиті. Маршрут може складатись із ID модуля, ID контролера і/або ID дії. Наприклад, `help`,
`post/create`, `admin/post/create`. Якщо дію не вказано, то буде використано значення за замовчуванням,
що вказане у [[yii\base\Controller::defaultAction]].
Для [yii\web\Application|веб додатків], значення за замовчуванням даної властивості рівне `'site'`, що значить контролер `SiteController` і його подія за замовчуванням. Таким чином, якщо ви спробуєте отримати доступ до додатка не вказавши маршрут, то вам буде зображено результат події `app\controllers\SiteController::actionIndex()`.
Для [yii\web\Application|веб додатків] значення за замовчуванням даної властивості рівне `'site'`, що означає
контролер `SiteController` і його дія за замовчуванням. Таким чином, якщо ви спробуєте отримати доступ
до додатка, не вказавши маршрут - буде відображено результат дії `app\controllers\SiteController::actionIndex()`.
Для [yii\console\Application|консольних додатків], значення за замовчуванням рівне `'help'`, яке означає, що мусить використовуватись вбудована команда [[yii\console\controllers\HelpController::actionIndex()]]. Таким чином, якщо ви виконаєте команду `yii` без аргументів, вам будет зображена довідкова інформація.
Для [yii\console\Application|консольних додатків] значення за замовчуванням рівне `'help'`, яке означає,
що повинна використовуватись вбудована команда [[yii\console\controllers\HelpController::actionIndex()]].
Таким чином, якщо ви виконаєте команду `yii` без аргументів, вам будет зображена довідкова інформація.
#### [[yii\base\Application::extensions|extensions]] <a name="extensions"></a>
Дана властивість описує перелік [розширень](structure-extensions.md), які встановлені і використовуються додатком. За замовчуванням, значення даної властивості буде масив, отриманий з файла `@vendor/yiisoft/extensions.php`. Файл `extensions.php` генерується і використовується автоматично, коли ви використовуєте [Composer](http://getcomposer.org) для встановлення розширень.
Таким чином, в більшості випадків вам не потрібно налаштовувати дану властивість.
Дана властивість описує перелік [розширень](structure-extensions.md), які встановлені і використовуються додатком.
За замовчуванням, значенням даної властивості буде масив, отриманий із файла `@vendor/yiisoft/extensions.php`.
Файл `extensions.php` генерується і підтримується автоматично, коли ви використовуєте
[Composer](http://getcomposer.org) для встановлення розширень.
Таким чином, у більшості випадків, вам не потрібно налаштовувати дану властивість.
В особливих випадках, коли ви хочете опрацьовувати розширення в ручному режимі, ви можете вказати дану властивість наступним чином:
В особливих випадках, коли ви хочете керувати розширеннями власноруч, ви можете вказати дану властивість наступним чином:
```php
[
......@@ -346,57 +427,72 @@ $width = \Yii::$app->params['thumbnail.size'][0];
]
```
Властивість є масивом специфікацій розширень. Кожне розширення вказано масивом, який складається з елементів `name` і `version`. Якщо розширення має бути виконано в процесі [початкового завантаження](runtime-bootstrapping.md), то слід вказати `bootstrap` елемент, який може бути іменем класа або [конфігурацією](concept-configurations.md).
Як бачите, властивість є масивом специфікацій розширень. Кожне розширення вказано масивом, який складається з елементів
`name` і `version`. Якщо розширення має бути виконано в процесі [початкового завантаження](runtime-bootstrapping.md),
то слід вказати елемент у `bootstrap` властивості, який може бути іменем класа або масивом [конфігурації](concept-configurations.md).
Розширення також може визначати декілька [псевдонімів](concept-aliases.md).
#### [[yii\base\Application::layout|layout]] <a name="layout"></a>
Дана властивість вказує ім’я шаблону за замовчуванням, який мусить бути використаний при формувані [представлення](structure-views.md).
Значення за замовчуванням рівне `'main'`, яке означає, що має бути використаний шаблон `main.php` в [директорії шаблонів](#layoutPath).
Якщо обидві властивості [директорія шаблонів](#layoutPath) і [директорія представлень](#viewPath) мають значення за замовчуванням, то файл шаблону за замовчуванням може бути представлений псевдонімом шляху як `@app/views/layouts/main.php`.
Дана властивість визначає ім’я шаблону за замовчуванням, який мусить бути використаний при формувані
[представлення](structure-views.md). Значення за замовчуванням рівне `'main'`, яке означає, що має бути використаний
шаблон `main.php` в [директорії шаблонів](#layoutPath). Якщо обидві властивості, [директорія шаблонів](#layoutPath)
та [директорія представлень](#viewPath), приймають значення за замовчуванням, то файл шаблону за замовчуванням може
бути представлений псевдонімом шляху як `@app/views/layouts/main.php`.
Для відключення використання шаблону, ви можете вказати дану властивість як `false`, хоча це використовується дуже рідко.
Для відключення використання шаблону, ви можете вказати дану властивість як `false`, однак це є дуже рідкісним випадком.
#### [[yii\base\Application::layoutPath|layoutPath]] <a name="layoutPath"></a>
Властивість вказує шлях по якому слід шукати шаблони. Значення за замовчуванням рівне `layouts`, що означає підпапку в [директорії представлень](#viewPath). Якщо значення [директорії представлень](#viewPath) є значенням за замовчуванням, то директорія шаблонів за замовчуванням може бути представлена псевдонімом шляху як `@app/views/layouts`.
Дана властивість визначає шлях, по якому слід шукати шаблони. Значення за замовчуванням рівне `layouts`,
що означає підпапку у [директорії представлень](#viewPath). Якщо значення [директорії представлень](#viewPath)
є значенням за замовчуванням, то директорія шаблонів за замовчуванням може бути представлена псевдонімом шляху як `@app/views/layouts`.
Ви можете налаштувати дану властивість як теку так і як [псевдонім](concept-aliases.md).
Ви можете налаштувати дану властивість як директорію, так і як [псевдонім шляху](concept-aliases.md).
#### [[yii\base\Application::runtimePath|runtimePath]] <a name="runtimePath"></a>
Властивість вказує шлях, по якому зберігаються тимчасові файли, такі як: лог файли, кеш файли. За замовчуванням значення рівне директорії, яка преставлена псевдонімом шляху `@app/runtime`.
Дана властивість визначає шлях, по якому зберігаються тимчасові файли, такі як: лог файли, кеш файли.
За замовчуванням це значення рівне директорії, яка преставлена псевдонімом шляху `@app/runtime`.
Ви можете налаштувати дану властивість як директорію або як [псевдонім](concept-aliases.md) шляху. Зверніть увагу, що дана директорія має бути доступна для запису процесом, який запускає додаток. Також директорія має бути захищена від доступу кінцевим користувачам, файли які зберігаються в ній можуть містити важливу інформацію.
Ви можете налаштувати дану властивість як директорію або як [псевдонім](concept-aliases.md) шляху. Зверніть увагу,
що дана директорія має бути доступна для запису процесом, який виконує додаток. Також директорія має
бути захищена від доступу кінцевим користувачам, оскільки файли, які зберігаються в ній,, можуть містити важливу інформацію.
Для спрощення роботи з даною директорією, Yii надає зумовлений псевдонім шляху `@runtime`.
#### [[yii\base\Application::viewPath|viewPath]] <a name="viewPath"></a>
Дана властивість вказує на базову директорію, де містяться всі файли представлень. Значення за замовчуванням являє собою псевдонім `@app/views`. Ви можете налаштувати дану властивість як директорію так і [псевдонімом](concept-aliases.md).
Дана властивість визначає базову директорію, де містяться всі файли представлень. Значення за замовчуванням являє
собою псевдонім `@app/views`. Ви можете налаштувати дану властивість як директорі або [псевдонім шляху](concept-aliases.md).
#### [[yii\base\Application::vendorPath|vendorPath]] <a name="vendorPath"></a>
Властивість визначає директорію сторонніх бібліотек, які використовуються і керуються [Composer](http://getcomposer.org). Вона містить всі сторонні бібліотеки, які використовуються додатком, включаючи Yii фреймворк. Значеня за замовчуванням являє собою псевдонім `@app/vendor`.
Дана властивість визначає директорію сторонніх бібліотек, які використовуються і керуються за допомогою
[Composer](http://getcomposer.org). Вона містить всі сторонні бібліотеки, які використовуються додатком,
включаючи сам Yii фреймворк. Значеня за замовчуванням являє собою псевдонім `@app/vendor`.
Ви можете налаштувати дану властивість як директорію так і [псевдонімом](concept-aliases.md). При зміні даної властивості, переконайтесь що ви також змінили відповідним чином налаштування Composer.
Ви можете налаштувати дану властивість як директорію або [псевдонім шляху](concept-aliases.md).
При зміні даної властивості, переконайтесь, що ви також змінили відповідним чином налаштування Composer.
Для спрощення роботи з даною директорією, Yii надає зумовлений псевдонім шляху `@vendor`.
#### [[yii\console\Application::enableCoreCommands|enableCoreCommands]] <a name="enableCoreCommands"></a>
Дана властивість підтримується тільки [[yii\console\Application|консольними додатками]]. Вона вказує чи потрібно використовувати вбудовані в Yii консольні команди. Значення за замовчуванням рівне `true`.
Дана властивість підтримується тільки [[yii\console\Application|консольними додатками]]. Вона вказує чи потрібно
використовувати вбудовані в Yii консольні команди. Значення за замовчуванням рівне `true`.
## Події додатка <a name="application-events"></a>
Протягом життєвого циклу додатка, виникає декілька подій. Ви можете призначати обробники подій в конфігурації додатка наступним чином:
Додаток викликає декілька подій під час свого життєвого циклу обробки запиту.
Ви можете приєднати обробники подій в конфігурації додатка наступним чином:
```php
[
......@@ -406,10 +502,11 @@ $width = \Yii::$app->params['thumbnail.size'][0];
]
```
Використання синтаксису `on eventName` детально описано в розділі [Конфігурації](concept-configurations.md#configuration-format).
Використання синтаксису `on eventName` детально описано у розділі
[Конфігурації](concept-configurations.md#configuration-format).
Також ви можете призначити обробників подій в процесі початкового [завантаження додатку](runtime-bootstrapping.md), зразу після того
як буде створено додаток. Наприклад,
Іншим методом приэднання обробників подій у процесі [початкового завантаження додатку](runtime-bootstrapping.md),
одразу після того, як буде створено додаток, є описаний нижче приклад:
```php
\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) {
......@@ -419,27 +516,33 @@ $width = \Yii::$app->params['thumbnail.size'][0];
### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] <a name="beforeRequest"></a>
Дана подія виникає *до* того як додаток починає обробляти вхідний запит.
Справжнє ім’я події - `beforeRequest`.
Дана подія виникає *до* того, як додаток починає обробляти вхідний запит. Справжнє ім’я події - `beforeRequest`.
На момент виникнення даної події, об’єкт додатка вже створений і проініційований. Таким чином, це є добрим місцем для добавляння вашого коду з допомогою подій, для перехвату управління обробкою запиту.
Наприклад, обробник події, може динамічно підставляти мову додатка [[yii\base\Application::language]] в залежності від деяких параметрів.
Коли виникає ця подія, об’єкт додатка вже створений і проініційований. Таким чином, це є
коректним місцем для додавання вашого коду за допомогою подій для перехвату управління обробки запиту.
Наприклад,в обробник події ви може динамічно призначати мову додатка [[yii\base\Application::language]]
в залежності від деяких параметрів.
### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_AFTER_REQUEST]] <a name="afterRequest"></a>
### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] <a name="afterRequest"></a>
Дана подія виникає *після* того як додаток закінчує обробку запиту, але *до* того як виникне відправка відповіді. Справжнє ім’я події - `afterRequest`.
Дана подія виникає *після* закінчення обробки запиту додатком, але *до* відправки відповіді.
Справжнє ім’я події - `afterRequest`.
На момент виникнення даної події, обробка запиту завершена і ви можете використати це для побудови постобробки запиту, з метою налаштування відповіді.
На момент виникнення даної події, обробка запиту завершена і ви можете використати це для побудови постобробки запиту,
з метою налаштування відповіді.
Зверніть увагу, що в компоненті [[yii\web\Response|response]] також виникають події в процесі відправки даних кінцевому користувачу. Ці події виникають *після* поточної події.
Зверніть увагу, що у компоненті [[yii\web\Response|response]] також виникають події в процесі відправки даних кінцевому
користувачу. Ці події виникають *після* поточної події.
### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_ACTION]] <a name="beforeAction"></a>
### [[yii\base\Application::EVENT_BEFORE_ACTION|EVENT_BEFORE_ACTION]] <a name="beforeAction"></a>
Подія виникає *до* того як буде виконано [подію контролера](structure-controllers.md). Справжнє ім’я події - `beforeAction`.
Подія виникає *до* виконання кожної [дії контролера](structure-controllers.md).
Справжнє ім’я події - `beforeAction`.
Подія є об’єктом [[yii\base\ActionEvent]]. Обробник події може встановлювати властивість [[yii\base\ActionEvent::isValid]] рівним `false` для попередження виконання події.
Параметр події є об’єктом [[yii\base\ActionEvent]]. Обробник події може встановлювати властивість
[[yii\base\ActionEvent::isValid]] рівним `false` для зупинки виконання дії.
Наприклад,
......@@ -454,17 +557,18 @@ $width = \Yii::$app->params['thumbnail.size'][0];
]
```
Зверніть увагу на те, що та сама подія `beforeAction` виникає в [модулях](structure-modules.md) і [контролерах](structure-controllers.md). Об’єкти додатку є першими, хто ініціює дані події, вслід за модулями (якщо такі мають місце) і в кінці контролерами. Якщо обробник події встановлює властивість [[yii\base\ActionEvent::isValid]] рівним `false`, то всі наступні події не виникнуть.
Зверніть увагу на те, що така ж подія `beforeAction` виникає також у [модулях](structure-modules.md) та
[контролерах](structure-controllers.md). Об’єкти додатку є першими, хто ініціює дані події,
за якими ініціюють модулі (якщо такі є), і в кінці - контролери. Якщо обробник події встановлює властивість
[[yii\base\ActionEvent::isValid]] рівним `false`, то всі наступні події не будуть викликані.
### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_AFTER_ACTION]] <a name="afterAction"></a>
### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] <a name="afterAction"></a>
Подія виникає *після* виконання [події контролера](structure-controllers.md).
Справжнє ім’я події - `afterAction`.
Ця подія виникає *після* виконання [дії контролера](structure-controllers.md). Справжнє ім’я події - `afterAction`.
Подія є об’єктом [[yii\base\ActionEvent]]. Через властивість [[yii\base\ActionEvent::result]] обробник події може отримати доступ і змінити значення виконання події контролера.
Наприклад,
Параметр події є об’єктом [[yii\base\ActionEvent]]. Через властивість [[yii\base\ActionEvent::result]]
обробник події може отримати доступ або змінити результат дії контролера. Наприклад,
```php
[
......@@ -477,24 +581,30 @@ $width = \Yii::$app->params['thumbnail.size'][0];
]
```
Зверніть увагу, що ті ж самі події `afterAction` виникають в [модулях](structure-modules.md) і [контролерах](structure-controllers.md). Ці об’єкти ініціюють події у зворотньому порядку, якщо зрівнювати з `beforeAction`.
Таким чином, контролери є першими, де виникає дана подія, потім в модулях (якщо такі мають місце), і врешті в додатках.
Зверніть увагу на те, що така ж подія `afterAction` виникає також у [модулях](structure-modules.md) та
[контролерах](structure-controllers.md). Ці об’єкти ініціюють події у зворотньому порядку, порівнюючи із `beforeAction`.
Таким чином, контролери є першими, хто ініціює дану подію, далі йдуть модулі (якщо такі є), і врешті - у додатках.
## Життєвий цикл додатка <a name="application-lifecycle"></a>
Коли [вхідний скрипт](structure-entry-scripts.md) виконується для обробки запиту, додаток буде розвиватись згідно наступного життєвого циклу:
![Життєвий цикл додатка](images/application-lifecycle.png)
Коли [вхідний скрипт](structure-entry-scripts.md) виконується для обробки запиту, додаток пройде наступний
життєвий цикл:
1. Вхідний скрипт завантажує конфігурацію додатка в якості масива;
1. Вхідний скрипт завантажує конфігурацію додатка у якості масива.
2. Вхідний скрипт створює новий об’єкт додатка:
* Викликається метод [[yii\base\Application::preInit()|preInit()]], який налаштовує деякі життєво важливі властивості додатка, такі як [[yii\base\Application::basePath|basePath]];
* Реєструється [[yii\base\Application::errorHandler|обробник помилок]];
* Налаштовуються властивості додатку;
* Викликається метод [[yii\base\Application::init()|init()]], котрий потім викликає метод [[yii\base\Application::bootstrap()|bootstrap()]] для початкового завантаження компонентів.
* Викликається метод [[yii\base\Application::preInit()|preInit()]], який налаштовує деякі життєво важливі властивості
додатка, як наприклад [[yii\base\Application::basePath|basePath]].
* Реєструється [[yii\base\Application::errorHandler|обробник помилок]].
* Налаштовуються властивості додатку.
* Викликається метод [[yii\base\Application::init()|init()]], який далі викликає метод
[[yii\base\Application::bootstrap()|bootstrap()]] для початкового завантаження компонентів.
3. Вхідний скрипт викликає метод [[yii\base\Application::run()]] для запуску додатка:
* Виникає подія [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]];
* Обробка запиту: розбір інформації запиту в [маршруті](runtime-routing.md) з відповідними параметрами;
створення об’єктів модуля, контролера і події згідно вказаного маршруту; запуск подій;
* Виникає подія [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]];
* Ініціюється подія [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]].
* Обробка запиту: розбір інформації запиту на [маршрут](runtime-routing.md) та відповідні параметри;
створення об’єктів модуля, контролера та дії, згідно вказаного маршруту; ініціювання подій.
* Ініціюється подія [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]].
* Відповідь надсилається кінцевому користувачу.
4. Вхідний скрипт отримує значення статусу виходу з додатка і завершує обробку запиту.
4. Вхідний скрипт отримує значення статусу виходу із додатка та завершує обробку запиту.
Контролери
===========
==========
Контролери є частиною [MVC](https://ru.wikipedia.org/wiki/Model-View-Controller) архітектури. Це об’єкти класів, успадкованих
від [[yii\base\Controller]] і відповідають за опрацювання запиту і генерації відповіді. По суті, після опрацювання запиту [додатками](structure-applications.md),
контролери проаналізують вхідні дані, передадуть їх в [моделі](structure-models.md), додадуть результати моделі в [представлення](structure-views.md),
і в кінцевому підсумку згенерують вихідні відповіді.
Контролери є частиною [MVC](http://uk.wikipedia.org/wiki/Модель-вид-контролер) архітектури. Це об’єкти класів,
успадкованих від [[yii\base\Controller]] та відповідають за обработку запитів і генерацію відповідей.
Зокрема, після отримання контролю від [додатків](structure-applications.md), контролери проаналізують
вхідні дані, передадуть їх у [моделі](structure-models.md), додадуть результати моделі у
[представлення](structure-views.md), і в кінцевому підсумку згенерують вихідні відповіді.
## Події <a name="actions"></a>
## Дії <a name="actions"></a>
Контролери складаються з *подій*, які є основними блоками, до яких може звертатись кінцевий користувач і запитувати виконання того або іншого функціоналу. В контролері може бути одна або декілька подій.
Контролери складаються з *дій*, які є основними блоками, до яких може звертатись кінцевий користувач і запитувати
виконання того або іншого функціоналу. В контролері може бути одна або декілька дій.
Наступний приклад показує `post` контролер з двома подіями: `view` і `create`:
Наступний приклад показує `post` контролер з двома діями: `view` та `create`:
```php
namespace app\controllers;
......@@ -50,21 +52,25 @@ class PostController extends Controller
}
```
В події `view` (визначено методом `actionView()`), код спочатку завантажує [модель](structure-models.md)
згідно запитуваної ID моделі; Якщо модель успішно завантажена, то код відобразить її за допомогою [представлення](structure-views.md)
під назвою `view`. В іншому випадку буде визване виключення.
У дії `view` (визначеній методом `actionView()`) код спочатку завантажує [модель](structure-models.md),
відповідно запитуваної ID моделі; Якщо модель успішно завантажена, то код відобразить її за допомогою
[представлення](structure-views.md), під назвою `view`. В іншому випадку - буде визване виключення.
В події `create` (визначено методом `actionCreate()`), код аналогічний. Він спочатку намагається завантажити [модель](structure-models.md) за допомогою даних із запиту і зберегти модель. Якщо все пройшло успішно, то код перенаправить браузер на подію `view` з ID щойно створеної моделі. В іншому випадку він відобразить предаставлення `create`, через яке користувач зможе вказати необхідні дані.
У дії `create` (визначеній методом `actionCreate()`), код аналогічний. Він спочатку намагається завантажити
[модель](structure-models.md) за допомогою даних із запиту і зберегти модель. Якщо все пройшло успішно,
то код перенаправить браузер на дію `view` із ID щойно створеної моделі. В іншому випадку - він відобразить
предаставлення `create`, через яке користувач зможе вказати необхідні дані.
## Маршрути <a name="routes"></a>
Кінцеві користувачі звертаються до подій з допомогою так названих *маршрутів*. Маршрут це рядок, який складається з наступних частин:
Кінцеві користувачі звертаються до дій з допомогою так названих *маршрутів*. Маршрут це рядок,
який складається з наступних частин:
* ID модуля: він існує, тільки якщо контролер належить не додатку, а [модулю](structure-modules.md);
* ID контролера: рядок, який унікально ідентифікує контролер серед всіх інших контролерів одного і того ж додатка
(або одного й того ж модуля, якщо контролер належить модулю);
* ID події: рядок, який унікально идентифікує подію серед всіх інших подій одного й того ж конторолера.
* ID дії: рядок, який унікально ідентифікує дію серед всіх інших дій одного й того ж конторолера.
Маршрути можуть мати наступний формат:
......@@ -78,14 +84,16 @@ ControllerID/ActionID
ModuleID/ControllerID/ActionID
```
Таким чином, якщо користувач звертається до URL `http://hostname/index.php?r=site/index`, то `index` подія в `site` контролері яку буде викликано.
Секція [Маршрутизація](runtime-routing.md) містить більш детальну інформацію про те як маршрути співставляються з подіями.
Таким чином, якщо користувач звертається до URL `http://hostname/index.php?r=site/index`, то буде викликано дію `index`
у контролері `site`. Розділ [Маршрутизація та створення URL](runtime-routing.md) містить більш детальну інформацію
про те, як маршрути співставляються із діями.
## Створення контролерів <a name="creating-controllers"></a>
В [[yii\web\Application|Веб додатках]], контролери мусять бути успадковані від [[yii\web\Controller]] або його потомків.
Аналогічно для [[yii\console\Application|консольних додатків]], контролери мусять бути успадковані від [[yii\console\Controller]] або його потомків. Наступний код визначає `site` контролер:
У [[yii\web\Application|веб додатках]] контролери повинні бути успадкованими від класу [[yii\web\Controller]]
або його нащадків. Аналогічно для [[yii\console\Application|консольних додатків]], контролери повинні бути
успадкованими від класу [[yii\console\Controller]] або його нащадків. Наступний код визначає контролер `site`:
```php
namespace app\controllers;
......@@ -100,66 +108,68 @@ class SiteController extends Controller
### ID контролерів <a name="controller-ids"></a>
За звичай контролер зроблений таким чином, що він мусить опрацьовувати запити, які пов’язані з певним ресурсом.
Саме через дані причини, ID контролерів за завичай є іменниками, які посилаються на ресурс, який вони опрацьовують.
Наприклад, ви можете використовувати `article` в якості ID контролера, який відповідає за опрацювання даних публікацій.
За звичай контролер зроблений таким чином, що він повинен обробляти запити, які пов’язані з певним ресурсом.
Саме з цієї причини, ID контролерів за завичай є іменниками, які посилаються на ресурс, який вони обробляють.
Наприклад, ви можете використовувати `article` в якості ID контролера, який відповідає за обробку даних публікацій.
За замовчуванням, ID контролерів мають містити тільки наступні символи: Англійські букви в нижньому регістрі, цифри, підкреслення,
тире и слеш. Наприклад, обидва `article` і `post-comment` є прийнятними ID контролерів, в той час як `article?`, `PostComment`,
`admin\post` не являються такими.
За замовчуванням, ID контролерів мають містити тільки наступні символи: англійські букви в нижньому регістрі, цифри,
підкреслення, тире і слеш. Наприклад, обидва `article` та `post-comment` є прийнятними ID контролерів, в той час,
як `article?`, `PostComment`, `admin\post` не є такими.
ID контролерів також можуть містити префікс субдиректорії. Наприклад, в `admin/article` частина `article` є контролером в
субдиректорії `admin` в [[yii\base\Application::controllerNamespace|порсторі імен]].
Допустимими символами для префіксів субдиректорій є: Англійські букви в нижньому і верхньому регістрі, символи підкреслення і слеш, де слеш використовується в якості розділителя для багатовкладених субдиректорій (наприклад `panels/admin`).
ID контролера також може містити префікс субдиректорії. Наприклад, у `admin/article` - частина `article` відповідає
контролеру в субдиректорії `admin` [[yii\base\Application::controllerNamespace|простору імен контролера]].
Допустимими символами для префіксів субдиректорій є: англійські букви в нижньому і верхньому регістрах, цифри,
символи підкреслення і слеш, де слеш - використовується в якості роздільника для багаторівневих субдиректорій
(наприклад `panels/admin`).
### Іменування класів контролерів <a name="controller-class-naming"></a>
### Правила найменування класів контролерів <a name="controller-class-naming"></a>
Назви класів контролерів можуть бути отримані із ID контролерів наступними правилами:
Назви класів контролерів можуть бути отримані з ID контролерів наступними способами:
* Привести у верхній регістр перший символ в кожному слові, розділеному дефісами. Зверніть увагу, що, якщо
ID контролера містить слеш, то дане правило поширюється тільки на частину після останнього слеша в ID контролера.
* Прибрати дефіси і замінити будь-який прямий слеш на зворотний.
* Додати суфікс `Controller`.
* Додати на початок [[yii\base\Application::controllerNamespace|простір імен контролера]].
* Привести в верхній регістр перший символ в кожному слові, розділеному дефісами. Зверніть увагу що, якщо ID контролера
містить слеш, то дане правило поширюється тільки на частину після останнього слеша в ID контролера;
* Прибрати дефіси і замінити будь-який прямий слеш на зворотний;
* Додати суфікс `Controller`;
* Додати в початок [[yii\base\Application::controllerNamespace|простір імен контролерів]].
Нижче наведено декілька прикладів, з урахуванням того, що [[yii\base\Application::controllerNamespace|простір імен контролерів]] має значення за замовчуванням `app\controllers`:
Нижче наведено декілька прикладів, з урахуванням того, що
[[yii\base\Application::controllerNamespace|простір імен контролера]] має значення за замовчуванням `app\controllers`:
* `article` відповідає `app\controllers\ArticleController`;
* `post-comment` відповідає `app\controllers\PostCommentController`;
* `admin/post-comment` відповідає `app\controllers\admin\PostCommentController`;
* `adminPanels/post-comment` відповідає `app\controllers\adminPanels\PostCommentController`.
Класи контролерів мають бути [автозавантаженими](concept-autoloading.md). Саме по цій причині, у вищенаведених прикладах,
контролер `article` має бути збереженим у файл, [псевдонім](concept-aliases.md) якого `@app/controllers/ArticleController.php`;
в той час як контролер `admin/post2-comment` має знаходитись у файлі `@app/controllers/admin/Post2CommentController.php`.
Класи контролерів мають бути [автозавантаженими](concept-autoloading.md). Саме з цієї причини у вищенаведених прикладах
контролер `article` має бути збереженим у файл, [псевдонім шляху](concept-aliases.md) якого є
`@app/controllers/ArticleController.php`; в той час, як контролер `admin/post2-comment` має знаходитись у файлі
`@app/controllers/admin/Post2CommentController.php`.
> Інформація: Останній приклад `admin/post2-comment` показує яким чином ви можете розташувати контролер в директорії
[[yii\base\Application::controllerNamespace|простору імен контролерів]]. Це дуже зручно, коли ви хочете організувати свої контролери в декілька категорій і не хочете використовувати [модулі](structure-modules.md).
[[yii\base\Application::controllerNamespace|простору імен контролера]]. Це дуже зручно, коли ви хочете організувати
свої контролери у декілька категорій і не хочете використовувати [модулі](structure-modules.md).
### Мапа контролерів <a name="controller-map"></a>
Ви можете налаштувати [[yii\base\Application::controllerMap|Мапу контролерів]] для того, щоб подолати
описані вище обмеження іменування ID контролерів і назв класів. В основному це дуже зручно, коли ви використовуєте
Ви можете налаштувати [[yii\base\Application::controllerMap|мапу контролерів]] для того, щоб подолати
описані вище обмеження іменування ID контролерів і назв класів. В основному, це дуже зручно, коли ви використовуєте
сторонні контролери, іменування яких ви не можете контролювати.
Ви можете налаштувати [[yii\base\Application::controllerMap|мапу контролерів]] в [налаштуваннях додатка](structure-applications.md#application-configurations)
наступним чином:
Ви можете налаштувати [[yii\base\Application::controllerMap|мапу контролерів]] в
[налаштуваннях додатка](structure-applications.md#application-configurations) наступним чином:
```php
[
'controllerMap' => [
[
// оголошує "account" контролер, використовуючи назву класу
'account' => 'app\controllers\UserController',
// оголошує "article" контролер, використовуючи масив конфігурації
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
// оголошує контролер "account", використовуючи назву класу
'account' => 'app\controllers\UserController',
// оголошує контролер "article", використовуючи масив конфігурації
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
],
]
......@@ -168,11 +178,13 @@ ID контролерів також можуть містити префікс
### Контролер за замовчуванням <a name="default-controller"></a>
Кожний додаток має контролер за замовчуванням, вказаний через властивість [[yii\base\Application::defaultRoute]].
Коли в запиті не вказаний [маршрут](#ids-routes), тоді буде використаний маршрут вказаний в даній властивості.
Для [[yii\web\Application|Веб додатків]], це значення `'site'`, в той час як для [[yii\console\Application|консольних додатків]],
це `'help'`. Таким чином, якщо вказаний URL `http://hostname/index.php`, це значить, що контролер `site` виконає обробку запиту.
Коли в запиті не вказано [маршрут](#ids-routes), то буде використано маршрут із даної властивості.
Для [[yii\web\Application|веб додатків]], це значення рівне `'site'`, у той час, як для
[[yii\console\Application|консольних додатків]], це `'help'`. Таким чином, якщо вказаний URL
`http://hostname/index.php`, це значить, що контролер `site` виконає обробку запиту.
Ви можете змінити контролер за замовчуванням наступним чином в [налаштуваннях додатку](structure-applications.md#application-configurations):
Ви можете змінити контролер за замовчуванням наступним чином в
[налаштуваннях додатку](structure-applications.md#application-configurations):
```php
[
......@@ -181,9 +193,11 @@ ID контролерів також можуть містити префікс
```
## Створення подій <a name="creating-actions"></a>
## Створення дій <a name="creating-actions"></a>
Створення подій не містить складнощів також як і оголошення так званих *методов подій* в класі контролера. Метод події це *public* метод, ім’я якого починається за слова `action`. Значення, що повертаються методу події являють собою відповідні дані, які будуть вислані кінцевому користувачу. Наведений нижче код визначає дві події `index` і `hello-world`:
Створення дій може бути таким же простим, як і оголошення так званих *методов дій* у класі контролера.
Метод дії це *public* метод, ім’я якого починається зі слова `action`. Значення методі дії, що повертається, є даними
відповіді, які будуть вислані кінцевому користувачу. Наведений нижче код визначає дві дії - `index` і `hello-world`:
```php
namespace app\controllers;
......@@ -205,54 +219,60 @@ class SiteController extends Controller
```
### ID подій <a name="action-ids"></a>
### ID дій <a name="action-ids"></a>
В основному події розробляються для певної конкретної обробки ресурса. По цій причині, ID подій в основному
є дієсловами, такими як `view`, `update`, і т. д.
Частіше за все, дія розробляється для певної конкретної обробки ресурса. З цієї причини ID дій, в основному,
є дієсловами, такими як `view`, `update`, і т.д.
За замовчуванням, ID події повинен містити тільки такі символи: Англійські букви в нижньому регістрі, цифри,
підкреслення і дефіси. Дефіси в ID подій використовуються для поділу слів. Наприклад, `view`, `update2`, `comment-post` є допустимими ID подій, в той час як `view?`, `Update` не являються такими.
За замовчуванням, ID дій повинні містити тільки такі символи: англійські букви в нижньому регістрі, цифри,
підкреслення і дефіси. Дефіси в ID дій використовуються для поділу слів. Наприклад, `view`, `update2`,
`comment-post` є допустимими ID дій, в той час, як `view?`, `Update` не є такими.
Ви можете створювати події двома способами: вбудовані події і окремі події. Вбудована подія є методом, визначеним
в класі контролера, тоді як окрема подія є екземпляром класу, успадкованого від [[yii\base\Action]] або його потомків.
Вбудовані події вимагають менше зусиль для створення і в основному використовуються якщо у вас немає потреби в повторному використанні подій.
Окремі події, з іншого боку, в основному створюються для використання в різних контролерах або при використанні в [розширеннях](structure-extensions.md).
Ви можете створювати дії двома способами: вбудовані дії і окремі дії. Вбудована дія є методом, визначеним
в класі контролера, тоді як окрема дія є екземпляром класу, успадкованого від [[yii\base\Action]] або його нащадків.
Вбудовані дії вимагають менше зусиль для створення і, в основному, використовуються якщо у вас немає потреби
у повторному використанні цих дій. Окремі дії, з іншого боку, в основному створюються для використання в різних
контролерах або при використанні у [розширеннях](structure-extensions.md).
### Вбудовані події <a name="inline-actions"></a>
### Вбудовані дії <a name="inline-actions"></a>
Вбудовані події це ті події, які визначені в рамках методів контролера, як ми це вже обговорили.
Вбудовані дії це ті дії, які визначені у рамках методів контролера, як ми це вже обговорили.
Назви методів подій можуть бути отримані з ID подій наступним чином:
Назви методів дій можуть бути отримані із ID дій наступним чином:
* Привести перший символ кожного слова в ID події у верхній регістр;
* Привести перший символ кожного слова в ID дії у верхній регістр;
* Прибрати дефіси;
* Додати префікс `action`.
Наприклад, `index` відповідає `actionIndex`, а `hello-world` відповідає `actionHelloWorld`.
> Примітка: Назви імен подій є *регістрозалежними*. Якщо у вас є метод `ActionIndex`, він не буде врахований як метод події, таким чином, запит до події `index` призведе до зображення виключення. Також слід врахувати, що методи подій повинні мати область видимості public. Методи, що мають область видимості private або protected НЕ визначають методи вбудованих подій.
Наприклад, `index` перетвориться у `actionIndex`, а `hello-world` перетвориться у `actionHelloWorld`.
> Примітка: Назви імен дій є *регістрозалежними*. Якщо у вас є метод `ActionIndex`, то його не буде враховано
як метод дії, і в результаті, запит до дії `index` призведе до отримання виключення. Також слід врахувати,
що методи дій повинні бути публічними ("public"). Приватні ("private") або захищені ("protected") методи
НЕ визначають вбудованих дій.
Вбудовані події в основному використовуються, тому що для їх створення не потрібного багато зусиль. Тим не менше, якщо ви плануєте повторно використовувати деякі події в різних місцях, або якщо ви хочете перерозподілити події, ви повинні визначити їх як *окремі події*.
В основному використовуються вбудовані дії, оскільки для їх створення не потрібного багато зусиль.
Тим не менше, якщо ви плануєте повторно використовувати деякі дії у різних місцях або якщо ви хочете
перерозподілити дії, ви повинні визначити їх як *окремими діями*.
### Окремі події <a name="standalone-actions"></a>
### Окремі дії <a name="standalone-actions"></a>
Окремі події визначаються в якості класів, успадкованих від [[yii\base\Action]] або його потомків.
Наприклад, в Yii релізах, присутні [[yii\web\ViewAction]] і [[yii\web\ErrorAction]], обидва з яких є окремими подіями.
Окремі дії визначаються в якості класів, успадкованих від [[yii\base\Action]] або його нащадків.
Наприклад, в релізах Yii присутні [[yii\web\ViewAction]] та [[yii\web\ErrorAction]], обидва класи є окремими діями.
Для використання окремої події, ви маєте вказати її в *мапі подій*, з допомогою перевизначення метода
Для використання окремої дії, ви маєте вказати її у *мапі дій* за допомогою перевизначення методу
[[yii\base\Controller::actions()]] у вашому класі контролера, наступним чином:
```php
public function actions()
{
return [
// оголошує "error" подію з допомогою назви класу
// оголошує дію "error" за допомогою назви класу
'error' => 'yii\web\ErrorAction',
// оголошує "view" подію з допомогою конфігураційного масиву
// оголошує дію "view" за допомогою конфігураційного масиву
'view' => [
'class' => 'yii\web\ViewAction',
'viewPrefix' => '',
......@@ -261,10 +281,12 @@ public function actions()
}
```
Як ви можете бачити, метод `actions()` мусить повернути масив, ключами якого є ID подій, а значенями - відповідні назви класу події або [конфігурація](concept-configurations.md). На відміну від вбудованих подій, ID окремих подій можуть містити довільні символи, до тих пір поки вони визначені в методі `actions()`.
Як ви можете бачити, метод `actions()` повинен повернути масив, ключами якого є ID дій, а значеннями - відповідні
назви класів дій або [конфігурацій](concept-configurations.md). На відміну від вбудованих дій, ID окремих дій
можуть містити довільні символи, доки вони визначені у методі `actions()`.
Для створення окремої події, ви мусите успадкуватись від класу [[yii\base\Action]] або його потомків, і реалізувати
метод `run()` з областю видимості public. Роль метода `run()` аналогічна іншим методам подій. Наприклад,
Для створення окремої дії, ви повинні успадкуватись від класу [[yii\base\Action]] або його нащадків, і реалізувати
публічний ("public") метод `run()`. Роль метода `run()` аналогічна іншим методам дій. Наприклад,
```php
<?php
......@@ -282,21 +304,22 @@ class HelloWorldAction extends Action
```
### Результати подій <a name="action-results"></a>
### Результати дій <a name="action-results"></a>
Значення, що повертається методами подій або методом `run()` окремої події дуже важливе. Воно є результатом
виконання відповідної події.
Значення, що повертається від метода дії або метода `run()` окремої дії дуже важливе.
Воно є результатом виконання відповідної дії.
Значення, що повертається може бути об’єктом [response](runtime-responses.md), який буде направлений кінцевому користувачу в якості відповіді.
Значення, що повертається, може бути об’єктом [відповіді](runtime-responses.md), яке буде відправлено
кінцевому користувачу.
* Для [[yii\web\Application|Веб додатків]], значення, що повертається також може бути довільними даними, яким будуть
назначені [[yii\web\Response::data]], а потім конвертовані в рядок, що представляє тіло відповіді.
* Для [[yii\console\Application|Консольних додатків]], значення, що повертається також може бути числом, що представляє
[[yii\console\Response::exitStatus|статус виходу]] виконання команди.
* Для [[yii\web\Application|веб додатків]], значення, що повертається, також може бути довільними даними,
яке буде призначене до [[yii\web\Response::data]], а потім конвертоване у рядок, що представляє тіло відповіді.
* Для [[yii\console\Application|консольних додатків]], значення, що повертається, також може бути числом, що
представляє [[yii\console\Response::exitStatus|статус виходу]] виконання команди.
В вищенаведених прикладах, всі результати подій є рядками, які будуть використані в якості тіла відповіді,
висланого користувачеві. Наступний приклад, показує подію, що може перенаправити браузер користувача на новий URL, за допомогою
повернення response об'єкта ([[yii\web\Controller::redirect()|redirect()]] метод повертає response об’єкт):
В вищенаведених прикладах всі результати дій є рядками, які будуть використані у якості тіла відповіді користувачу.
Наступний приклад показує як дія може перенаправити браузер користувача на новий URL за допомогою
повернення об’єкта відповіді (оскільки метод [[yii\web\Controller::redirect()|redirect()]] повертає об’єкт response):
```php
public function actionForward()
......@@ -307,12 +330,14 @@ public function actionForward()
```
### Параметри подій <a name="action-parameters"></a>
### Параметри дій <a name="action-parameters"></a>
Методи подій для вбудованих подій і методи `run()` для окремих подій можуть приймати параметри, які називають *параметри подій*. Їх значення беруться із запитів. Для [[yii\web\Application|Веб додатків]], значення кожного з параметрів події береться з `$_GET`, використовуючи назву параметра в якості ключа;
для [[yii\console\Application|консольних додатків]], вони відповідають аргументам командної строки.
Методи дій для вбудованих дій і методи `run()` для окремих дій можуть приймати, так звані, *параметри дії*.
Їх значення беруться із запитів. Для [[yii\web\Application|веб додатків]], значення кожного з параметрів дії
береться із `$_GET`, використовуючи назву параметра у якості ключа;
для [[yii\console\Application|консольних додатків]] - вони відповідають аргументам командної строки.
В наведеному нижче прикладі, подія `view` (вбудовона подія) визначає два параметра: `$id` і `$version`.
В наступному прикладі, дія `view` (вбудовона дія) визначає два параметри: `$id` і `$version`.
```php
namespace app\controllers;
......@@ -328,17 +353,19 @@ class PostController extends Controller
}
```
Для різних запитів параметри події будуть визначені наступним чином:
Параметри дії будуть заповнені для різних запитів наступним чином:
* `http://hostname/index.php?r=post/view&id=123`: параметр `$id` буде присвоєне значення `'123'`, в той час як `$version` буде мати значення null, так як рядок запиту не містить параметра `version`;
* `http://hostname/index.php?r=post/view&id=123`: параметру `$id` буде присвоєне значення `'123'`, у той час,
як `$version` буде мати значення null, так як рядок запиту не містить параметра `version`.
* `http://hostname/index.php?r=post/view&id=123&version=2`: параметрам `$id` і `$version` будуть присвоєні
значення `'123'` і `'2'` відповідно;
* `http://hostname/index.php?r=post/view`: буде вкинуте виключення [[yii\web\BadRequestHttpException]], так як
обов’язковий параметр `$id` не був вказаний в запиті;
* `http://hostname/index.php?r=post/view&id[]=123`: буде вкинуте виключення [[yii\web\BadRequestHttpException]], так як
параметр `$id` отримав невірне значення `['123']`.
значення `'123'` і `'2'` відповідно.
* `http://hostname/index.php?r=post/view`: буде отримане виключення [[yii\web\BadRequestHttpException]], оскільки
обов’язковий параметр `$id` не було вказано у запиті.
* `http://hostname/index.php?r=post/view&id[]=123`: буде отримане виключення [[yii\web\BadRequestHttpException]],
оскільки параметр `$id` отримав невірне значення `['123']`.
Якщо ви хочите, щою параметр події приймав масив значеннь, ви мусите використовувати type-hint значення `array`, як зображено нажче:
Якщо ви хочете, щоб параметр дії приймав масив значень, ви повинні використати type-hint `array` параметра метода,
як зображено нажче:
```php
public function actionView(array $id, $version = null)
......@@ -347,19 +374,22 @@ public function actionView(array $id, $version = null)
}
```
Тепер, якщо запит буде містити URL `http://hostname/index.php?r=post/view&id[]=123`, то параметр `$id` отримає значення
`['123']`. Якщо запит буде містити URL `http://hostname/index.php?r=post/view&id=123`, то параметр `$id` все рівно буде містити масив, так як скалярне значення `'123'` буде автоматично сконвертовано в масив.
Тепер, якщо запит буде містити URL `http://hostname/index.php?r=post/view&id[]=123`, то параметр `$id` отримає
значення `['123']`. Якщо запит буде містити URL `http://hostname/index.php?r=post/view&id=123`, то параметр
`$id` все рівно отримає масив, оскільки скалярне значення `'123'` буде автоматично сконвертовано у масив.
Вищенаведені приклади в основному показують як параметри подій працюють для Веб додатків. Більше інформації
Вищенаведені приклади в основному показують як параметри дій працюють для веб додатків. Більше інформації
про параметри консольних додатків наведено в секції [Консольні команди](tutorial-console.md).
### Події за замовчуванням <a name="default-action"></a>
### Дія за замовчуванням <a name="default-action"></a>
Кожний контролер містить події, визначені через властивість [[yii\base\Controller::defaultAction]].
Коли [маршрут](#ids-routes) містить тільки ID контролера, то розуміється, що було запрошено подію контролера за замовчуванням.
Кожний контролер містить дію за замовчуванням, визначену через властивість [[yii\base\Controller::defaultAction]].
Коли [маршрут](#ids-routes) містить тільки ID контролера, то розуміється, що було запитана дія контролера
за замовчуванням.
За замовчуванням, ця подія має значення `index`. Якщо ви хочите змінити це значення, просто перевизначте дану властивість в класі контролера наступним чином:
За замовчуванням, ця дія має значення `index`. Якщо ви хочете змінити це значення - просто перевизначте дану
властивість у класі контролера наступним чином:
```php
namespace app\controllers;
......@@ -380,35 +410,39 @@ class SiteController extends Controller
## Життєвий цикл контролера <a name="controller-lifecycle"></a>
При опрацюванні запиту, [додаток](structure-applications.md) створить контролер, базуючись на
запрошеному [маршруті](#routes). Для виконання запиту, контролер пройде через наступні етапи життєвого циклу:
При обробці запиту, [додаток](structure-applications.md) створить контролер, базуючись на [маршруті](#routes),
який було запитано. Для виконання запиту, контролер пройде через наступні етапи життєвого циклу:
1. Метод [[yii\base\Controller::init()]] буде викликаний після того як контролер буде створений і сконфігурований;
2. Контролер створить об’єкт події, базуючись на запрошеному ID події:
* Якщо ID події не вказано, то буде використано [[yii\base\Controller::defaultAction|ID події за замовчуванням]];
* Якщо ID події знайдено в [[yii\base\Controller::actions()|мапі подій]], то буде створено окрему подію;
* Якщо ID події відповідає методу події, то буде створено вбудовану подію;
* В іншому випадку, буде вкинуте виключення [[yii\base\InvalidRouteException]].
1. Метод [[yii\base\Controller::init()]] буде викликаний після того, як контролер був створений і сконфігурований.
2. Контролер створить об’єкт дії, базуючись на ID дії, яку було запитано:
* Якщо ID дії не вказано, то буде використано [[yii\base\Controller::defaultAction|ID дії за замовчуванням]];
* Якщо ID дії знайдено у [[yii\base\Controller::actions()|мапі дій]], то буде створено окрему дію;
* Якщо ID дії відповідає методу дії, то буде створено вбудовану дію;
* В іншому випадку, буде отримане виключення [[yii\base\InvalidRouteException]].
3. Контролер послідовно викликає метод `beforeAction()` додатка, модуля (якщо контролер належить модулю) і
самого контролера.
* Якщо один із методів повернув `false`, то решта, невикликані методи `beforeAction` будуть пропущені, а виконання події буде відмінено;
* За замовчуванням, кожний виклик метода `beforeAction()` викликає подію `beforeAction`, на яку ви можете призначити обробників.
4. Контролер запускає подію:
* Параметри події будуть проаналізовані і заповнені з даних запиту.
* Якщо один із методів повернув `false`, то решта невикликаних методів `beforeAction` будуть пропущені,
а виконання дії буде відмінено;
* За замовчуванням, кожний виклик метода `beforeAction()` викликає подію `beforeAction`, на яку ви можете
призначити обробники.
4. Контролер виконує дію:
* Параметри дії будуть проаналізовані і заповнені із даних запиту.
5. Контролер послідовно викликає методи `afterAction` контролера, модуля (якщо контролер належить модулю) і додатка.
* За замовчуванням, кожний виклик метода `afterAction()` викликає подію `afterAction`, на яку ви можете призначити обробників.
6. Додаток, отримавши результат виконання події, присвоює його об’єкту [response](runtime-responses.md).
* За замовчуванням, кожний виклик метода `afterAction()` викликає подію `afterAction`, на яку ви можете
призначити обробники.
6. Додаток, отримавши результат виконання дії, привласнює його об’єкту [response](runtime-responses.md).
## Кращі практики <a name="best-practices"></a>
В добре організованих додатках, контролери за звичай дуже тонкі, і містять лише декілька рядків коду.
Якщо ваш контролер дуже складний, це за звичай означає, що вам потрібно провести рефакторинг його і перенести будь-який код в інші місце.
Якщо ваш контролер дуже складний, це за звичай означає, що вам потрібно провести його рефакторинг і
перенести деякий код в інші класи.
В цілому, контролери
* можуть мати доступ до даних [запиту](runtime-requests.md);
* можуть викликати методи [моделей](structure-models.md) і інших компонентів системи з даними запиту;
* можуть викликати методи [моделей](structure-models.md) та інших компонентів системи із даними запиту;
* можуть використовувати [представлення](structure-views.md) для формування відповіді;
* не повинні займатись опрацюванням даних, це має відбуватись в [моделях](structure-models.md);
* мають уникати використання HTML або іншої розмітки, краще це робити в [представленнях](structure-views.md).
* не повинні займатись обробкою даних - це має відбуватися у [моделях](structure-models.md);
* мають уникати використання HTML або іншої розмітки - краще це робити у [представленнях](structure-views.md).
Вхідні скрипти
===============
==============
Вхідні скрипти це перша ланка в процесі початкового завантаження додатку. Додаток (веб додаток або консольний додаток)
включає єдиний вхідний скрипт. Кінцеві користувачі роблять запити до вхідного скрипта, який створює об’єкти додатка і перенаправляє запит до них.
має єдиний вхідний скрипт. Кінцеві користувачі роблять запити до вхідного скрипта, який створює об’єкти додатка та
перенаправляє запит до них.
Вхідні скрипти для веб додатків повинні бути збережені в теках доступних з веб, таким чином вони можуть бути доступними кінцевому користувачу. Такі скрипти за звичай називаються `index.php`, але також можут використовуватись і інші імена, які можуть бути розпізнані використовуваними веб-серверами.
Вхідні скрипти для веб додатків повинні бути збережені в директоріях, доступних із веб, таким чином, вони можуть бути
доступними кінцевим користувачам. Зазвичай вони називаються `index.php`, але також можут використовуватись і інші
імена, які можуть бути розпізнані веб-серверами.
Вхідні скрипти для консольних додатків за звичай розміщенні в [кореневій директорії](structure-applications.md) додатку і мають назву
`yii` (з суфіксом `.php`). Вони мають права на виконання, таким чином користувачі зможуть запускати консольні додатки через команду `./yii <маршрут> [аргументи] [опції]`.
Вхідні скрипти для консольних додатків зазвичай розміщенні у [кореневій директорії](structure-applications.md)
додатку і мають назву `yii` (з суфіксом `.php`). Вони повинні мати права на виконання, щоб користувачі мали змогу
запускати консольні додатки через команду `./yii <маршрут> [аргументи] [опції]`.
Вхідні скрипти в основному виконують наступну роботу:
* Оголошують глобальні константи;
* Реєструють завантажувач класів [Composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading);
* Підключають файл класа [[Yii]];
* Реєструють автозавантажувач класів [Composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading);
* Підключають файл класу [[Yii]];
* Завантажують конфігурацію додатка;
* Створюють і конфігурують об’єкт [додатка](structure-applications.md);
* Викликають метод [[yii\base\Application::run()]] додатка для опрацювання вхідного запиту.
* Викликають метод [[yii\base\Application::run()]] додатка для обробки вхідного запиту.
## Веб додатки <a name="web-applications"></a>
......@@ -29,16 +33,16 @@
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
// реєстрація завантажувача класів Composer
// реєстрація автозавантажувача класів Composer
require(__DIR__ . '/../vendor/autoload.php');
// підключення файла класа Yii
// підключення файла класу Yii
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
// завантаження конфігурації додатка
$config = require(__DIR__ . '/../config/web.php');
// створення і конфігурація додатка, а також виклик метода для опрацювання вхідного запиту
// створення, конфігурація та виконання додатка
(new yii\web\Application($config))->run();
```
......@@ -60,14 +64,14 @@ $config = require(__DIR__ . '/../config/web.php');
defined('YII_DEBUG') or define('YII_DEBUG', true);
// fcgi не має констант STDIN и STDOUT, вони визначаються за замовчуванням
// fcgi не має констант STDIN та STDOUT за замовчуванням
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
// реєстрація завантажувача класів Composer
// реєстрація автозавантажувача класів Composer
require(__DIR__ . '/vendor/autoload.php');
// підключення файла класа Yii
// підключення файла класу Yii
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
// завантаження конфігурації додатка
......@@ -83,11 +87,15 @@ exit($exitCode);
Вхідні скрипти є найкращим місцем для оголошення глобальних констант. Yii підтримує наступні три константи:
* `YII_DEBUG`: вказує чи працює додаткок у відлагоджувальному режимі. Перебуваючи у відлагоджувальному режимі, додаток буде збирати більше інформації у логи і покаже більш детальний стек викликів, якщо виникне виняток. По цій причині, відлагоджувальний режим повинен бути використаний тільки в процесі розробки. За замовчуванням значення `YII_DEBUG` дорівнює false;
* `YII_ENV`: вказує в якому середовищі працює додаток. Дана тема детально розглянута в розділі [Конфігурації](concept-configurations.md#environment-constants).
За замовчуванням значення `YII_ENV` дорівнює `'prod'`, що значить, що додаток працює у виробничому режимі;
* `YII_ENABLE_ERROR_HANDLER`: вказує чи потрібно включати наявний у Yii обробник помилок. За замовчуванням значення даної константи
дорівнює true.
* `YII_DEBUG`: вказує чи працює додаткок у режимі відлагодження ("debug mode"), перебуваючи у якому,
додаток буде збирати більше інформації у логи та покаже більш детальний стек викликів при отриманні виключення.
З цієї причини, режим відлагодження повинен бути використаний тільки в процесі розробки.
За замовчуванням значення `YII_DEBUG` дорівнює `false`.
* `YII_ENV`: вказує в якому середовищі працює додаток. Дана тема детально розглянута у розділі
[Конфігурації](concept-configurations.md#environment-constants). За замовчуванням значення `YII_ENV` дорівнює
`'prod'`, яке означає, що додаток працює у робочому ("production") режимі.
* `YII_ENABLE_ERROR_HANDLER`: вказує чи потрібно увімкнути наявний у Yii обробник помилок.
За замовчуванням значення даної константи дорівнює `true`.
При визначенні константи, ми зазвичай використовуєм наступний код:
......@@ -105,4 +113,5 @@ if (!defined('YII_DEBUG')) {
Перший варіант є більш коротким і зрозумілим.
Константи мають бути визначені якомога раніше, в самому початку вхідного скрипта, таким чином вони зможуть вплинути на решту PHP файлів які будуть підключатись.
Константи мають бути визначені якомога раніше, на самому початку вхідного скрипта, щоб вони могли вплинути на решту
PHP файлів, які будуть підключатись.
Огляд
=====
Yii додаток організований згідно шаблону проектування [модель-представлення-подія (MVC)](http://ru.wikipedia.org/wiki/Model-View-Controller).
[Моделі](structure-models.md) являють собою дані, бізнес логіку і бізнес правила; [представлення](structure-views.md)
відповідають за відображення інформації, в тому числі і на основі даних, отриманих з моделей; [контролери](structure-controllers.md)
приймають вхідні дані від користувача і перетворюють їх в зрозумілий для [моделей](structure-models.md) формат і команди, а також відповідають за відображення потрібного представлення.
Додатки Yii організовані згідно шаблону проектування
[модель-представлення-подія (MVC)](http://uk.wikipedia.org/wiki/Модель-вид-контролер).
[Моделі](structure-models.md) являють собою дані, бізнес логіку та бізнес правила;
[представлення](structure-views.md) відповідають за відображення даних моделей;
[контролери](structure-controllers.md) приймають вхідні дані від користувача і перетворюють їх у команди для
[моделей](structure-models.md) та [представлень](structure-views.md).
Окрім MVC, Yii додаток також має наступні сутності:
* [вхідні скрипти](structure-entry-scripts.md): це PHP скрипти, які доступні напряму кінцевому користувачу додатка.
Вони відповідають за запуск та опрацювання вхідного запиту;
Вони відповідають за запуск циклу обробки запиту.
* [додатки](structure-applications.md): це глобально доступні об’єкти, які відповідають за коректну роботу різних
компонентів додатка і їх координацію для обробки запиту;
компонентів додатка і їх координацію для обробки запиту.
* [компоненти додатку](structure-application-components.md): це об’єкти, зареєстровані в додатку і які надають
різноманітні можливості для обробки поточного запиту;
різноманітні можливості для обробки запитів.
* [модулі](structure-modules.md): це самодостатні пакети, що включають в себе повністю всі ресурси для MVC.
Додаток може бути організовано з допомогою декількох модулів;
* [фільтри](structure-filters.md): це код, який повинен бути виконаний до і після оброки запиту контролерами;
* [віджети](structure-widgets.md): це об’єкти, які можуть включати в себе [представлення](structure-views.md).
Вони можуть містити різноманітну логіку і використовуватись в різноманітних представленнях.
Додаток може бути організовано за допомогою декількох модулів.
* [фільтри](structure-filters.md): це код, який повинен бути виконаний до і після обробки запиту контролерами.
* [віджети](structure-widgets.md): це об’єкти, які можуть бути вбудованими у [представлення](structure-views.md).
Вони можуть містити різноманітну логіку і можуть бути повто використаними у різних представленнях.
Нижче на діаграмі наведена структурна схема додатку:
На наступній діаграмі наведена структурна схема додатку:
![Стандартна структура додатку](../guide/images/application-structure.png)
\ No newline at end of file
![Статична структура додатку](images/application-structure.png)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment