Commit 89f67d95 by Alexander Makarov

Merge pull request #6522 from yiiframework-ua/uk_translate

[Uk] Guide corrections [skip ci]
parents 89566268 a7fed438
...@@ -49,7 +49,7 @@ All Rights Reserved. ...@@ -49,7 +49,7 @@ All Rights Reserved.
* [Огляд](runtime-overview.md) * [Огляд](runtime-overview.md)
* [Bootstrapping](runtime-bootstrapping.md) * [Bootstrapping](runtime-bootstrapping.md)
* [Роутінг та створення URL](runtime-routing.md) * [Маршрутизація та створення URL](runtime-routing.md)
* [Запити](runtime-requests.md) * [Запити](runtime-requests.md)
* [Відповіді](runtime-responses.md) * [Відповіді](runtime-responses.md)
* [Сесії та кукі](runtime-sessions-cookies.md) * [Сесії та кукі](runtime-sessions-cookies.md)
...@@ -112,7 +112,7 @@ All Rights Reserved. ...@@ -112,7 +112,7 @@ All Rights Reserved.
* [Авторизація](security-authorization.md) * [Авторизація](security-authorization.md)
* [Робота з паролями](security-passwords.md) * [Робота з паролями](security-passwords.md)
* **TBD** [Клієнти авторизації](security-auth-clients.md) * **TBD** [Клієнти авторизації](security-auth-clients.md)
* **TBD** [Кращі практики](security-best-practices.md) * [Кращі практики](security-best-practices.md)
Кешування Кешування
...@@ -131,7 +131,7 @@ RESTful веб-сервіси ...@@ -131,7 +131,7 @@ RESTful веб-сервіси
* [Швидкий старт](rest-quick-start.md) * [Швидкий старт](rest-quick-start.md)
* [Ресурси](rest-resources.md) * [Ресурси](rest-resources.md)
* [Контролери](rest-controllers.md) * [Контролери](rest-controllers.md)
* [Роутінг](rest-routing.md) * [Маршрутизація](rest-routing.md)
* [Форматування відповіді](rest-response-formatting.md) * [Форматування відповіді](rest-response-formatting.md)
* [Аутентифікація](rest-authentication.md) * [Аутентифікація](rest-authentication.md)
* [Обмеження частоти запитів](rest-rate-limiting.md) * [Обмеження частоти запитів](rest-rate-limiting.md)
...@@ -193,7 +193,7 @@ RESTful веб-сервіси ...@@ -193,7 +193,7 @@ RESTful веб-сервіси
* [Огляд](helper-overview.md) * [Огляд](helper-overview.md)
* [ArrayHelper](helper-array.md) * [ArrayHelper](helper-array.md)
* **TBD** [Html](helper-html.md) * [Html](helper-html.md)
* [Url](helper-url.md) * [Url](helper-url.md)
* **TBD** [Security](helper-security.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 @@ ...@@ -2,120 +2,149 @@
================ ================
Ви можете встановити Yii двома шляхами: використовуючи [Composer](http://getcomposer.org/) або завантаживши архів. Ви можете встановити Yii двома шляхами: використовуючи [Composer](http://getcomposer.org/) або завантаживши архів.
Перший варіант бажаніший тому, що дозволить встановити всі нові [розширення](structure-extensions.md) Перший варіант э бажанішим, тому що дозволить встановити всі нові [розширення](structure-extensions.md)
або оновити Yii однією командою. або оновити Yii однією командою.
> Примітка: На відміну від Yii 1, після стандартного встановлення Yii 2 ми отримуємо як фреймворк, так і шаблон додатка.
Встановлення за допомогою Composer <a name="installing-via-composer"></a> Встановлення за допомогою 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
``` При роботі з Windows, необхідно завантажити та запустити [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe).
curl -s http://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```
* на 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, встановити Yii можна виконавши наступну команду з директорії, яка доступна через Web:
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
```
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 (composer-asset-plugin)](https://github.com/francoispluchino/composer-asset-plugin/),
``` що дозволить керувати залежностями пакетів Bower та NPM за допомогою Composer. Цю команду потрібно виконати лише один раз.
composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic Друга команда встановить Yii у директорію під назвою `basic`. За бажанням, ви можете обрати іншу директорію.
```
Варто замітити, що нестабільну версію Yii неможна використовувати на робочому сервері. > Примітка: Під час встановлення може статися так, що 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> Встановлення з архіву <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. 2. Розпакуйте архів в директорію, доступну через Web.
3. Відредагуйте файл конфігурації `config/web.php` - необхідно заповнити секретний ключ до пункту `cookieValidationKey`
(це виконуєтся автоматично при вставленні Yii через Composer):
```php
// !!! встановити секретний ключ до наступного пункту (якщо порожній) - це необхідно для валідації кукі
'cookieValidationKey' => 'enter your secret key here',
```
Інші параметри встановлення <a name="other-installation-options"></a> Інші параметри встановлення <a name="other-installation-options"></a>
-------------------------- ---------------------------
Вище наведені інструкції по встановленню Yii у вигляді базового додатку готового до роботи. Вище наведені інструкції по встановленню 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> Перевірка встановлення <a name="verifying-installation"></a>
---------------------- ----------------------
Якщо ви встановили додаток в теку `basic` базової директорії вашого веб сервера і ім’я сервера `hostname`, Після встановлення, ви можете перевірити за допомогою браузера свій встановлений додаток Yii за наступним URL:
запустити додаток можна відкривши наступний 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 cd basic
php requirements.php php requirements.php
``` ```
Для коректної роботи фреймворка вам необхідно мати PHP, який відповідає його мінімальним вимогам. Основна вимога — PHP версії 5.4 и вище. Якщо ваш додаток працює з базою даних, необхідно встановити Для коректної роботи фреймворка вам необхідно мати PHP, який відповідає його мінімальним вимогам.
[розширення PHP PDO](http://www.php.net/manual/ru/pdo.installation.php) і відповідний драйвер Основна вимога — PHP версії 5.4 або вище. Якщо ваш додаток працює з базою даних, необхідно встановити
[розширення PHP PDO](http://www.php.net/manual/en/pdo.installation.php) та відповідний драйвер
(наприклад, `pdo_mysql` для MySQL). (наприклад, `pdo_mysql` для MySQL).
Налаштування веб сервера <a name="configuring-web-servers"></a> Налаштування веб серверів <a name="configuring-web-servers"></a>
----------------------- -------------------------
> Інформація: можете пропустити даний підрозділ, якщо ви тільки розпочали знайомитися з фреймворком і не розгортаєте його на робочому сервері. > Інформація: можете пропустити даний підрозділ, якщо ви тільки розпочали знайомитися з фреймворком
і не розгортаєте його на робочому сервері.
Додаток, встановлений за інструкціями, наведеними вище, буде працювати зразу як з [Apache](http://httpd.apache.org/), Додаток, встановлений за інструкціями, наведеними вище, буде працювати одразу як з [Apache HTTP server](http://httpd.apache.org/),
так і з [Nginx](http://nginx.org/) під Windows і Linux. так і з [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` На рабочому сервері вам напевно захочеться змінити URL додатку з `http://www.example.com/basic/web/index.php`
на `http://hostname/index.php`. Для цього необхідно змінити кореневу директорію в налаштуваннях веб сервера так, щоб ті на `http://www.example.com/index.php`. Для цього необхідно змінити кореневу директорію в налаштуваннях веб сервера на `basic/web`.
вказували на `basic/web`. Додатково можно сховати `index.php` відповідно описанню в розділі «[Розбір і генерація URL](runtime-url-handling.md)». Додатково можно сховати `index.php` із URL, як це описано у розділі [Маршрутизація та створення URL](runtime-routing.md).
Далі буде показано як налаштувати Apache і Nginx. Далі буде показано як налаштувати 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> ### Рекомендовані налаштування Apache <a name="recommended-apache-configuration"></a>
Добавте наступне в `httpd.conf` Apache або в конфігураційний файл віртуального хоста. Не забудьте замінити Додайте наступний код до файлу конфігурации Apache `httpd.conf` або в конфігураційний файл віртуального хоста.
`path/to/basic/web` на коректний шлях до `basic/web`. Не забудьте замінити `path/to/basic/web` на коректний шлях до `basic/web`.
``` ```
# Встановлюємо кореневою директорією "basic/web" # Встановлюємо кореневою директорією "basic/web"
DocumentRoot "path/to/basic/web" DocumentRoot "path/to/basic/web"
<Directory "path/to/basic/web"> <Directory "path/to/basic/web">
# використаємо mod_rewrite для підтримки гарних URL
RewriteEngine on RewriteEngine on
# Якщо запитуваний файл або директорія існують - звертаємось до них напряму
# Якщо запитувана в URL директорія або файл відсутні звертаємось до них напряму
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-d
# Якщо ні - перенаправляємо запит на index.php # Якщо ні - перенаправляємо запит на index.php
...@@ -128,8 +157,9 @@ DocumentRoot "path/to/basic/web" ...@@ -128,8 +157,9 @@ DocumentRoot "path/to/basic/web"
### Рекомендовані налаштування Nginx <a name="recommended-nginx-configuration"></a> ### Рекомендовані налаштування Nginx <a name="recommended-nginx-configuration"></a>
PHP повинен бути встановлений як [FPM SAPI](http://php.net/manual/ru/install.fpm.php) для [Nginx](http://wiki.nginx.org/). Для використання [Nginx](http://wiki.nginx.org/) вам потрібно встановити PHP як [FPM SAPI](http://php.net/install.fpm).
Використовуйте наступні параметри Nginx і не забудьте замінити `path/to/basic/web` на коректний шлях до `basic/web`. Використовуйте наступні параметри Nginx, замінивши `path/to/basic/web` на коректний шлях до `basic/web`,
а `mysite.local` на бажаний домен.
``` ```
server { server {
...@@ -137,21 +167,21 @@ server { ...@@ -137,21 +167,21 @@ server {
client_max_body_size 128M; client_max_body_size 128M;
listen 80; ## listen for ipv4 listen 80; ## listen for ipv4
#listen [::]:80 default_server ipv6only=on; ## слухаєм ipv6 #listen [::]:80 default_server ipv6only=on; ## слухаємо ipv6
server_name mysite.local; server_name mysite.local;
root /path/to/basic/web; root /path/to/basic/web;
index index.php; index index.php;
access_log /path/to/project/log/access.log main; access_log /path/to/basic/log/access.log main;
error_log /path/to/project/log/error.log; error_log /path/to/basic/log/error.log;
location / { location / {
# Перенаправляємо всі запити до неіснуючих директорій або файлів на index.php # Перенаправляємо всі запити від неіснуючих директорій або файлів на index.php
try_files $uri $uri/ /index.php?$args; try_files $uri $uri/ /index.php?$args;
} }
# розкоментуйте строки нище для запобігання обробки Yii звернень до неіснуючих статичних файлів # розкоментуйте строки нижче для запобігання обробки звернень Yii до неіснуючих статичних файлів
#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
# try_files $uri =404; # try_files $uri =404;
#} #}
...@@ -161,6 +191,7 @@ server { ...@@ -161,6 +191,7 @@ server {
include fastcgi.conf; include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000; fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php5-fpm.sock; #fastcgi_pass unix:/var/run/php5-fpm.sock;
try_files $uri =404;
} }
location ~ /\.(ht|svn|git) { location ~ /\.(ht|svn|git) {
...@@ -169,7 +200,7 @@ server { ...@@ -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). Вони зберігають багато так званих Додатки є [сервіс локаторами](concept-service-locators.md). Вони зберігають багато так званих
*компонентів додатку*, які надають різноманітні інструменти для опрацювання запитів. Наприклад, *компонентів додатку*, які надають різноманітні інструменти для обробки запитів. Наприклад,
компоненти `urlManager` відповідає за маршрутизацію веб запитів до потрібного контролера; компонент `db` надає інструменти для работи з базою даних; і т. д. компонент `urlManager` відповідає за маршрутизацію веб запитів до потрібного контролера;
компонент `db` надає інструменти для работи з базою даних; і т. д.
Кожний компонент додатка має свій унікальний ID, який дозволяє ідентифікувати його серед інших різноманітних компонентів Кожний компонент додатка має свій унікальний ID, який дозволяє ідентифікувати його серед інших різноманітних компонентів
в одному і тому ж додатку. Ви можете отримати доступ до компонента наступним чином: в одному і тому ж додатку. Ви можете отримати доступ до компонента наступним чином:
```php ```php
\Yii::$app->ComponentID \Yii::$app->componentID
``` ```
Наприклад, ви можете використовувати `\Yii::$app->db` для отримання [[yii\db\Connection|з’єднання з БД]], Наприклад, ви можете використовувати `\Yii::$app->db` для отримання [[yii\db\Connection|з’єднання з БД]],
і `\Yii::$app->cache` для отримання доступу до основного компонента [[yii\caching\Cache|кеша]], зареєстрованого в додатку. і `\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 ```php
[ [
'components' => [ 'components' => [
// реєстрація "cache" компонента з допомогою назви класу // реєстрація "cache" компонента за допомогою назви класу
'cache' => 'yii\caching\ApcCache', 'cache' => 'yii\caching\ApcCache',
// реєстрація "db" компонента з допомогою масива конфігурації // реєстрація "db" компонента за допомогою масива конфігурації
'db' => [ 'db' => [
'class' => 'yii\db\Connection', 'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo', 'dsn' => 'mysql:host=localhost;dbname=demo',
...@@ -32,7 +37,7 @@ ...@@ -32,7 +37,7 @@
'password' => '', 'password' => '',
], ],
// реєстрація "search" компонента з допомогою анонімної функції // реєстрація "search" компонента за допомогою анонімної функції
'search' => function () { 'search' => function () {
return new app\components\SolrService; return new app\components\SolrService;
}, },
...@@ -41,47 +46,74 @@ ...@@ -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> ## Вбудовані компоненти додатку <a name="core-application-components"></a>
В Yii є декілька *вбудованих* компонентів додатку, з фіксованими ID і конфігураціями за замовчуванням. Наприклад, В Yii є декілька *вбудованих* компонентів додатку із фіксованими ID та конфігураціями за замовчуванням.
компонент [[yii\web\Application::request|request]] використовується для отримання інформації про запит користувача і розбору його в Наприклад, компонент [[yii\web\Application::request|request]] використовується для збору інформації про запит
певний [маршрут](runtime-routing.md); компонент [[yii\base\Application::db|db]] являє собою з’єднання з базою даних, користувача і розбору його у певний [маршрут](runtime-routing.md); компонент [[yii\base\Application::db|db]]
через яке ви можете виконувати запити. Саме з допомогою цих вбудованих компонентів Yii додатки можуть обрабляти являє собою з’єднання з базою даних, через яке ви можете виконувати запити.
запит користувача. Саме з допомогою цих вбудованих компонентів Yii додатки можуть обрабляти запит користувача.
Нижче наведений перелік вбудованих компонентів додатку. Ви можете конфігурувати їх так само як і інші компоненти додатку. Нижче наведено перелік вбудованих компонентів додатку. Ви можете конфігурувати їх так само, як і інші компоненти додатку.
Коли ви конфігуруєте вбудований компонент додатку і не вказуєте клас цього компонента, то буде використовуватись значення за замовчуванням. Коли ви конфігуруєте вбудований компонент додатку і не вказуєте клас цього компонента, то буде використовуватись
значення за замовчуванням.
* [[yii\web\AssetManager|assetManager]]: використовується для керування і відображенням ресурсів додатку. * [[yii\web\AssetManager|assetManager]]: використовується для керування і відображенням ресурсів додатку.
Більш детальна інформація представлена ​​в розділі [Ресурси](output-assets.md); Більш детальна інформація наведена у розділі [Ресурси](output-assets.md).
* [[yii\db\Connection|db]]: являє собою з’єднання з базою даних, через яке ви можете виконувати запити. * [[yii\db\Connection|db]]: являє собою з’єднання з базою даних, через яке ви можете виконувати запити.
Зверніть увагу, що коли конфігуруєте даний компонент, ви маєте вказати клас компонента так як і решту необхідних параметрів, а саме такі як [[yii\db\Connection::dsn]]. Зверніть увагу, що, коли конфігуруєте даний компонент, ви маєте вказати клас компонента, разом із рештою
Більш детальна інформація представлена ​​в розділі [Об’єкти доступу до даних (DAO)](db-dao.md); необхідних параметрів, наприклад [[yii\db\Connection::dsn]].
* [[yii\base\Application::errorHandler|errorHandler]]: здійснює опрацювання PHP помилок і виключень. Більш детальна інформація наведена у розділі [Об’єкти доступу до даних (DAO)](db-dao.md).
Більш детальна інформація представлена ​​в розділі [Обробка помилок](runtime-handling-errors.md); * [[yii\base\Application::errorHandler|errorHandler]]: здійснює обработку PHP помилок і виключень.
* [[yii\base\Formatter|formatter]]: форматує дані для відображення їх кінцевому користувачу. Наприклад, число може Більш детальна інформація наведена у розділі [Обробка помилок](runtime-handling-errors.md).
бути зображене з різноманітними розділителями, дата може бути зображена в форматі `long`. * [[yii\i18n\Formatter|formatter]]: форматує дані для відображення їх кінцевому користувачу. Наприклад, число може
Більш детальна інформація представлена ​​в розділі [Форматування даних](output-formatting.md); бути відображене із різноманітними роздільниками, дата може бути зображена у розширеному форматі.
Більш детальна інформація наведена у розділі [Форматування даних](output-formatter.md).
* [[yii\i18n\I18N|i18n]]: використовується для перекладу повідомлень і форматування. * [[yii\i18n\I18N|i18n]]: використовується для перекладу повідомлень і форматування.
Більш детальна інформація представлена ​​в розділі [Інтернаціоналізація](tutorial-i18n.md); Більш детальна інформація наведена у розділі [Інтернаціоналізація](tutorial-i18n.md).
* [[yii\log\Dispatcher|log]]: обробка і маршрутизація логів. * [[yii\log\Dispatcher|log]]: обробка і маршрутизація логів.
Більш детальна інформація представлена ​​в розділі [Логування](runtime-logging.md); Більш детальна інформація наведена у розділі [Логування](runtime-logging.md).
* [[yii\swiftmailer\Mailer|mail]]: надає можливості для побудови і розсилки поштових повідомлень. * [[yii\swiftmailer\Mailer|mail]]: надає можливості для побудови і відправки поштових повідомлень.
Більш детальна інформація представлена ​​в розділі [Відправлення пошти](tutorial-mailing.md); Більш детальна інформація наведена у розділі [Відправлення пошти](tutorial-mailing.md).
* [[yii\base\Application::response|response]]: являє собою дані від серверу, які будуть направлені користувачу. * [[yii\base\Application::response|response]]: являє собою об’єкт відповіді сервера кінцевим користувачам.
Більш детальна інформація представлена ​​в розділі [Відповіді](runtime-responses.md); Більш детальна інформація наведена у розділі [Відповіді](runtime-responses.md).
* [[yii\base\Application::request|request]]: являє собою запит, отриманий від кінцевого користувача. * [[yii\base\Application::request|request]]: являє собою об’єкт запиту, який сервер отримує від кінцевих користувачів.
Більш детальна інформація представлена ​​в розділі [Запити](runtime-requests.md); Більш детальна інформація наведена у розділі [Запити](runtime-requests.md).
* [[yii\web\Session|session]]: інформація про сесії. Даний компонент доступний тільки в [[yii\web\Application|веб додатках]]. * [[yii\web\Session|session]]: надає інформація про сесії.
Більш детальна інформація представлена ​​в розділі [Сесії і куки](runtime-sessions-cookies.md); Даний компонент доступний тільки у [[yii\web\Application|веб додатках]].
Більш детальна інформація наведена у розділі [Сесії і куки](runtime-sessions-cookies.md).
* [[yii\web\UrlManager|urlManager]]: використовується для розбору і побудови URL. * [[yii\web\UrlManager|urlManager]]: використовується для розбору і побудови URL.
Більш детальна інформація представлена ​​в розділі [Розбір і генерація URL](runtime-url-handling.md); Більш детальна інформація наведена у розділі [Маршрутизація та створення URL](runtime-routing.md).
* [[yii\web\User|user]]: являє собою інформацію авторизованого користувача. * [[yii\web\User|user]]: являє собою інформацію авторизованого користувача.
Даний компонент доступний тільки в [[yii\web\Application|веб додатках]]. Даний компонент доступний тільки у [[yii\web\Application|веб додатках]].
Більш детальна інформація представлена ​​в розділі [Аутентифікація](security-authentication.md); Більш детальна інформація наведена у розділі [Аутентифікація](security-authentication.md).
* [[yii\web\View|view]]: використовується для відображення представлень. * [[yii\web\View|view]]: використовується для відображення представлень.
Більш детальна інформація представлена ​​в розділі [Представлення](structure-views.md). Більш детальна інформація наведена у розділі [Представлення](structure-views.md).
Додатки Додатки
========== =======
Додатки це об’єкти, які керують всією структурою і життєвим циклом прикладної системи Yii. Додатки це об’єкти, які керують всією структурою і життєвим циклом прикладної системи Yii.
Кожна Yii прикладна система містить у собі один об’єкт додатка, який створбється у [вхідному скрипті](structure-entry-scripts.md) Кожна Yii прикладна система містить у собі один об’єкт додатка, який створюється у
і глобально доступний через `\Yii::$app`. [вхідному скрипті](structure-entry-scripts.md) і глобально доступний через `\Yii::$app`.
> Інформація: В залежності від контексту, коли ми говорим "додаток", це може означати як об’єкт додатка, так і прикладну систему додатка вцілому. > Інформація: В залежності від контексту, коли ми говорим "додаток", це може означати як об’єкт додатка,
так і прикладну систему додатка вцілому.
Існує два вида додатків: [[yii\web\Application|веб додатки]] і [[yii\console\Application|консольні додатки]]. Існує два типи додатків: [[yii\web\Application|веб додатки]] та [[yii\console\Application|консольні додатки]].
Як можна здогадатись із назви, перший тип в основному займається обробкою веб запитів, в той час як останній - консольних команд. Як можна здогадатися із назв, перший тип, в основному, займається обробкою веб запитів, а другий - консольними командами.
## Конфігурації додатка <a name="application-configurations"></a> ## Конфігурації додатка <a name="application-configurations"></a>
Коли [вхідний скрипт](structure-entry-scripts.md) створює додаток, він завантажить [конфігурацію](concept-configurations.md) Коли [вхідний скрипт](structure-entry-scripts.md) створює додаток, він завантажить
і примінить її до додатка, наприклад: [конфігурацію](concept-configurations.md) та застосує її до додатка, наприклад:
```php ```php
require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/autoload.php');
...@@ -27,45 +28,57 @@ $config = require(__DIR__ . '/../config/web.php'); ...@@ -27,45 +28,57 @@ $config = require(__DIR__ . '/../config/web.php');
(new yii\web\Application($config))->run(); (new yii\web\Application($config))->run();
``` ```
Так як і звичайні [конфігурації](concept-configurations.md), конфігурації додатка вказують як слід ініціювати властивості об’єктів додатка. Через те, що конфігурації додатків часто є складними, вони розбиваються на декілька Як і звичайні [конфігурації](concept-configurations.md), конфігурації додатка вказують як саме слід ініціювати
[конфігураційних файлів](concept-configurations.md#configuration-files), наприклад, `web.php` файл в наведеному вище прикладі. властивості об’єктів додатка. Через те, що конфігурації додатків часто є складними, вони розбиваються на декілька
[конфігураційних файлів](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> ### Об’язкові властивості <a name="required-properties"></a>
В кодному додатку, ви маєте налаштувати мінімум дві властивості: [[yii\base\Application::id|id]] В кожному додатку, ви маєте налаштувати мінімум дві властивості: [[yii\base\Application::id|id]]
і [[yii\base\Application::basePath|basePath]]. та [[yii\base\Application::basePath|basePath]].
#### [[yii\base\Application::id|id]] <a name="id"></a> #### [[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]] <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` є зумовленим і вказує на дану директорію. Інші шляхи можуть бути визначеними шляхом використання псевдоніму шляху, наприклад, Властивість [[yii\base\Application::basePath|basePath]] часто використовується для важливих шляхів (наприклад, шлях до
`@app/runtime`. runtime директорії). Саме з цієї причини, псевдонім шляху `@app` є зумовлений вказувати на дану директорію.
Похідні шляхи потім можуть бути сформовані за допомогою цього псевдоніму шляху (наприклад, `@app/runtime` для
звертання до runtime директорії).
### Важливі властивості <a name="important-properties"></a> ### Важливі властивості <a name="important-properties"></a>
Властивості, перелічені в даному підрозділі, частіш за все повинні бути налаштовані так як вони можуть відрізнятися в різних додатках. Властивості, перелічені в даному підрозділі, частіш за все повинні бути визначені, тому що вони можуть
відрізнятися у різних додатках.
#### [[yii\base\Application::aliases|aliases]] <a name="aliases"></a> #### [[yii\base\Application::aliases|aliases]] <a name="aliases"></a>
Дана властивість дозволяє налаштувати вам безліч [псевдонімів](concept-aliases.md) в рамках масива. Дана властивість дозволяє налаштувати вам безліч [псевдонімів](concept-aliases.md) у рамках масиву.
Ключами масива є імена псевдонімів, а значеннами - відповідні значення шляхів. Наприклад, Ключами масива є імена псевдонімів, а значеннами - відповідні значення шляхів. Наприклад,
```php ```php
...@@ -77,20 +90,24 @@ $config = require(__DIR__ . '/../config/web.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|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'); ...@@ -101,20 +118,39 @@ $config = require(__DIR__ . '/../config/web.php');
'demo', 'demo',
// назва класа // назва класа
'app\components\TrafficMonitor', 'app\components\Profiler',
// масив конфігурації // масив конфігурації
[ [
'class' => 'app\components\Profiler', 'class' => 'app\components\Profiler',
'level' => 3, '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 ```php
if (YII_ENV_DEV) { if (YII_ENV_DEV) {
...@@ -127,14 +163,19 @@ 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::catchAll|catchAll]] <a name="catchAll"></a>
Дана властивість підтримується тільки [[yii\web\Application|веб додатками]].Вона вказує на [події контролера](structure-controllers.md), які мусять опрацьовувати всі вхідні запити від користувача. В основному це використовується коли додаток знаходиться в режимі обслуговування і мусить опрацьовувати всі запити через одну подію. Дана властивість підтримується тільки [[yii\web\Application|веб додатками]]. Вона вказує на
[дії контролера](structure-controllers.md), які мусять обробляти всі вхідні запити від користувача. Переважно,
це використовується, коли додаток знаходиться в режимі обслуговування і повинен обробити всі запити через одну дію.
Конфігурація це масив, перший елемент якого вказує на маршрут події. Решта елементів в форматі ключ-значення вказують на додаткові параметри, які мають бути передані події. Наприклад, Конфігурація є масивом, перший елемент якого вказує на маршрут події. Решта елементів масиву у форматі ключ-значення
вказують на додаткові параметри, які мають бути передані події. Наприклад,
```php ```php
[ [
...@@ -149,7 +190,8 @@ if (YII_ENV_DEV) { ...@@ -149,7 +190,8 @@ if (YII_ENV_DEV) {
#### [[yii\base\Application::components|components]] <a name="components"></a> #### [[yii\base\Application::components|components]] <a name="components"></a>
Дана властивість є найважливішою. Вона дозволяє вам вказати перелік компонентів під назвою [компоненти додатку](#structure-application-components.md), які ви можете використовувати в інших місцях. Наприклад, Дана властивість є найважливішою. Вона дозволяє вам зареєструвати іменні компоненти у
[компонентах додатку](structure-application-components.md), які ви можете використовувати в інших місцях. Наприклад,
```php ```php
[ [
...@@ -165,17 +207,22 @@ if (YII_ENV_DEV) { ...@@ -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). Більш детальна інформація наведена в розділі [Компоненти додатка](structure-application-components.md).
#### [[yii\base\Application::controllerMap|controllerMap]] <a name="controllerMap"></a> #### [[yii\base\Application::controllerMap|controllerMap]] <a name="controllerMap"></a>
Дана властивість дозволяє вам встановлювати залежності між ID контролера і його класом. За замовчуванням, Yii встановлює відповідність між ID контролера і його класом згідно даної [домовленості](#controllerNamespace) (таким чином, Дана властивість дозволяє вам встановлювати відповідність між ID контролера та його класом. За замовчуванням,
ID `post` буде відповідати `app\controllers\PostController` ). За допомогою налаштування даної властивості ви можете змінити домовленість для потрібних контролерів. В наведеному прикладі, `account` буде відповідати `app\controllers\UserController`, в той час як `article` буде відповідати `app\controllers\PostController`. Yii встановлює відповідність між ID контролера та його класом згідно [домовленості](#controllerNamespace)
(таким чином, ID `post` буде відповідати `app\controllers\PostController`). За допомогою налаштування даної властивості
ви можете змінити домовленість для необхідних контролерів. У наведеному прикладі, `account` буде
відповідати `app\controllers\UserController`, в той час, як `article` буде відповідати `app\controllers\PostController`.
```php ```php
[ [
...@@ -191,49 +238,59 @@ ID `post` буде відповідати `app\controllers\PostController` ). З ...@@ -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> #### [[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> #### [[yii\base\Application::language|language]] <a name="language"></a>
Дана властивість вказує на мову додатка, на якій вміст сторінки мусить бути зображений кінцевому користувачу. Дана властивість вказує на мову додатка, на якій додаток повинен відображати зміст кінцевому користувачу.
За замовчуванням, значення даної властивості рівне `en`, що значить "Англійський". Якщо ваш додаток підтримує декілька мов, ви мусите налаштувати дану властивість. За замовчуванням, значення даної властивості рівне `en`, означаючи англійську мову.
Якщо ваш додаток підтримує декілька мов, ви необхідно налаштувати дану властивість.
Значення даної властивості визначається декількома різними аспектами [інтернаціоналізації](tutorial-i18n.md), в тому числі Значення даної властивості визначає кілька різних аспектів [інтернаціоналізації](tutorial-i18n.md), в тому числі
перекладом повідомлень, форматуванням дат, форматуванням чисел, і т. п. Наприклад, віджет [[yii\jui\DatePicker]] використовує дану властивість для визначення мови за замовчуванням, на якій має бути зображений календар і формат даних для календаря. переклади повідомлень, форматування дат, форматування чисел, і т. п. Наприклад, віджет [[yii\jui\DatePicker]]
використовує дану властивість для визначення мови за замовчуванням, на якій має бути зображений календар і
формат даних для календаря.
Рекомендується, щоб ви вказували мову в рамках стандатра [IETF](http://en.wikipedia.org/wiki/IETF_language_tag). Рекомендується вказувати мову у рамках стандатру [IETF](http://en.wikipedia.org/wiki/IETF_language_tag).
Наприклад, для англійської мови використовується `en`, в той час як для англійської в США - `en-US`. Наприклад, для англійської мови використовується `en`, в той час як для англійської в США - `en-US`.
Більш детальна інформація наведена в розділі [Інтернаціоналізація](tutorial-i18n.md). Більш детальна інформація наведена у розділі [Інтернаціоналізація](tutorial-i18n.md).
#### [[yii\base\Application::modules|modules]] <a name="modules"></a> #### [[yii\base\Application::modules|modules]] <a name="modules"></a>
Дана властивість вказує на [модулі](structure-modules.md), які містяться в додатку. Дана властивість визначає [модулі](structure-modules.md), які містить додаток.
Значеннями властивості можуть бути масиви імен класів модулів або [конфігурацій](concept-configurations.md), а ключами - Значенням властивості є масив імен класів модулів або [конфігурацій](concept-configurations.md), а ключами цього масиву
ID модулів. Наприклад, виступають ID модулів. Наприклад,
```php ```php
[ [
'modules' => [ 'modules' => [
// a "booking" module specified with the module class // модуль "booking" визначено класом модуля
'booking' => 'app\modules\booking\BookingModule', 'booking' => 'app\modules\booking\BookingModule',
// a "comment" module specified with a configuration array // модуль "comment" визначено масивом конфігурації
'comment' => [ 'comment' => [
'class' => 'app\modules\comment\CommentModule', 'class' => 'app\modules\comment\CommentModule',
'db' => 'db', 'db' => 'db',
...@@ -242,19 +299,23 @@ ID модулів. Наприклад, ...@@ -242,19 +299,23 @@ ID модулів. Наприклад,
] ]
``` ```
Більш детальна інформація наведена в розділі [Модулі](structure-modules.md). Більш детальна інформація наведена у розділі [Модулі](structure-modules.md).
#### [[yii\base\Application::name|name]] <a name="name"></a> #### [[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> #### [[yii\base\Application::params|params]] <a name="params"></a>
Дана властивість описує масив глобально доступних параметрів додатка. Замість того, щоб використовувати жорстко фіксовані числа і строки у вашому коді, краще оголосити їх параметрами додатка в єдиному місці і використовувати в необхідних місцях кода. Наприклад, ви можете визначити розмір прев’ю для зображеннь наступним чином: Дана властивість описує масив глобально доступних параметрів додатка. Замість того, щоб використовувати жорстко
фіксовані числа і строки у вашому коді, краще оголосити їх параметрами додатка в одному місці і використовувати
в необхідних місцях коду. Наприклад, ви можете визначити розмір прев’ю-зображень для зображеннь наступним чином:
```php ```php
[ [
...@@ -264,68 +325,88 @@ ID модулів. Наприклад, ...@@ -264,68 +325,88 @@ ID модулів. Наприклад,
] ]
``` ```
Потім, коли вам потрібно використати дані значення у вашому коді, ви робите так як показано нижче: Потім, коли вам потрібно використати дані значення у вашому коді, ви можете зробити це наступним чином:
```php ```php
$size = \Yii::$app->params['thumbnail.size']; $size = \Yii::$app->params['thumbnail.size'];
$width = \Yii::$app->params['thumbnail.size'][0]; $width = \Yii::$app->params['thumbnail.size'][0];
``` ```
Якщо пізніше вам знадобиться змінити розмір прев’ю зображення, то потрібно буде змінити лише це значення в налаштуваннях додатка не торкаючись залежного коду. Якщо пізніше вам знадобиться змінити розмір прев’ю зображення, то вам потрібно буде змінити це значення лише у
конфігураційному файлі додатка, не змінюючи будь-який залежний код.
#### [[yii\base\Application::sourceLanguage|sourceLanguage]] <a name="sourceLanguage"></a> #### [[yii\base\Application::sourceLanguage|sourceLanguage]] <a name="sourceLanguage"></a>
Дана властивість вказує мову на якій написаний код додатка. За замовчуванням значення рівне `'en-US'`, що значить "Англійський" (США). Ви мусите налаштувати дану властивість відповідним чином, якщо зміст у вашому коді вказаний не англійською. Дана властивість вказує мову, на якій написаний код додатка. За замовчуванням значення рівне `'en-US'`,
що означає англійську мову (США). Ви повинні змінити дану властивість, якщо мовою змісту у вашому коді
є не англійська мова.
Аналогічно властивості [language](#language), ви мусите вказати дану властивість в рамках стандарту [IETF](http://en.wikipedia.org/wiki/IETF_language_tag). Аналогічно властивості [language](#language), ви повинні вказати дану властивість у рамках стандарту
Наприклад, для англійської мови використовується `en`, в той час як для англійської в США - `en-US`. [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> #### [[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 ```php
[ [
// Europe/Kiev для України // 'Europe/Kiev' для України
'timeZone' => 'America/Los_Angeles', 'timeZone' => 'America/Los_Angeles',
] ]
``` ```
#### [[yii\base\Application::version|version]] <a name="version"></a> #### [[yii\base\Application::version|version]] <a name="version"></a>
Дана властивість вказує на версію додатка. За замовчуванням значення рівне `'1.0'`. Ви можете не використовувати дану властивість, якщо ваш код не використовує її. Дана властивість вказує на версію додатка. За замовчуванням значення рівне `'1.0'`. Ви можете не змінювати
дану властивість, якщо ваш код не використовує її.
### Корисні властивості <a name="useful-properties"></a> ### Корисні властивості <a name="useful-properties"></a>
Властивості, які перераховані в даному розділі не є часто конфігуруємими, так як їх значення за замовчуванням відповідають загальноприйнятим домовленостям. Однак, ви можете їх налаштувати, якщо вам потрібно використовувати інші значення. Властивості, які перераховані в даному розділі, не є часто змінюваними, так як їх значення за замовчуванням
відповідають загальноприйнятим домовленостям. Однак, ви можете їх налаштувати, якщо вам потрібно використовувати
інші значення.
#### [[yii\base\Application::charset|charset]] <a name="charset"></a> #### [[yii\base\Application::charset|charset]] <a name="charset"></a>
Властивість вказує кодування, яке використовує додаток. За замовчуванням значення рівне `'UTF-8'`, яке мусить бути залишеним для більшості додатків, тільки якщо ви не працюєте з устарівшим кодом, який використовує більшу кількість даних не юнікода. Властивість вказує кодування, яке використовує додаток. За замовчуванням значення рівне `'UTF-8'`,
яке має бути незмінним для більшості додатків, тільки якщо ви не працюєте із застарілим кодом, який використовує
значний об’єм не юнікод даних.
#### [[yii\base\Application::defaultRoute|defaultRoute]] <a name="defaultRoute"></a> #### [[yii\base\Application::defaultRoute|defaultRoute]] <a name="defaultRoute"></a>
Властивість вказує [маршрут](runtime-routing.md), який мусить використовувати додаток, коли він не вказаний у вхідному запиті. Маршрут може складатись із ID модуля, ID контролера і/або ID події. Наприклад, `help`, Властивість вказує [маршрут](runtime-routing.md), який повинен використовувати додаток, коли його не вказано у
`post/create`, `admin/post/create`. Якщо подію не вказано, то буде використано значення за замовчуванням вказане в [[yii\base\Controller::defaultAction]]. вхідному запиті. Маршрут може складатись із 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> #### [[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 ```php
[ [
...@@ -346,57 +427,72 @@ $width = \Yii::$app->params['thumbnail.size'][0]; ...@@ -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). Розширення також може визначати декілька [псевдонімів](concept-aliases.md).
#### [[yii\base\Application::layout|layout]] <a name="layout"></a> #### [[yii\base\Application::layout|layout]] <a name="layout"></a>
Дана властивість вказує ім’я шаблону за замовчуванням, який мусить бути використаний при формувані [представлення](structure-views.md). Дана властивість визначає ім’я шаблону за замовчуванням, який мусить бути використаний при формувані
Значення за замовчуванням рівне `'main'`, яке означає, що має бути використаний шаблон `main.php` в [директорії шаблонів](#layoutPath). [представлення](structure-views.md). Значення за замовчуванням рівне `'main'`, яке означає, що має бути використаний
Якщо обидві властивості [директорія шаблонів](#layoutPath) і [директорія представлень](#viewPath) мають значення за замовчуванням, то файл шаблону за замовчуванням може бути представлений псевдонімом шляху як `@app/views/layouts/main.php`. шаблон `main.php` в [директорії шаблонів](#layoutPath). Якщо обидві властивості, [директорія шаблонів](#layoutPath)
та [директорія представлень](#viewPath), приймають значення за замовчуванням, то файл шаблону за замовчуванням може
бути представлений псевдонімом шляху як `@app/views/layouts/main.php`.
Для відключення використання шаблону, ви можете вказати дану властивість як `false`, хоча це використовується дуже рідко. Для відключення використання шаблону, ви можете вказати дану властивість як `false`, однак це є дуже рідкісним випадком.
#### [[yii\base\Application::layoutPath|layoutPath]] <a name="layoutPath"></a> #### [[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> #### [[yii\base\Application::runtimePath|runtimePath]] <a name="runtimePath"></a>
Властивість вказує шлях, по якому зберігаються тимчасові файли, такі як: лог файли, кеш файли. За замовчуванням значення рівне директорії, яка преставлена псевдонімом шляху `@app/runtime`. Дана властивість визначає шлях, по якому зберігаються тимчасові файли, такі як: лог файли, кеш файли.
За замовчуванням це значення рівне директорії, яка преставлена псевдонімом шляху `@app/runtime`.
Ви можете налаштувати дану властивість як директорію або як [псевдонім](concept-aliases.md) шляху. Зверніть увагу, що дана директорія має бути доступна для запису процесом, який запускає додаток. Також директорія має бути захищена від доступу кінцевим користувачам, файли які зберігаються в ній можуть містити важливу інформацію. Ви можете налаштувати дану властивість як директорію або як [псевдонім](concept-aliases.md) шляху. Зверніть увагу,
що дана директорія має бути доступна для запису процесом, який виконує додаток. Також директорія має
бути захищена від доступу кінцевим користувачам, оскільки файли, які зберігаються в ній,, можуть містити важливу інформацію.
Для спрощення роботи з даною директорією, Yii надає зумовлений псевдонім шляху `@runtime`. Для спрощення роботи з даною директорією, Yii надає зумовлений псевдонім шляху `@runtime`.
#### [[yii\base\Application::viewPath|viewPath]] <a name="viewPath"></a> #### [[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> #### [[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 надає зумовлений псевдонім шляху `@vendor`.
#### [[yii\console\Application::enableCoreCommands|enableCoreCommands]] <a name="enableCoreCommands"></a> #### [[yii\console\Application::enableCoreCommands|enableCoreCommands]] <a name="enableCoreCommands"></a>
Дана властивість підтримується тільки [[yii\console\Application|консольними додатками]]. Вона вказує чи потрібно використовувати вбудовані в Yii консольні команди. Значення за замовчуванням рівне `true`. Дана властивість підтримується тільки [[yii\console\Application|консольними додатками]]. Вона вказує чи потрібно
використовувати вбудовані в Yii консольні команди. Значення за замовчуванням рівне `true`.
## Події додатка <a name="application-events"></a> ## Події додатка <a name="application-events"></a>
Протягом життєвого циклу додатка, виникає декілька подій. Ви можете призначати обробники подій в конфігурації додатка наступним чином: Додаток викликає декілька подій під час свого життєвого циклу обробки запиту.
Ви можете приєднати обробники подій в конфігурації додатка наступним чином:
```php ```php
[ [
...@@ -406,10 +502,11 @@ $width = \Yii::$app->params['thumbnail.size'][0]; ...@@ -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 ```php
\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) { \Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) {
...@@ -419,27 +516,33 @@ $width = \Yii::$app->params['thumbnail.size'][0]; ...@@ -419,27 +516,33 @@ $width = \Yii::$app->params['thumbnail.size'][0];
### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] <a name="beforeRequest"></a> ### [[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]; ...@@ -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). Ця подія виникає *після* виконання [дії контролера](structure-controllers.md). Справжнє ім’я події - `afterAction`.
Справжнє ім’я події - `afterAction`.
Подія є об’єктом [[yii\base\ActionEvent]]. Через властивість [[yii\base\ActionEvent::result]] обробник події може отримати доступ і змінити значення виконання події контролера. Параметр події є об’єктом [[yii\base\ActionEvent]]. Через властивість [[yii\base\ActionEvent::result]]
обробник події може отримати доступ або змінити результат дії контролера. Наприклад,
Наприклад,
```php ```php
[ [
...@@ -477,24 +581,30 @@ $width = \Yii::$app->params['thumbnail.size'][0]; ...@@ -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> ## Життєвий цикл додатка <a name="application-lifecycle"></a>
Коли [вхідний скрипт](structure-entry-scripts.md) виконується для обробки запиту, додаток буде розвиватись згідно наступного життєвого циклу: ![Життєвий цикл додатка](images/application-lifecycle.png)
Коли [вхідний скрипт](structure-entry-scripts.md) виконується для обробки запиту, додаток пройде наступний
життєвий цикл:
1. Вхідний скрипт завантажує конфігурацію додатка в якості масива; 1. Вхідний скрипт завантажує конфігурацію додатка у якості масива.
2. Вхідний скрипт створює новий об’єкт додатка: 2. Вхідний скрипт створює новий об’єкт додатка:
* Викликається метод [[yii\base\Application::preInit()|preInit()]], який налаштовує деякі життєво важливі властивості додатка, такі як [[yii\base\Application::basePath|basePath]]; * Викликається метод [[yii\base\Application::preInit()|preInit()]], який налаштовує деякі життєво важливі властивості
* Реєструється [[yii\base\Application::errorHandler|обробник помилок]]; додатка, як наприклад [[yii\base\Application::basePath|basePath]].
* Налаштовуються властивості додатку; * Реєструється [[yii\base\Application::errorHandler|обробник помилок]].
* Викликається метод [[yii\base\Application::init()|init()]], котрий потім викликає метод [[yii\base\Application::bootstrap()|bootstrap()]] для початкового завантаження компонентів. * Налаштовуються властивості додатку.
* Викликається метод [[yii\base\Application::init()|init()]], який далі викликає метод
[[yii\base\Application::bootstrap()|bootstrap()]] для початкового завантаження компонентів.
3. Вхідний скрипт викликає метод [[yii\base\Application::run()]] для запуску додатка: 3. Вхідний скрипт викликає метод [[yii\base\Application::run()]] для запуску додатка:
* Виникає подія [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]]; * Ініціюється подія [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]].
* Обробка запиту: розбір інформації запиту в [маршруті](runtime-routing.md) з відповідними параметрами; * Обробка запиту: розбір інформації запиту на [маршрут](runtime-routing.md) та відповідні параметри;
створення об’єктів модуля, контролера і події згідно вказаного маршруту; запуск подій; створення об’єктів модуля, контролера та дії, згідно вказаного маршруту; ініціювання подій.
* Виникає подія [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]]; * Ініціюється подія [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]].
* Відповідь надсилається кінцевому користувачу. * Відповідь надсилається кінцевому користувачу.
4. Вхідний скрипт отримує значення статусу виходу з додатка і завершує обробку запиту. 4. Вхідний скрипт отримує значення статусу виходу із додатка та завершує обробку запиту.
Контролери Контролери
=========== ==========
Контролери є частиною [MVC](https://ru.wikipedia.org/wiki/Model-View-Controller) архітектури. Це об’єкти класів, успадкованих Контролери є частиною [MVC](http://uk.wikipedia.org/wiki/Модель-вид-контролер) архітектури. Це об’єкти класів,
від [[yii\base\Controller]] і відповідають за опрацювання запиту і генерації відповіді. По суті, після опрацювання запиту [додатками](structure-applications.md), успадкованих від [[yii\base\Controller]] та відповідають за обработку запитів і генерацію відповідей.
контролери проаналізують вхідні дані, передадуть їх в [моделі](structure-models.md), додадуть результати моделі в [представлення](structure-views.md), Зокрема, після отримання контролю від [додатків](structure-applications.md), контролери проаналізують
і в кінцевому підсумку згенерують вихідні відповіді. вхідні дані, передадуть їх у [моделі](structure-models.md), додадуть результати моделі у
[представлення](structure-views.md), і в кінцевому підсумку згенерують вихідні відповіді.
## Події <a name="actions"></a> ## Дії <a name="actions"></a>
Контролери складаються з *подій*, які є основними блоками, до яких може звертатись кінцевий користувач і запитувати виконання того або іншого функціоналу. В контролері може бути одна або декілька подій. Контролери складаються з *дій*, які є основними блоками, до яких може звертатись кінцевий користувач і запитувати
виконання того або іншого функціоналу. В контролері може бути одна або декілька дій.
Наступний приклад показує `post` контролер з двома подіями: `view` і `create`: Наступний приклад показує `post` контролер з двома діями: `view` та `create`:
```php ```php
namespace app\controllers; namespace app\controllers;
...@@ -50,21 +52,25 @@ class PostController extends Controller ...@@ -50,21 +52,25 @@ class PostController extends Controller
} }
``` ```
В події `view` (визначено методом `actionView()`), код спочатку завантажує [модель](structure-models.md) У дії `view` (визначеній методом `actionView()`) код спочатку завантажує [модель](structure-models.md),
згідно запитуваної ID моделі; Якщо модель успішно завантажена, то код відобразить її за допомогою [представлення](structure-views.md) відповідно запитуваної ID моделі; Якщо модель успішно завантажена, то код відобразить її за допомогою
під назвою `view`. В іншому випадку буде визване виключення. [представлення](structure-views.md), під назвою `view`. В іншому випадку - буде визване виключення.
В події `create` (визначено методом `actionCreate()`), код аналогічний. Він спочатку намагається завантажити [модель](structure-models.md) за допомогою даних із запиту і зберегти модель. Якщо все пройшло успішно, то код перенаправить браузер на подію `view` з ID щойно створеної моделі. В іншому випадку він відобразить предаставлення `create`, через яке користувач зможе вказати необхідні дані. У дії `create` (визначеній методом `actionCreate()`), код аналогічний. Він спочатку намагається завантажити
[модель](structure-models.md) за допомогою даних із запиту і зберегти модель. Якщо все пройшло успішно,
то код перенаправить браузер на дію `view` із ID щойно створеної моделі. В іншому випадку - він відобразить
предаставлення `create`, через яке користувач зможе вказати необхідні дані.
## Маршрути <a name="routes"></a> ## Маршрути <a name="routes"></a>
Кінцеві користувачі звертаються до подій з допомогою так названих *маршрутів*. Маршрут це рядок, який складається з наступних частин: Кінцеві користувачі звертаються до дій з допомогою так названих *маршрутів*. Маршрут це рядок,
який складається з наступних частин:
* ID модуля: він існує, тільки якщо контролер належить не додатку, а [модулю](structure-modules.md); * ID модуля: він існує, тільки якщо контролер належить не додатку, а [модулю](structure-modules.md);
* ID контролера: рядок, який унікально ідентифікує контролер серед всіх інших контролерів одного і того ж додатка * ID контролера: рядок, який унікально ідентифікує контролер серед всіх інших контролерів одного і того ж додатка
(або одного й того ж модуля, якщо контролер належить модулю); (або одного й того ж модуля, якщо контролер належить модулю);
* ID події: рядок, який унікально идентифікує подію серед всіх інших подій одного й того ж конторолера. * ID дії: рядок, який унікально ідентифікує дію серед всіх інших дій одного й того ж конторолера.
Маршрути можуть мати наступний формат: Маршрути можуть мати наступний формат:
...@@ -78,14 +84,16 @@ ControllerID/ActionID ...@@ -78,14 +84,16 @@ ControllerID/ActionID
ModuleID/ControllerID/ActionID ModuleID/ControllerID/ActionID
``` ```
Таким чином, якщо користувач звертається до URL `http://hostname/index.php?r=site/index`, то `index` подія в `site` контролері яку буде викликано. Таким чином, якщо користувач звертається до URL `http://hostname/index.php?r=site/index`, то буде викликано дію `index`
Секція [Маршрутизація](runtime-routing.md) містить більш детальну інформацію про те як маршрути співставляються з подіями. у контролері `site`. Розділ [Маршрутизація та створення URL](runtime-routing.md) містить більш детальну інформацію
про те, як маршрути співставляються із діями.
## Створення контролерів <a name="creating-controllers"></a> ## Створення контролерів <a name="creating-controllers"></a>
В [[yii\web\Application|Веб додатках]], контролери мусять бути успадковані від [[yii\web\Controller]] або його потомків. У [[yii\web\Application|веб додатках]] контролери повинні бути успадкованими від класу [[yii\web\Controller]]
Аналогічно для [[yii\console\Application|консольних додатків]], контролери мусять бути успадковані від [[yii\console\Controller]] або його потомків. Наступний код визначає `site` контролер: або його нащадків. Аналогічно для [[yii\console\Application|консольних додатків]], контролери повинні бути
успадкованими від класу [[yii\console\Controller]] або його нащадків. Наступний код визначає контролер `site`:
```php ```php
namespace app\controllers; namespace app\controllers;
...@@ -100,66 +108,68 @@ class SiteController extends Controller ...@@ -100,66 +108,68 @@ class SiteController extends Controller
### ID контролерів <a name="controller-ids"></a> ### ID контролерів <a name="controller-ids"></a>
За звичай контролер зроблений таким чином, що він мусить опрацьовувати запити, які пов’язані з певним ресурсом. За звичай контролер зроблений таким чином, що він повинен обробляти запити, які пов’язані з певним ресурсом.
Саме через дані причини, ID контролерів за завичай є іменниками, які посилаються на ресурс, який вони опрацьовують. Саме з цієї причини, ID контролерів за завичай є іменниками, які посилаються на ресурс, який вони обробляють.
Наприклад, ви можете використовувати `article` в якості ID контролера, який відповідає за опрацювання даних публікацій. Наприклад, ви можете використовувати `article` в якості ID контролера, який відповідає за обробку даних публікацій.
За замовчуванням, ID контролерів мають містити тільки наступні символи: Англійські букви в нижньому регістрі, цифри, підкреслення, За замовчуванням, ID контролерів мають містити тільки наступні символи: англійські букви в нижньому регістрі, цифри,
тире и слеш. Наприклад, обидва `article` і `post-comment` є прийнятними ID контролерів, в той час як `article?`, `PostComment`, підкреслення, тире і слеш. Наприклад, обидва `article` та `post-comment` є прийнятними ID контролерів, в той час,
`admin\post` не являються такими. як `article?`, `PostComment`, `admin\post` не є такими.
ID контролерів також можуть містити префікс субдиректорії. Наприклад, в `admin/article` частина `article` є контролером в ID контролера також може містити префікс субдиректорії. Наприклад, у `admin/article` - частина `article` відповідає
субдиректорії `admin` в [[yii\base\Application::controllerNamespace|порсторі імен]]. контролеру в субдиректорії `admin` [[yii\base\Application::controllerNamespace|простору імен контролера]].
Допустимими символами для префіксів субдиректорій є: Англійські букви в нижньому і верхньому регістрі, символи підкреслення і слеш, де слеш використовується в якості розділителя для багатовкладених субдиректорій (наприклад `panels/admin`). Допустимими символами для префіксів субдиректорій є: англійські букви в нижньому і верхньому регістрах, цифри,
символи підкреслення і слеш, де слеш - використовується в якості роздільника для багаторівневих субдиректорій
(наприклад `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 контролера; [[yii\base\Application::controllerNamespace|простір імен контролера]] має значення за замовчуванням `app\controllers`:
* Прибрати дефіси і замінити будь-який прямий слеш на зворотний;
* Додати суфікс `Controller`;
* Додати в початок [[yii\base\Application::controllerNamespace|простір імен контролерів]].
Нижче наведено декілька прикладів, з урахуванням того, що [[yii\base\Application::controllerNamespace|простір імен контролерів]] має значення за замовчуванням `app\controllers`:
* `article` відповідає `app\controllers\ArticleController`; * `article` відповідає `app\controllers\ArticleController`;
* `post-comment` відповідає `app\controllers\PostCommentController`; * `post-comment` відповідає `app\controllers\PostCommentController`;
* `admin/post-comment` відповідає `app\controllers\admin\PostCommentController`; * `admin/post-comment` відповідає `app\controllers\admin\PostCommentController`;
* `adminPanels/post-comment` відповідає `app\controllers\adminPanels\PostCommentController`. * `adminPanels/post-comment` відповідає `app\controllers\adminPanels\PostCommentController`.
Класи контролерів мають бути [автозавантаженими](concept-autoloading.md). Саме по цій причині, у вищенаведених прикладах, Класи контролерів мають бути [автозавантаженими](concept-autoloading.md). Саме з цієї причини у вищенаведених прикладах
контролер `article` має бути збереженим у файл, [псевдонім](concept-aliases.md) якого `@app/controllers/ArticleController.php`; контролер `article` має бути збереженим у файл, [псевдонім шляху](concept-aliases.md) якого є
в той час як контролер `admin/post2-comment` має знаходитись у файлі `@app/controllers/admin/Post2CommentController.php`. `@app/controllers/ArticleController.php`; в той час, як контролер `admin/post2-comment` має знаходитись у файлі
`@app/controllers/admin/Post2CommentController.php`.
> Інформація: Останній приклад `admin/post2-comment` показує яким чином ви можете розташувати контролер в директорії > Інформація: Останній приклад `admin/post2-comment` показує яким чином ви можете розташувати контролер в директорії
[[yii\base\Application::controllerNamespace|простору імен контролерів]]. Це дуже зручно, коли ви хочете організувати свої контролери в декілька категорій і не хочете використовувати [модулі](structure-modules.md). [[yii\base\Application::controllerNamespace|простору імен контролера]]. Це дуже зручно, коли ви хочете організувати
свої контролери у декілька категорій і не хочете використовувати [модулі](structure-modules.md).
### Мапа контролерів <a name="controller-map"></a> ### Мапа контролерів <a name="controller-map"></a>
Ви можете налаштувати [[yii\base\Application::controllerMap|Мапу контролерів]] для того, щоб подолати Ви можете налаштувати [[yii\base\Application::controllerMap|мапу контролерів]] для того, щоб подолати
описані вище обмеження іменування ID контролерів і назв класів. В основному це дуже зручно, коли ви використовуєте описані вище обмеження іменування ID контролерів і назв класів. В основному, це дуже зручно, коли ви використовуєте
сторонні контролери, іменування яких ви не можете контролювати. сторонні контролери, іменування яких ви не можете контролювати.
Ви можете налаштувати [[yii\base\Application::controllerMap|мапу контролерів]] в [налаштуваннях додатка](structure-applications.md#application-configurations) Ви можете налаштувати [[yii\base\Application::controllerMap|мапу контролерів]] в
наступним чином: [налаштуваннях додатка](structure-applications.md#application-configurations) наступним чином:
```php ```php
[ [
'controllerMap' => [ 'controllerMap' => [
[ // оголошує контролер "account", використовуючи назву класу
// оголошує "account" контролер, використовуючи назву класу 'account' => 'app\controllers\UserController',
'account' => 'app\controllers\UserController',
// оголошує контролер "article", використовуючи масив конфігурації
// оголошує "article" контролер, використовуючи масив конфігурації 'article' => [
'article' => [ 'class' => 'app\controllers\PostController',
'class' => 'app\controllers\PostController', 'enableCsrfValidation' => false,
'enableCsrfValidation' => false,
],
], ],
], ],
] ]
...@@ -168,11 +178,13 @@ ID контролерів також можуть містити префікс ...@@ -168,11 +178,13 @@ ID контролерів також можуть містити префікс
### Контролер за замовчуванням <a name="default-controller"></a> ### Контролер за замовчуванням <a name="default-controller"></a>
Кожний додаток має контролер за замовчуванням, вказаний через властивість [[yii\base\Application::defaultRoute]]. Кожний додаток має контролер за замовчуванням, вказаний через властивість [[yii\base\Application::defaultRoute]].
Коли в запиті не вказаний [маршрут](#ids-routes), тоді буде використаний маршрут вказаний в даній властивості. Коли в запиті не вказано [маршрут](#ids-routes), то буде використано маршрут із даної властивості.
Для [[yii\web\Application|Веб додатків]], це значення `'site'`, в той час як для [[yii\console\Application|консольних додатків]], Для [[yii\web\Application|веб додатків]], це значення рівне `'site'`, у той час, як для
це `'help'`. Таким чином, якщо вказаний URL `http://hostname/index.php`, це значить, що контролер `site` виконає обробку запиту. [[yii\console\Application|консольних додатків]], це `'help'`. Таким чином, якщо вказаний URL
`http://hostname/index.php`, це значить, що контролер `site` виконає обробку запиту.
Ви можете змінити контролер за замовчуванням наступним чином в [налаштуваннях додатку](structure-applications.md#application-configurations): Ви можете змінити контролер за замовчуванням наступним чином в
[налаштуваннях додатку](structure-applications.md#application-configurations):
```php ```php
[ [
...@@ -181,9 +193,11 @@ ID контролерів також можуть містити префікс ...@@ -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 ```php
namespace app\controllers; namespace app\controllers;
...@@ -205,54 +219,60 @@ class SiteController extends Controller ...@@ -205,54 +219,60 @@ class SiteController extends Controller
``` ```
### ID подій <a name="action-ids"></a> ### ID дій <a name="action-ids"></a>
В основному події розробляються для певної конкретної обробки ресурса. По цій причині, ID подій в основному Частіше за все, дія розробляється для певної конкретної обробки ресурса. З цієї причини ID дій, в основному,
є дієсловами, такими як `view`, `update`, і т. д. є дієсловами, такими як `view`, `update`, і т.д.
За замовчуванням, ID події повинен містити тільки такі символи: Англійські букви в нижньому регістрі, цифри, За замовчуванням, ID дій повинні містити тільки такі символи: англійські букви в нижньому регістрі, цифри,
підкреслення і дефіси. Дефіси в ID подій використовуються для поділу слів. Наприклад, `view`, `update2`, `comment-post` є допустимими ID подій, в той час як `view?`, `Update` не являються такими. підкреслення і дефіси. Дефіси в ID дій використовуються для поділу слів. Наприклад, `view`, `update2`,
`comment-post` є допустимими ID дій, в той час, як `view?`, `Update` не є такими.
Ви можете створювати події двома способами: вбудовані події і окремі події. Вбудована подія є методом, визначеним Ви можете створювати дії двома способами: вбудовані дії і окремі дії. Вбудована дія є методом, визначеним
в класі контролера, тоді як окрема подія є екземпляром класу, успадкованого від [[yii\base\Action]] або його потомків. в класі контролера, тоді як окрема дія є екземпляром класу, успадкованого від [[yii\base\Action]] або його нащадків.
Вбудовані події вимагають менше зусиль для створення і в основному використовуються якщо у вас немає потреби в повторному використанні подій. Вбудовані дії вимагають менше зусиль для створення і, в основному, використовуються якщо у вас немає потреби
Окремі події, з іншого боку, в основному створюються для використання в різних контролерах або при використанні в [розширеннях](structure-extensions.md). у повторному використанні цих дій. Окремі дії, з іншого боку, в основному створюються для використання в різних
контролерах або при використанні у [розширеннях](structure-extensions.md).
### Вбудовані події <a name="inline-actions"></a> ### Вбудовані дії <a name="inline-actions"></a>
Вбудовані події це ті події, які визначені в рамках методів контролера, як ми це вже обговорили. Вбудовані дії це ті дії, які визначені у рамках методів контролера, як ми це вже обговорили.
Назви методів подій можуть бути отримані з ID подій наступним чином: Назви методів дій можуть бути отримані із ID дій наступним чином:
* Привести перший символ кожного слова в ID події у верхній регістр; * Привести перший символ кожного слова в ID дії у верхній регістр;
* Прибрати дефіси; * Прибрати дефіси;
* Додати префікс `action`. * Додати префікс `action`.
Наприклад, `index` відповідає `actionIndex`, а `hello-world` відповідає `actionHelloWorld`. Наприклад, `index` перетвориться у `actionIndex`, а `hello-world` перетвориться у `actionHelloWorld`.
> Примітка: Назви імен подій є *регістрозалежними*. Якщо у вас є метод `ActionIndex`, він не буде врахований як метод події, таким чином, запит до події `index` призведе до зображення виключення. Також слід врахувати, що методи подій повинні мати область видимості public. Методи, що мають область видимості private або protected НЕ визначають методи вбудованих подій.
> Примітка: Назви імен дій є *регістрозалежними*. Якщо у вас є метод `ActionIndex`, то його не буде враховано
як метод дії, і в результаті, запит до дії `index` призведе до отримання виключення. Також слід врахувати,
що методи дій повинні бути публічними ("public"). Приватні ("private") або захищені ("protected") методи
НЕ визначають вбудованих дій.
Вбудовані події в основному використовуються, тому що для їх створення не потрібного багато зусиль. Тим не менше, якщо ви плануєте повторно використовувати деякі події в різних місцях, або якщо ви хочете перерозподілити події, ви повинні визначити їх як *окремі події*. В основному використовуються вбудовані дії, оскільки для їх створення не потрібного багато зусиль.
Тим не менше, якщо ви плануєте повторно використовувати деякі дії у різних місцях або якщо ви хочете
перерозподілити дії, ви повинні визначити їх як *окремими діями*.
### Окремі події <a name="standalone-actions"></a> ### Окремі дії <a name="standalone-actions"></a>
Окремі події визначаються в якості класів, успадкованих від [[yii\base\Action]] або його потомків. Окремі дії визначаються в якості класів, успадкованих від [[yii\base\Action]] або його нащадків.
Наприклад, в Yii релізах, присутні [[yii\web\ViewAction]] і [[yii\web\ErrorAction]], обидва з яких є окремими подіями. Наприклад, в релізах Yii присутні [[yii\web\ViewAction]] та [[yii\web\ErrorAction]], обидва класи є окремими діями.
Для використання окремої події, ви маєте вказати її в *мапі подій*, з допомогою перевизначення метода Для використання окремої дії, ви маєте вказати її у *мапі дій* за допомогою перевизначення методу
[[yii\base\Controller::actions()]] у вашому класі контролера, наступним чином: [[yii\base\Controller::actions()]] у вашому класі контролера, наступним чином:
```php ```php
public function actions() public function actions()
{ {
return [ return [
// оголошує "error" подію з допомогою назви класу // оголошує дію "error" за допомогою назви класу
'error' => 'yii\web\ErrorAction', 'error' => 'yii\web\ErrorAction',
// оголошує "view" подію з допомогою конфігураційного масиву // оголошує дію "view" за допомогою конфігураційного масиву
'view' => [ 'view' => [
'class' => 'yii\web\ViewAction', 'class' => 'yii\web\ViewAction',
'viewPrefix' => '', 'viewPrefix' => '',
...@@ -261,10 +281,12 @@ public function actions() ...@@ -261,10 +281,12 @@ public function actions()
} }
``` ```
Як ви можете бачити, метод `actions()` мусить повернути масив, ключами якого є ID подій, а значенями - відповідні назви класу події або [конфігурація](concept-configurations.md). На відміну від вбудованих подій, ID окремих подій можуть містити довільні символи, до тих пір поки вони визначені в методі `actions()`. Як ви можете бачити, метод `actions()` повинен повернути масив, ключами якого є ID дій, а значеннями - відповідні
назви класів дій або [конфігурацій](concept-configurations.md). На відміну від вбудованих дій, ID окремих дій
можуть містити довільні символи, доки вони визначені у методі `actions()`.
Для створення окремої події, ви мусите успадкуватись від класу [[yii\base\Action]] або його потомків, і реалізувати Для створення окремої дії, ви повинні успадкуватись від класу [[yii\base\Action]] або його нащадків, і реалізувати
метод `run()` з областю видимості public. Роль метода `run()` аналогічна іншим методам подій. Наприклад, публічний ("public") метод `run()`. Роль метода `run()` аналогічна іншим методам дій. Наприклад,
```php ```php
<?php <?php
...@@ -282,21 +304,22 @@ class HelloWorldAction extends Action ...@@ -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\Application|веб додатків]], значення, що повертається, також може бути довільними даними,
назначені [[yii\web\Response::data]], а потім конвертовані в рядок, що представляє тіло відповіді. яке буде призначене до [[yii\web\Response::data]], а потім конвертоване у рядок, що представляє тіло відповіді.
* Для [[yii\console\Application|Консольних додатків]], значення, що повертається також може бути числом, що представляє * Для [[yii\console\Application|консольних додатків]], значення, що повертається, також може бути числом, що
[[yii\console\Response::exitStatus|статус виходу]] виконання команди. представляє [[yii\console\Response::exitStatus|статус виходу]] виконання команди.
В вищенаведених прикладах, всі результати подій є рядками, які будуть використані в якості тіла відповіді, В вищенаведених прикладах всі результати дій є рядками, які будуть використані у якості тіла відповіді користувачу.
висланого користувачеві. Наступний приклад, показує подію, що може перенаправити браузер користувача на новий URL, за допомогою Наступний приклад показує як дія може перенаправити браузер користувача на новий URL за допомогою
повернення response об'єкта ([[yii\web\Controller::redirect()|redirect()]] метод повертає response об’єкт): повернення об’єкта відповіді (оскільки метод [[yii\web\Controller::redirect()|redirect()]] повертає об’єкт response):
```php ```php
public function actionForward() public function actionForward()
...@@ -307,12 +330,14 @@ 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`, використовуючи назву параметра в якості ключа; Методи дій для вбудованих дій і методи `run()` для окремих дій можуть приймати, так звані, *параметри дії*.
для [[yii\console\Application|консольних додатків]], вони відповідають аргументам командної строки. Їх значення беруться із запитів. Для [[yii\web\Application|веб додатків]], значення кожного з параметрів дії
береться із `$_GET`, використовуючи назву параметра у якості ключа;
для [[yii\console\Application|консольних додатків]] - вони відповідають аргументам командної строки.
В наведеному нижче прикладі, подія `view` (вбудовона подія) визначає два параметра: `$id` і `$version`. В наступному прикладі, дія `view` (вбудовона дія) визначає два параметри: `$id` і `$version`.
```php ```php
namespace app\controllers; namespace app\controllers;
...@@ -328,17 +353,19 @@ class PostController extends Controller ...@@ -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` будуть присвоєні * `http://hostname/index.php?r=post/view&id=123&version=2`: параметрам `$id` і `$version` будуть присвоєні
значення `'123'` і `'2'` відповідно; значення `'123'` і `'2'` відповідно.
* `http://hostname/index.php?r=post/view`: буде вкинуте виключення [[yii\web\BadRequestHttpException]], так як * `http://hostname/index.php?r=post/view`: буде отримане виключення [[yii\web\BadRequestHttpException]], оскільки
обов’язковий параметр `$id` не був вказаний в запиті; обов’язковий параметр `$id` не було вказано у запиті.
* `http://hostname/index.php?r=post/view&id[]=123`: буде вкинуте виключення [[yii\web\BadRequestHttpException]], так як * `http://hostname/index.php?r=post/view&id[]=123`: буде отримане виключення [[yii\web\BadRequestHttpException]],
параметр `$id` отримав невірне значення `['123']`. оскільки параметр `$id` отримав невірне значення `['123']`.
Якщо ви хочите, щою параметр події приймав масив значеннь, ви мусите використовувати type-hint значення `array`, як зображено нажче: Якщо ви хочете, щоб параметр дії приймав масив значень, ви повинні використати type-hint `array` параметра метода,
як зображено нажче:
```php ```php
public function actionView(array $id, $version = null) public function actionView(array $id, $version = null)
...@@ -347,19 +374,22 @@ 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` отримає значення Тепер, якщо запит буде містити URL `http://hostname/index.php?r=post/view&id[]=123`, то параметр `$id` отримає
`['123']`. Якщо запит буде містити URL `http://hostname/index.php?r=post/view&id=123`, то параметр `$id` все рівно буде містити масив, так як скалярне значення `'123'` буде автоматично сконвертовано в масив. значення `['123']`. Якщо запит буде містити URL `http://hostname/index.php?r=post/view&id=123`, то параметр
`$id` все рівно отримає масив, оскільки скалярне значення `'123'` буде автоматично сконвертовано у масив.
Вищенаведені приклади в основному показують як параметри подій працюють для Веб додатків. Більше інформації Вищенаведені приклади в основному показують як параметри дій працюють для веб додатків. Більше інформації
про параметри консольних додатків наведено в секції [Консольні команди](tutorial-console.md). про параметри консольних додатків наведено в секції [Консольні команди](tutorial-console.md).
### Події за замовчуванням <a name="default-action"></a> ### Дія за замовчуванням <a name="default-action"></a>
Кожний контролер містить події, визначені через властивість [[yii\base\Controller::defaultAction]]. Кожний контролер містить дію за замовчуванням, визначену через властивість [[yii\base\Controller::defaultAction]].
Коли [маршрут](#ids-routes) містить тільки ID контролера, то розуміється, що було запрошено подію контролера за замовчуванням. Коли [маршрут](#ids-routes) містить тільки ID контролера, то розуміється, що було запитана дія контролера
за замовчуванням.
За замовчуванням, ця подія має значення `index`. Якщо ви хочите змінити це значення, просто перевизначте дану властивість в класі контролера наступним чином: За замовчуванням, ця дія має значення `index`. Якщо ви хочете змінити це значення - просто перевизначте дану
властивість у класі контролера наступним чином:
```php ```php
namespace app\controllers; namespace app\controllers;
...@@ -380,35 +410,39 @@ class SiteController extends Controller ...@@ -380,35 +410,39 @@ class SiteController extends Controller
## Життєвий цикл контролера <a name="controller-lifecycle"></a> ## Життєвий цикл контролера <a name="controller-lifecycle"></a>
При опрацюванні запиту, [додаток](structure-applications.md) створить контролер, базуючись на При обробці запиту, [додаток](structure-applications.md) створить контролер, базуючись на [маршруті](#routes),
запрошеному [маршруті](#routes). Для виконання запиту, контролер пройде через наступні етапи життєвого циклу: який було запитано. Для виконання запиту, контролер пройде через наступні етапи життєвого циклу:
1. Метод [[yii\base\Controller::init()]] буде викликаний після того як контролер буде створений і сконфігурований; 1. Метод [[yii\base\Controller::init()]] буде викликаний після того, як контролер був створений і сконфігурований.
2. Контролер створить об’єкт події, базуючись на запрошеному ID події: 2. Контролер створить об’єкт дії, базуючись на ID дії, яку було запитано:
* Якщо ID події не вказано, то буде використано [[yii\base\Controller::defaultAction|ID події за замовчуванням]]; * Якщо ID дії не вказано, то буде використано [[yii\base\Controller::defaultAction|ID дії за замовчуванням]];
* Якщо ID події знайдено в [[yii\base\Controller::actions()|мапі подій]], то буде створено окрему подію; * Якщо ID дії знайдено у [[yii\base\Controller::actions()|мапі дій]], то буде створено окрему дію;
* Якщо ID події відповідає методу події, то буде створено вбудовану подію; * Якщо ID дії відповідає методу дії, то буде створено вбудовану дію;
* В іншому випадку, буде вкинуте виключення [[yii\base\InvalidRouteException]]. * В іншому випадку, буде отримане виключення [[yii\base\InvalidRouteException]].
3. Контролер послідовно викликає метод `beforeAction()` додатка, модуля (якщо контролер належить модулю) і 3. Контролер послідовно викликає метод `beforeAction()` додатка, модуля (якщо контролер належить модулю) і
самого контролера. самого контролера.
* Якщо один із методів повернув `false`, то решта, невикликані методи `beforeAction` будуть пропущені, а виконання події буде відмінено; * Якщо один із методів повернув `false`, то решта невикликаних методів `beforeAction` будуть пропущені,
* За замовчуванням, кожний виклик метода `beforeAction()` викликає подію `beforeAction`, на яку ви можете призначити обробників. а виконання дії буде відмінено;
4. Контролер запускає подію: * За замовчуванням, кожний виклик метода `beforeAction()` викликає подію `beforeAction`, на яку ви можете
* Параметри події будуть проаналізовані і заповнені з даних запиту. призначити обробники.
4. Контролер виконує дію:
* Параметри дії будуть проаналізовані і заповнені із даних запиту.
5. Контролер послідовно викликає методи `afterAction` контролера, модуля (якщо контролер належить модулю) і додатка. 5. Контролер послідовно викликає методи `afterAction` контролера, модуля (якщо контролер належить модулю) і додатка.
* За замовчуванням, кожний виклик метода `afterAction()` викликає подію `afterAction`, на яку ви можете призначити обробників. * За замовчуванням, кожний виклик метода `afterAction()` викликає подію `afterAction`, на яку ви можете
6. Додаток, отримавши результат виконання події, присвоює його об’єкту [response](runtime-responses.md). призначити обробники.
6. Додаток, отримавши результат виконання дії, привласнює його об’єкту [response](runtime-responses.md).
## Кращі практики <a name="best-practices"></a> ## Кращі практики <a name="best-practices"></a>
В добре організованих додатках, контролери за звичай дуже тонкі, і містять лише декілька рядків коду. В добре організованих додатках, контролери за звичай дуже тонкі, і містять лише декілька рядків коду.
Якщо ваш контролер дуже складний, це за звичай означає, що вам потрібно провести рефакторинг його і перенести будь-який код в інші місце. Якщо ваш контролер дуже складний, це за звичай означає, що вам потрібно провести його рефакторинг і
перенести деякий код в інші класи.
В цілому, контролери В цілому, контролери
* можуть мати доступ до даних [запиту](runtime-requests.md); * можуть мати доступ до даних [запиту](runtime-requests.md);
* можуть викликати методи [моделей](structure-models.md) і інших компонентів системи з даними запиту; * можуть викликати методи [моделей](structure-models.md) та інших компонентів системи із даними запиту;
* можуть використовувати [представлення](structure-views.md) для формування відповіді; * можуть використовувати [представлення](structure-views.md) для формування відповіді;
* не повинні займатись опрацюванням даних, це має відбуватись в [моделях](structure-models.md); * не повинні займатись обробкою даних - це має відбуватися у [моделях](structure-models.md);
* мають уникати використання HTML або іншої розмітки, краще це робити в [представленнях](structure-views.md). * мають уникати використання HTML або іншої розмітки - краще це робити у [представленнях](structure-views.md).
Вхідні скрипти Вхідні скрипти
=============== ==============
Вхідні скрипти це перша ланка в процесі початкового завантаження додатку. Додаток (веб додаток або консольний додаток) Вхідні скрипти це перша ланка в процесі початкового завантаження додатку. Додаток (веб додаток або консольний додаток)
включає єдиний вхідний скрипт. Кінцеві користувачі роблять запити до вхідного скрипта, який створює об’єкти додатка і перенаправляє запит до них. має єдиний вхідний скрипт. Кінцеві користувачі роблять запити до вхідного скрипта, який створює об’єкти додатка та
перенаправляє запит до них.
Вхідні скрипти для веб додатків повинні бути збережені в теках доступних з веб, таким чином вони можуть бути доступними кінцевому користувачу. Такі скрипти за звичай називаються `index.php`, але також можут використовуватись і інші імена, які можуть бути розпізнані використовуваними веб-серверами. Вхідні скрипти для веб додатків повинні бути збережені в директоріях, доступних із веб, таким чином, вони можуть бути
доступними кінцевим користувачам. Зазвичай вони називаються `index.php`, але також можут використовуватись і інші
імена, які можуть бути розпізнані веб-серверами.
Вхідні скрипти для консольних додатків за звичай розміщенні в [кореневій директорії](structure-applications.md) додатку і мають назву Вхідні скрипти для консольних додатків зазвичай розміщенні у [кореневій директорії](structure-applications.md)
`yii` (з суфіксом `.php`). Вони мають права на виконання, таким чином користувачі зможуть запускати консольні додатки через команду `./yii <маршрут> [аргументи] [опції]`. додатку і мають назву `yii` (з суфіксом `.php`). Вони повинні мати права на виконання, щоб користувачі мали змогу
запускати консольні додатки через команду `./yii <маршрут> [аргументи] [опції]`.
Вхідні скрипти в основному виконують наступну роботу: Вхідні скрипти в основному виконують наступну роботу:
* Оголошують глобальні константи; * Оголошують глобальні константи;
* Реєструють завантажувач класів [Composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading); * Реєструють автозавантажувач класів [Composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading);
* Підключають файл класа [[Yii]]; * Підключають файл класу [[Yii]];
* Завантажують конфігурацію додатка; * Завантажують конфігурацію додатка;
* Створюють і конфігурують об’єкт [додатка](structure-applications.md); * Створюють і конфігурують об’єкт [додатка](structure-applications.md);
* Викликають метод [[yii\base\Application::run()]] додатка для опрацювання вхідного запиту. * Викликають метод [[yii\base\Application::run()]] додатка для обробки вхідного запиту.
## Веб додатки <a name="web-applications"></a> ## Веб додатки <a name="web-applications"></a>
...@@ -29,16 +33,16 @@ ...@@ -29,16 +33,16 @@
defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev'); defined('YII_ENV') or define('YII_ENV', 'dev');
// реєстрація завантажувача класів Composer // реєстрація автозавантажувача класів Composer
require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/autoload.php');
// підключення файла класа Yii // підключення файла класу Yii
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
// завантаження конфігурації додатка // завантаження конфігурації додатка
$config = require(__DIR__ . '/../config/web.php'); $config = require(__DIR__ . '/../config/web.php');
// створення і конфігурація додатка, а також виклик метода для опрацювання вхідного запиту // створення, конфігурація та виконання додатка
(new yii\web\Application($config))->run(); (new yii\web\Application($config))->run();
``` ```
...@@ -60,14 +64,14 @@ $config = require(__DIR__ . '/../config/web.php'); ...@@ -60,14 +64,14 @@ $config = require(__DIR__ . '/../config/web.php');
defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_DEBUG') or define('YII_DEBUG', true);
// fcgi не має констант STDIN и STDOUT, вони визначаються за замовчуванням // fcgi не має констант STDIN та STDOUT за замовчуванням
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w')); defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
// реєстрація завантажувача класів Composer // реєстрація автозавантажувача класів Composer
require(__DIR__ . '/vendor/autoload.php'); require(__DIR__ . '/vendor/autoload.php');
// підключення файла класа Yii // підключення файла класу Yii
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php'); require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
// завантаження конфігурації додатка // завантаження конфігурації додатка
...@@ -83,11 +87,15 @@ exit($exitCode); ...@@ -83,11 +87,15 @@ exit($exitCode);
Вхідні скрипти є найкращим місцем для оголошення глобальних констант. Yii підтримує наступні три константи: Вхідні скрипти є найкращим місцем для оголошення глобальних констант. Yii підтримує наступні три константи:
* `YII_DEBUG`: вказує чи працює додаткок у відлагоджувальному режимі. Перебуваючи у відлагоджувальному режимі, додаток буде збирати більше інформації у логи і покаже більш детальний стек викликів, якщо виникне виняток. По цій причині, відлагоджувальний режим повинен бути використаний тільки в процесі розробки. За замовчуванням значення `YII_DEBUG` дорівнює false; * `YII_DEBUG`: вказує чи працює додаткок у режимі відлагодження ("debug mode"), перебуваючи у якому,
* `YII_ENV`: вказує в якому середовищі працює додаток. Дана тема детально розглянута в розділі [Конфігурації](concept-configurations.md#environment-constants). додаток буде збирати більше інформації у логи та покаже більш детальний стек викликів при отриманні виключення.
За замовчуванням значення `YII_ENV` дорівнює `'prod'`, що значить, що додаток працює у виробничому режимі; З цієї причини, режим відлагодження повинен бути використаний тільки в процесі розробки.
* `YII_ENABLE_ERROR_HANDLER`: вказує чи потрібно включати наявний у Yii обробник помилок. За замовчуванням значення даної константи За замовчуванням значення `YII_DEBUG` дорівнює `false`.
дорівнює true. * `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')) { ...@@ -105,4 +113,5 @@ if (!defined('YII_DEBUG')) {
Перший варіант є більш коротким і зрозумілим. Перший варіант є більш коротким і зрозумілим.
Константи мають бути визначені якомога раніше, в самому початку вхідного скрипта, таким чином вони зможуть вплинути на решту PHP файлів які будуть підключатись. Константи мають бути визначені якомога раніше, на самому початку вхідного скрипта, щоб вони могли вплинути на решту
PHP файлів, які будуть підключатись.
Огляд Огляд
===== =====
Yii додаток організований згідно шаблону проектування [модель-представлення-подія (MVC)](http://ru.wikipedia.org/wiki/Model-View-Controller). Додатки Yii організовані згідно шаблону проектування
[Моделі](structure-models.md) являють собою дані, бізнес логіку і бізнес правила; [представлення](structure-views.md) [модель-представлення-подія (MVC)](http://uk.wikipedia.org/wiki/Модель-вид-контролер).
відповідають за відображення інформації, в тому числі і на основі даних, отриманих з моделей; [контролери](structure-controllers.md) [Моделі](structure-models.md) являють собою дані, бізнес логіку та бізнес правила;
приймають вхідні дані від користувача і перетворюють їх в зрозумілий для [моделей](structure-models.md) формат і команди, а також відповідають за відображення потрібного представлення. [представлення](structure-views.md) відповідають за відображення даних моделей;
[контролери](structure-controllers.md) приймають вхідні дані від користувача і перетворюють їх у команди для
[моделей](structure-models.md) та [представлень](structure-views.md).
Окрім MVC, Yii додаток також має наступні сутності: Окрім MVC, Yii додаток також має наступні сутності:
* [вхідні скрипти](structure-entry-scripts.md): це PHP скрипти, які доступні напряму кінцевому користувачу додатка. * [вхідні скрипти](structure-entry-scripts.md): це PHP скрипти, які доступні напряму кінцевому користувачу додатка.
Вони відповідають за запуск та опрацювання вхідного запиту; Вони відповідають за запуск циклу обробки запиту.
* [додатки](structure-applications.md): це глобально доступні об’єкти, які відповідають за коректну роботу різних * [додатки](structure-applications.md): це глобально доступні об’єкти, які відповідають за коректну роботу різних
компонентів додатка і їх координацію для обробки запиту; компонентів додатка і їх координацію для обробки запиту.
* [компоненти додатку](structure-application-components.md): це об’єкти, зареєстровані в додатку і які надають * [компоненти додатку](structure-application-components.md): це об’єкти, зареєстровані в додатку і які надають
різноманітні можливості для обробки поточного запиту; різноманітні можливості для обробки запитів.
* [модулі](structure-modules.md): це самодостатні пакети, що включають в себе повністю всі ресурси для MVC. * [модулі](structure-modules.md): це самодостатні пакети, що включають в себе повністю всі ресурси для MVC.
Додаток може бути організовано з допомогою декількох модулів; Додаток може бути організовано за допомогою декількох модулів.
* [фільтри](structure-filters.md): це код, який повинен бути виконаний до і після оброки запиту контролерами; * [фільтри](structure-filters.md): це код, який повинен бути виконаний до і після обробки запиту контролерами.
* [віджети](structure-widgets.md): це об’єкти, які можуть включати в себе [представлення](structure-views.md). * [віджети](structure-widgets.md): це об’єкти, які можуть бути вбудованими у [представлення](structure-views.md).
Вони можуть містити різноманітну логіку і використовуватись в різноманітних представленнях. Вони можуть містити різноманітну логіку і можуть бути повто використаними у різних представленнях.
Нижче на діаграмі наведена структурна схема додатку: На наступній діаграмі наведена структурна схема додатку:
![Стандартна структура додатку](../guide/images/application-structure.png) ![Статична структура додатку](images/application-structure.png)
\ No newline at end of file
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