├── README.rst
├── book
├── controller.rst
├── doctrine.rst
├── forms.rst
├── from_flat_php_to_symfony2.rst
├── http_cache.rst
├── http_fundamentals.rst
├── index.rst
├── installation.rst
├── internals.rst
├── map.rst.inc
├── page_creation.rst
├── performance.rst
├── routing.rst
├── security.rst
├── service_container.rst
├── stable_api.rst
├── templating.rst
├── testing.rst
├── translation.rst
└── validation.rst
├── bundles
├── index.rst
└── map.rst.inc
├── contributing
├── code
│ ├── bugs.rst
│ ├── conventions.rst
│ ├── index.rst
│ ├── license.rst
│ └── security.rst
├── community
│ ├── index.rst
│ └── other.rst
├── documentation
│ ├── format.rst
│ ├── index.rst
│ └── overview.rst
├── index.rst
└── map.rst.inc
├── cookbook
├── cache
│ └── varnish.rst
├── controller
│ ├── error_pages.rst
│ └── service.rst
├── email.rst
├── gmail.rst
├── index.rst
├── logging
│ └── monolog.rst
├── map.rst.inc
├── routing
│ ├── scheme.rst
│ └── slash_in_parameter.rst
├── templating
│ ├── PHP.rst
│ └── global_variables.rst
├── testing
│ ├── http_authentication.rst
│ ├── insulating_clients.rst
│ └── profiling.rst
├── tools
│ ├── autoloader.rst
│ └── finder.rst
└── workflow
│ ├── _vendor_deps.rst.inc
│ ├── new_project_git.rst
│ └── new_project_svn.rst
├── glossary.rst
├── guides
├── cache
│ ├── http.rst
│ └── index.rst
├── emails.rst
├── forms
│ ├── fields.rst
│ ├── fields
│ │ ├── CollectionField.rst
│ │ └── RepeatedField.rst
│ ├── index.rst
│ ├── overview.rst
│ └── view.rst
├── index.rst
├── map.rst.inc
├── security
│ ├── authentication.rst
│ ├── authorization.rst
│ ├── index.rst
│ ├── overview.rst
│ └── users.rst
├── stable_api.rst
├── symfony1.rst
├── templating
│ ├── index.rst
│ └── recipes.rst
└── translation.rst
├── images
├── book
│ ├── doctrine_image_1.png
│ ├── doctrine_image_2.png
│ ├── doctrine_image_3.png
│ ├── doctrine_web_debug_toolbar.png
│ ├── form-simple.png
│ ├── form-simple2.png
│ ├── security_admin_role_access.png
│ ├── security_anonymous_user_access.png
│ ├── security_anonymous_user_denied_authorization.png
│ ├── security_authentication_authorization.png
│ ├── security_full_step_authorization.png
│ └── security_ryan_no_role_admin_access.png
├── docs-pull-request.png
├── http-xkcd-request.png
├── http-xkcd.png
├── quick_tour
│ ├── hello_fabien.png
│ ├── profiler.png
│ ├── web_debug_toolbar.png
│ └── welcome.jpg
└── request-flow.png
├── index.rst
├── quick_tour
├── index.rst
├── the_architecture.rst
├── the_big_picture.rst
├── the_controller.rst
└── the_view.rst
└── reference
├── constraints
└── map.rst.inc
├── dic_tags.rst
├── forms
├── twig_reference.rst
├── types.rst
└── types
│ ├── collection.rst
│ ├── date.rst
│ └── map.rst.inc
├── index.rst
└── map.rst.inc
/README.rst:
--------------------------------------------------------------------------------
1 | Как предложить свой вариант перевода?
2 | =====================================
3 |
4 | 1. Для начала, вам `нужно сделать Fork `_
5 | текущего `репозитория с переводом `_
6 |
7 | 2. В своем репозитории перевода `создайте branch `_
8 | и внесите законченный набор изменений в перевод. Желательно, чтобы изменения
9 | касались не более чем 10 файлов на один ``Pull Request``
10 |
11 | 3. Актуальную версию английской документации берите из `репозитория
12 | symfony-docs `_
13 |
14 | 4. Когда вы закончили правки в переводе, из нужного ``branch``
15 | `сделайте Pull Request `_
16 |
17 | 5. Для бОльшего удобства при определении изменений в файле перевода необходимо:
18 |
19 | 5.1. При создании нового перевода добавить в конец файла такую конструкцию (не будет отображаться при генерации):
20 |
21 | toctree
22 | hidden
23 |
24 | Translation source: YYYY-mm-dd REV
25 |
26 | где
27 | YYYY-mm-dd дата когда был взят исходник перевода,
28 | REV - короткий хеш ревизии (можно посмотреть командой `git log --oneline [file]`)
29 |
30 | 5.2. При обновлении перевода добавить в историю правок строку
31 |
32 | Corrected from: YYYY-mm-dd REV
33 |
34 | 5.3. Пример этой конструкции можно подсмотреть в конце этого файла, так как он не виден в распарсеном документе.
35 |
36 | где
37 | YYYY-mm-dd - дата когда был взят исходник для коррекции
38 | REV - также хеш ревизии по которой делалась коррекция
39 |
40 | Соглашения по переводу
41 | ======================
42 |
43 | 1. Некоторые частные случаи:
44 |
45 | +----------------------+------------------------+--------------------------+
46 | | **Исходный вариант** | **Правильный перевод** | **Неправильный перевод** |
47 | +----------------------+------------------------+--------------------------+
48 | | **Response object** | объект Response | объект ответа |
49 | +----------------------+------------------------+--------------------------+
50 |
51 | Не переводятся
52 | ==============
53 |
54 | 1. Служебная разметка::
55 |
56 | - :orphan:
57 | - .. glossary::
58 | - .. note::
59 | - .. tip::
60 | - .. toctree::
61 | :maxdepth: 2
62 | :glob:
63 | :numbered:
64 |
65 | 2. Служебные слова: "``API``", "``HTTP``", "``Symfony2``", "``Controller``", "``Response``", etc.
66 |
67 | Полезные ссылки
68 | ===============
69 |
70 | * Правила форматирования документации: `Symfony2 Documentation Format
71 | `_ и
72 | `reStructuredText Markup Specification `_
73 |
74 | .. toctree::
75 | :hidden:
76 |
77 | Translation source: 2011-01-01 [REV]
78 | Corrected from:
79 |
--------------------------------------------------------------------------------
/book/index.rst:
--------------------------------------------------------------------------------
1 | Книга
2 | =====
3 |
4 | .. toctree::
5 | :hidden:
6 |
7 | http_fundamentals
8 | from_flat_php_to_symfony2
9 | installation
10 | page_creation
11 | controller
12 | routing
13 | templating
14 | doctrine
15 | testing
16 | validation
17 | forms
18 | security
19 | http_cache
20 | translation
21 | bundles
22 | service_container
23 | internals
24 | stable_api
25 |
26 | .. include:: /book/map.rst.inc
27 |
--------------------------------------------------------------------------------
/book/installation.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Установка
3 |
4 | Установка и настройка Symfony2
5 | ==================================
6 |
7 | Цель этой главы помочь вам настроить и запустить рабочее приложение, созданное
8 | при помощи Symfony. К счастью, Symfony предлагает "дистрибутивы", которые
9 | представляют собой базовые проекты, которые вы можете загрузить и незамедлительно
10 | начать разработку.
11 |
12 | .. tip::
13 |
14 | Если вы ищите руководство по созданию нового проекта и размещению
15 | его в системе контроля версий, перейдите к секции `Использование системы контроля версий`_.
16 |
17 | Загрузка дистрибутива Symfony2
18 | -----------------------------------
19 |
20 | .. tip::
21 |
22 | Прежде всего, удостоверьтесь, что у вас установлен и настроен Web-сервер
23 | (например, Apache) и интерпретатор PHP 5.3.2 или более новый. Более подробную
24 | информацию о системных требованиях Symfony2 в можете найти в разделе
25 | :doc:`Системные требования`.
26 |
27 | Дистрибутивы Symfony2 представляют собой полнофункциональные приложения,
28 | включающие ядро Symfony2, набор полезных пакетов (Bundles), разумную структуру
29 | директорий и конфигурацию по умолчанию. Когда вы загружаете дистрибутив Symfony2,
30 | вы фактически загружаете скелетон функционирующего приложения, который тут же
31 | можно начать использовать как базу для вашего собственного приложения.
32 |
33 | Начнём со страницы загрузки Symfony2 `http://symfony.com/download`_.
34 | На этой странице вы можете видеть дистрибутив *Symfony Standard Edition*,
35 | который является основным дистрибутивом. Теперь вам нужно принять 2 решения:
36 |
37 | * Загрузить либо ``.tgz`` либо ``.zip`` архив - они идентичны, просто вопрос предпочтений.
38 |
39 | * Загрузить дистрибутив, включающий сторонние библиотеки или же не включающий
40 | (with/without vendors). Если у вас установлен `Git`_, вы можете загрузить
41 | Symfony2 "without vendors", так так это даст вам немного больше возможностей
42 | по включению сторонних библиотек/вендоров.
43 |
44 | Загрузите один из архивов в root-директорию вашего локального web-сервера
45 | и распакуйте его. В командной строке UNIX это можно выполнить при помощи
46 | одной из этих команд (заменяя ``###`` актуальным именем файла):
47 |
48 | .. code-block:: bash
49 |
50 | # for .tgz file
51 | tar zxvf Symfony_Standard_Vendors_2.0.###.tgz
52 |
53 | # for a .zip file
54 | unzip Symfony_Standard_Vendors_2.0.###.zip
55 |
56 | Когда вы выполните эту операцию, у вас будет директория ``Symfony/``, которая
57 | будет выглядеть примерно так:
58 |
59 | .. code-block:: text
60 |
61 | www/ <- root директория вашего веб-сервера
62 | Symfony/ <- распакованный архив
63 | app/
64 | cache/
65 | config/
66 | logs/
67 | src/
68 | ...
69 | vendor/
70 | ...
71 | web/
72 | app.php
73 | ...
74 |
75 | Обновление Вендоров
76 | ~~~~~~~~~~~~~~~~
77 |
78 | Далее, если вы загрузили архив "без вендоров" (without vendors), необходимо их
79 | установить, выполнив следующую команду:
80 |
81 | .. code-block:: bash
82 |
83 | php bin/vendors install
84 |
85 | Эта команда загрузит все необходимые библиотеки, включая собственно Symfony,
86 | в директорию ``vendor/``. Более подробную информацию о том, как управлять сторонними
87 | библиотеками в Symfony2 вы можете получить в разделе ":ref:`cookbook-managing-vendor-libraries`".
88 |
89 | Конфигурация и настройка
90 | ~~~~~~~~~~~~~~~~~~~~~~~
91 |
92 | На текущий момент все необходимые сторонние библиотеки теперь располагаются
93 | в директории ``vendor/``. Также в директории ``app/`` расположены настройки по-умолчанию,
94 | а в директории ``src/`` пример кода.
95 |
96 | Symfony2 поставляется с визуальным тестером конфигурации веб-сервера, для того чтобы
97 | помочь вам определить, подходит ли конфигурация вашего сервера и PHP для Symfony.
98 | Используйте следующий URL для проверки конфигурации:
99 |
100 | .. code-block:: text
101 |
102 | http://localhost/Symfony/web/config.php
103 |
104 | Если проверка показывает какие-либо несоответствия - исправьте их, прежде чем двигаться далее.
105 |
106 | .. sidebar:: Настройка прав доступа
107 |
108 | Одно из типовых замечаний заключается в том, что директории ``app/cache``
109 | и ``app/logs`` должны иметь права на запись как для веб-сервера, так и
110 | для пользователя, от имени которого выполняются команды из командной
111 | строки. В UNIX-системах, если пользователь, из-под которого запускается
112 | веб-сервер отличается от пользователя командной строки, вы можете выполнить
113 | следующие команды, для того чтобы быть уверенными, что права доступа
114 | настроены верно. Заменяйте ``www-data`` на пользователя веб-сервера и
115 | ``yourname`` на вашего пользователя командной строки:
116 |
117 | **1. Использование ACL в системах, которые поддерживают chmod +a**
118 |
119 | Многие системы позволяют использовать команду ``chmod +a``. Попробуйте
120 | выполнить её, и если вы получите сообщение об ошибке - пробуйте следующий
121 | метод:
122 |
123 | .. code-block:: bash
124 |
125 | rm -rf app/cache/*
126 | rm -rf app/logs/*
127 |
128 | sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
129 | sudo chmod +a "yourname allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
130 |
131 | **2. Использование Acl на системах, которые не поддерживают chmod +a**
132 |
133 | Некоторые системы не поддерживают ``chmod +a``, но поддерживают другую
134 | утилиту, ``setfacl``. Возможно, вам потребуется `включить поддержку ACL`_
135 | на вашем разделе и установить ``setfacl`` перед тем как использовать
136 | (это может потребоваться, например, если вы используете Ubuntu):
137 |
138 | .. code-block:: bash
139 |
140 | sudo setfacl -R -m u:www-data:rwx -m u:yourname:rwx app/cache app/logs
141 | sudo setfacl -dR -m u:www-data:rwx -m u:yourname:rwx app/cache app/logs
142 |
143 | **3. Без использования ACL**
144 |
145 | Если у вас нет прав на изменение ACL для директорий, вам потребуется
146 | изменить umask таким образом, чтобы директории cache и log были доступны
147 | на запись группе или же всем (world-writable) в зависимости от того находятся
148 | ли пользователи веб-сервера и командной строки в одной группе или нет.
149 | Для этого нужно вставить следующую строчку в начало файлов ``app/console``,
150 | ``web/app.php`` и ``web/app_dev.php``:
151 |
152 | .. code-block:: php
153 |
154 | umask(0002); // Разрешает использовать права 0775
155 |
156 | // или
157 |
158 | umask(0000); // Разрешает использовать права 0777
159 |
160 | Имейте в виду, что использование ACL предпочтительнее, когда вы
161 | имеете доступ к ним на сервере, потому что смена umask не является
162 | thread-safe.
163 |
164 | Когда все необходимые приготовления выполнены, кликните на ссылку "Go to the Welcome page"
165 | и перейдите на вашу первую "настоящую" страницу Symfony2:
166 |
167 | .. code-block:: text
168 |
169 | http://localhost/Symfony/web/app_dev.php/
170 |
171 | Symfony2 поздоровкается и поздравит вас с проделанной тяжелой работой!!
172 |
173 | .. image:: /images/quick_tour/welcome.jpg
174 |
175 | Начало разработки
176 | ---------------------
177 |
178 | Теперь, когда мы имеем настроенное Symfony2 приложение, вы можете
179 | начать разработку. Ваш дистрибутив может содержать примеры кода -
180 | прочтите файл ``README.rst`` из дистрибутива (это обычный текстовый файл)
181 | для того чтобы ознакомиться с тем, какие примеры включены в данный дистрибутив
182 | и как их можно будет удалить позднее.
183 |
184 | Если вы новичок в Symfony, ознакомьтесь с руководством ":doc:`page_creation`",
185 | где вы узнаете, как создавать страницы, изменять настройки и вообще делать всё
186 | необходимое для создания нового приложения.
187 |
188 | Использование системы контроля версий
189 | --------------------
190 |
191 | Если вы используете систему контроля версий типа ``Git`` или ``Subversion``,
192 | вы можете настроить вашу систему и начать коммитить ваш проект как вы это
193 | делаете обычно. Symfony Standard - это точка отсчёта для вашего нового проекта.
194 |
195 | Более подробные инструкции о том, как лучше всего настроить проект для
196 | хранения в git, загляните сюда: :doc:`/cookbook/workflow/new_project_git`.
197 |
198 | Игнорируем директорию ``vendor/``
199 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
200 |
201 | Если вы загрузили архив *без вендоров* вы можете спокойно игнорить директорию
202 | ``vendor/`` целиком и не коммитить её содержимое в систему контроля версий.
203 | В ``Git`` этого можно добиться, создав файл ``.gitignore`` и добавив в него
204 | следующую строку:
205 |
206 | .. code-block:: text
207 |
208 | vendor/
209 |
210 | После этого директория vendor не будет участвовать в коммитах. Это здорово
211 | (правда-правда!), потому что когда кто-то еще клонирует или выгрузит ваш проект
212 | он сможет запросто выполнить скрипт ``php bin/vendors install`` и загрузить
213 | все необходимые библиотеки.
214 |
215 | .. _`включить поддержку ACL`: https://help.ubuntu.com/community/FilePermissions#ACLs
216 | .. _`http://symfony.com/download`: http://symfony.com/download
217 | .. _`Git`: http://git-scm.com/
218 | .. _`GitHub Bootcamp`: http://help.github.com/set-up-git-redirect
219 |
--------------------------------------------------------------------------------
/book/map.rst.inc:
--------------------------------------------------------------------------------
1 | * :doc:`/book/http_fundamentals`
2 | * :doc:`/book/from_flat_php_to_symfony2`
3 | * :doc:`/book/installation`
4 | * :doc:`/book/page_creation`
5 | * :doc:`/book/controller`
6 | * :doc:`/book/routing`
7 | * :doc:`/book/templating`
8 | * :doc:`/book/doctrine`
9 | * :doc:`/book/testing`
10 | * :doc:`/book/validation`
11 | * :doc:`/book/forms`
12 | * :doc:`/book/security`
13 | * :doc:`/book/http_cache`
14 | * :doc:`/book/translation`
15 | * :doc:`/book/service_container`
16 | * :doc:`/book/performance`
17 | * :doc:`/book/internals`
18 | * :doc:`/book/stable_api`
19 |
--------------------------------------------------------------------------------
/book/performance.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Тестирование
3 |
4 | Быстродействие
5 | ==============
6 |
7 | Symfony2 быстр по умолчанию. Конечно, если вам действительно нужна скорость,
8 | существует много способов, которые помогут вам сделать Symfony ещё быстрее.
9 | В этой главе вы узнаете наиболее типичные и действенные способы для ускорения
10 | ваших приложений на Symfony.
11 |
12 | .. index::
13 | single: Быстродействие; Кэширование байт-кода
14 |
15 | Используйте Кэширование байт-кода (например, APC)
16 | ----------------------------------------------
17 |
18 | Самый простой и при этом самый лучший способ увеличить быстродействие
19 | приложения - использовать "кэширование байт-кода". Идея такого кэширования
20 | заключается в устранении необходимости постоянно перекомпилировать PHP
21 | файлы с исходным кодом. В настоящее время доступно несколько таких кэшеров, узнать
22 | подробнее о которых вы можете в Википедии на странице `инструменты для кэширования байт-кода`_.
23 | Некоторые из этих программ имеют открытый исходный код. Наиболее распространённым
24 | кэшером байт-кода, вероятно, является `APC`_.
25 |
26 | Кэширование байт-кода не имеет недостатков и Symfony2 разработан для успешного функционирования
27 | в таком окружении.
28 |
29 | Дальнейшие оптимизации
30 | ~~~~~~~~~~~~~~~~~~~~~~
31 |
32 | Кэш байт-кода как правило, отслеживает файлы исходников на предмет изменений.
33 | Это позволяет автоматически перекомпилировать файл заново, как только он
34 | изменится. Это очень удобно, но создаёт явную излишнюю нагрузку.
35 |
36 | Поэтому некоторые кэшеры байт-кода предлагают возможность отключить эти проверки.
37 | Очевидно, что если отключить проверку модификаций файлов, в обязанности администратора
38 | сервера будет входить очистка кэша при изменении любого исходника. В противном случае
39 | вы просто не увидите ваших изменений.
40 |
41 | Например, для отключения проверки модификации файлов в APC просто добавьте
42 | строку ``apc.stat=0`` в ваш файл php.ini.
43 |
44 | .. index::
45 | single: Быстродействие; Автозагрузчик
46 |
47 | Используйте кэширующий автозагрузчик (например ``ApcUniversalClassLoader``)
48 | --------------------------------------------------------------------------
49 |
50 | По умолчанию Symfony2 Standard Edition использует ``UniversalClassLoader`` в
51 | файле `autoloader.php`_. Этот автозагрузчик прост в использовании, так как
52 | он автоматически обнаруживает любые новые классы, которые вы помещаете в
53 | зарегистрированные директории.
54 |
55 | К сожалению, простота имеет свою цену, так как загрузчик последовательно
56 | просматривает все настроенные пространства имён для того чтобы найти один
57 | единственный файл, выполняя вызов ``file_exists`` до тех пока требуемый файл
58 | не будет найден.
59 |
60 | Простейшим решением является кэширование места расположения каждого класса,
61 | после того как он был найден в первый раз. Symfony также имеет класс ``ApcUniversalClassLoader``,
62 | который унаследован от ``UniversalClassLoader`` и сохраняет расположение
63 | класса в APC.
64 |
65 | Для использования этого загрузчика, измените ваш ``autoloader.php`` следующим
66 | образом:
67 |
68 | .. code-block:: php
69 |
70 | `
2 | * :doc:`SensioGeneratorBundle `
3 | * :doc:`JMSSecurityExtraBundle `
4 | * :doc:`DoctrineFixturesBundle `
5 | * :doc:`DoctrineMigrationsBundle `
6 | * :doc:`DoctrineMongoDBBundle `
7 |
--------------------------------------------------------------------------------
/contributing/code/bugs.rst:
--------------------------------------------------------------------------------
1 | Сообщение об ошибке
2 | ===============
3 |
4 | Когда находите ошибку в Symfony2, любезно просим вас сообщить о ней. Это поможет
5 | сделать Symfony2 лучше.
6 |
7 | .. caution::
8 |
9 | Если вы полагаете что нашли брешь в безопасности, воспользуйтесь специальной
10 | :doc:`процедурой `.
11 |
12 | Перед отправкой ошибки:
13 |
14 | * Дважды проверьте официальную `documentation`_ чтобы удостовериться что вы
15 | правильно используете фреймворк;
16 |
17 | * Попросите содействия в `users mailing-list`_, на `forum`_ или
18 | #symfony `IRC channel`_ если не уверены в том что это действительно ошибка.
19 |
20 | Если проблема без сомнений выглядит как ошибка, сообщите о ней, используя
21 | `tracker`_ и соблюдая несколько основных правил:
22 |
23 | * Используйте поле title чтобы чётко обозначить вопрос;
24 |
25 | * Опишите шаги, необходимые для воспроизведения ошибки с короткими примерами
26 | кода (ещё лучше предоставить модульный тест, показывающий её);
27 |
28 | * Предоставьте как можно более детальную информацию о своём окружении (ОС,
29 | версия PHP, версия Symfony, включённые расширения, ...);
30 |
31 | * *(по усмотрению)* Прикрепите :doc:`патч `.
32 |
33 | .. _documentation: http://docs.symfony-reloaded.org/
34 | .. _users mailing-list: http://groups.google.com/group/symfony-users
35 | .. _forum: http://forum.symfony-project.org/
36 | .. _IRC channel: irc://irc.freenode.net/symfony
37 | .. _tracker: http://trac.symfony-project.org/
38 |
--------------------------------------------------------------------------------
/contributing/code/conventions.rst:
--------------------------------------------------------------------------------
1 | Соглашения
2 | ===========
3 |
4 | Документ :doc:`стандарты ` описывает стандарты кодирования для проекта
5 | Symfony2, его внутренних и сторонних бандлов. Этот документ описывает стандарты
6 | кодирования и соглашения, используемые в ядре фреймворка чтобы сделать его
7 | более последовательным и предсказуемым. Можете следовать им в своём коде, но в
8 | этом нет особой нужды.
9 |
10 | Имена методов
11 | ------------
12 |
13 | Когда объект имеет "главную" множественную связь со связанными "предметами"
14 | (объекты, параметры и т. д.), имена методов стандартизуются:
15 |
16 | * ``get()``
17 | * ``set()``
18 | * ``has()``
19 | * ``all()``
20 | * ``replace()``
21 | * ``remove()``
22 | * ``clear()``
23 | * ``isEmpty()``
24 | * ``add()``
25 | * ``register()``
26 | * ``count()``
27 | * ``keys()``
28 |
29 | Использование этих методов применимо только когда ясно что существует основная
30 | связь:
31 |
32 | * ``CookieJar`` имеет множество ``Cookie``;
33 |
34 | * Служба ``Container`` имеет множество служб и множество параметров (т. к.
35 | службы это главная связь, то мы используем соглашения для имён для этой связи);
36 |
37 | * Консоль ``Input`` имеет множество аргументов и множество опций. Здесь нет
38 | "основной" связи, поэтому соглашения для имён не применяются.
39 |
40 | Для множественных связей, к которым не применяется соглашение, должны
41 | использоваться следующие методы (где ``XXX`` это имя соотвествующего предмета):
42 |
43 | ============== =================
44 | Главная связь Другие связи
45 | ============== =================
46 | ``get()`` ``getXXX()``
47 | ``set()`` ``setXXX()``
48 | ``has()`` ``hasXXX()``
49 | ``all()`` ``getXXXs()``
50 | ``replace()`` ``setXXXs()``
51 | ``remove()`` ``removeXXX()``
52 | ``clear()`` ``clearXXX()``
53 | ``isEmpty()`` ``isEmptyXXX()``
54 | ``add()`` ``addXXX()``
55 | ``register()`` ``registerXXX()``
56 | ``count()`` ``countXXX()``
57 | ``keys()`` не доступно
58 | ============== =================
59 |
--------------------------------------------------------------------------------
/contributing/code/index.rst:
--------------------------------------------------------------------------------
1 | Содействие в коде
2 | =================
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | Ошибки
8 | Патчи
9 | Безопасность
10 | Тесты
11 | Стандарты
12 | Соглашения
13 | Лицензия
14 |
--------------------------------------------------------------------------------
/contributing/code/license.rst:
--------------------------------------------------------------------------------
1 | Лицензия Symfony2
2 | ================
3 |
4 | Symfony2 выпущен под лицензией MIT.
5 |
6 | Согласно `Wikipedia`_:
7 |
8 | "Это разрешающая лицензия, означает что она разрешает использование в
9 | проприетарных программах, при условии что лицензия распространяется с
10 | этой программой. Также она GPL-совместима, это значит что GPL
11 | разрешает комбинирование и распространение с программами, использующими
12 | лицензию MIT."
13 |
14 | Лицензия
15 | -----------
16 |
17 | Copyright (c) 2004-2010 Fabien Potencier
18 |
19 | Permission is hereby granted, free of charge, to any person obtaining a copy
20 | of this software and associated documentation files (the "Software"), to deal
21 | in the Software without restriction, including without limitation the rights
22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
23 | copies of the Software, and to permit persons to whom the Software is furnished
24 | to do so, subject to the following conditions:
25 |
26 | The above copyright notice and this permission notice shall be included in all
27 | copies or substantial portions of the Software.
28 |
29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
35 | THE SOFTWARE.
36 |
37 | .. _Wikipedia: http://en.wikipedia.org/wiki/MIT_License
38 |
--------------------------------------------------------------------------------
/contributing/code/security.rst:
--------------------------------------------------------------------------------
1 | Сообщение о бреши в безопасности
2 | ==========================
3 |
4 | Нашли проблему в безопасности Symfony2? Не используйте mailing-list или баг
5 | трекер. Вместо них все проблемы безопасности должны отправляться на
6 | **security [at] symfony-project.com**. Письма, отправленные туда, перенаправляются
7 | в закрытый список рассылки для разработчиков Symfony.
8 |
9 | Для каждого сообщения мы пытаемся подтвердить уязвимость. Когда она подтвердится,
10 | разработчики трудятся над её решением, согласно этим шагам:
11 |
12 | 1. Отправляют подтверждение отправителю;
13 | 2. Работают над патчем;
14 | 3. Описывают уязвимость, возможные атаки и как
15 | закрыть/модернизировать пострадавшие приложения;
16 | 4. Применяют патч ко всем поддерживаемым версиям Symfony;
17 | 5. Публикуют сообщение на официальном блоге Symfony.
18 |
19 | .. note::
20 |
21 | Пока мы работаем над патчем, пожалуйста, не разглашайте проблему.
22 |
--------------------------------------------------------------------------------
/contributing/community/index.rst:
--------------------------------------------------------------------------------
1 | Содействие в коде
2 | =================
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | irc
8 | other
9 |
--------------------------------------------------------------------------------
/contributing/community/other.rst:
--------------------------------------------------------------------------------
1 | Другие источники
2 | ===============
3 |
4 | Чтобы быть в курсе того что происходит в сообществе, вам могут пригодиться
5 | эти дополнительные источники:
6 |
7 | * Список открытых `pull requests`_
8 | * Список последних `commits`_
9 | * Список открытых `bugs`_
10 | * Список open source `bundles`_
11 |
12 | .. _pull requests: https://github.com/fabpot/symfony/pulls
13 | .. _commits: https://github.com/fabpot/symfony/commits/master
14 | .. _bugs: http://trac.symfony-project.org/report/24
15 | .. _bundles: http://symfony2bundles.org/
16 |
--------------------------------------------------------------------------------
/contributing/documentation/format.rst:
--------------------------------------------------------------------------------
1 | Формат документации
2 | ====================
3 |
4 | Документация Symfony2 использует `reStructuredText`_ как язык разметки и
5 | `Sphinx`_ для создания вывода (HTML, PDF и т. д.).
6 |
7 | reStructuredText
8 | ----------------
9 |
10 | reStructuredText это "легкочитаемый, что видишь то и получишь, синтаксис
11 | разметки открытым текстом и система анализа".
12 |
13 | Узнайте больше о его синтаксисе, прочитав Symfony2 `documents`_
14 | или `reStructuredText Primer`_ на web сайте Sphinx.
15 |
16 | Если вы знакомы с Markdown, будьте осторожны, т. к. некоторые вещи очень знакомы,
17 | но отличаются:
18 |
19 | * Списки начинаются с начала строки (необходимость отступа отсутствует);
20 |
21 | * Встроенные блоки кода используют двойные кавычки (````как здесь````).
22 |
23 | Sphinx
24 | ------
25 |
26 | Sphinx - это система сборки, добавляющая полезные инструменты для создания
27 | документации из документов reStructuredText. Она добавляет указания и
28 | роли интерпретированного текста к стандартной reST `markup`_.
29 |
30 | Подсветка синтаксиса
31 | ~~~~~~~~~~~~~~~~~~~
32 |
33 | Все примеры кода подсвечиваются по умолчанию как язык PHP. Вы можете изменить
34 | их через директиву ``code-block``:
35 |
36 | .. code-block:: rst
37 |
38 | .. code-block:: yaml
39 |
40 | { foo: bar, bar: { foo: bar, bar: baz } }
41 |
42 | Если ваш PHP код начинается с ``foobar(); ?>
50 |
51 | .. note::
52 |
53 | Список поддерживаемых языков доступен на `Pygments website`_.
54 |
55 | Блоки конфигураций
56 | ~~~~~~~~~~~~~~~~~~~~
57 |
58 | Всякий раз как вы показываете конфигурацию, используйте директиву
59 | ``configuration-block`` чтобы отразить конфигурацию во всех поддерживаемых
60 | форматах (``PHP``, ``YAML`` и ``XML``):
61 |
62 | .. code-block:: rst
63 |
64 | .. configuration-block::
65 |
66 | .. code-block:: yaml
67 |
68 | # Configuration in YAML
69 |
70 | .. code-block:: xml
71 |
72 |
73 |
74 | .. code-block:: php
75 |
76 | // Configuration in PHP
77 |
78 | Предыдущая reST разметка отобразится следующим образом:
79 |
80 | .. configuration-block::
81 |
82 | .. code-block:: yaml
83 |
84 | # Configuration in YAML
85 |
86 | .. code-block:: xml
87 |
88 |
89 |
90 | .. code-block:: php
91 |
92 | // Configuration in PHP
93 |
94 | Текущий список поддерживаемых форматов:
95 |
96 | =============== ===========
97 | Формат разметки Отображается
98 | =============== ===========
99 | html HTML
100 | xml XML
101 | php PHP
102 | yaml YAML
103 | jinja Twig
104 | html+jinja Twig
105 | jinja+html Twig
106 | php+html PHP
107 | html+php PHP
108 | ini INI
109 | php-annotations Аннотации
110 | =============== ===========
111 |
112 | .. _reStructuredText: http://docutils.sf.net/rst.html
113 | .. _Sphinx: http://sphinx.pocoo.org/
114 | .. _documents: http://github.com/symfony/symfony-docs
115 | .. _reStructuredText Primer: http://sphinx.pocoo.org/rest.html
116 | .. _markup: http://sphinx.pocoo.org/markup/
117 | .. _Pygments website: http://pygments.org/languages/
118 |
--------------------------------------------------------------------------------
/contributing/documentation/index.rst:
--------------------------------------------------------------------------------
1 | Содействие в документации
2 | ==========================
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | Обзор
8 | Формат
9 | Переводы
10 | Лицензия
11 |
--------------------------------------------------------------------------------
/contributing/documentation/overview.rst:
--------------------------------------------------------------------------------
1 | Содействие в документации
2 | =================================
3 |
4 | Документация также важна как и код. Она следует тем же принципам:
5 | DRY, тесты, простота в обслуживании, расширяемость, оптимизация и рефакторинг
6 | вот некоторые из них. И конечно же документация имеет ошибки, опечатки,
7 | трудночитаемые инструкции и т. д.
8 |
9 | Содействие
10 | ------------
11 |
12 | Перед содействием вам необходимо ознакомиться с :doc:`языком разметки `,
13 | используемым в документации.
14 |
15 | Документация Symfony2 располагается в Git репозитории:
16 |
17 | .. code-block:: bash
18 |
19 | git://github.com/symfony/symfony-docs.git
20 |
21 | Если вы хотите прислать патч, клонируйте официальный репозиторий с документацией:
22 |
23 | .. code-block:: bash
24 |
25 | $ git clone git://github.com/symfony/symfony-docs.git
26 |
27 | .. note::
28 |
29 | Документация Symfony2 выходит под :doc:`лицензией ` Creative Commons
30 | Attribution-Share Alike 3.0 Unported.
31 |
32 | Сообщение об ошибке
33 | ------------------
34 |
35 | Самое простое содействие что вы можете оказать это сообщение об: опечатке,
36 | грамматической ошибке, ошибке в примере кода, отсутствующем пояснении и т. д.
37 |
38 | Шаги:
39 |
40 | * Сообщить об ошибке в баг трекер;
41 |
42 | * *(по желанию)* Прислать патч.
43 |
44 | Перевод
45 | -----------
46 |
47 | Прочитайте посвящённый этому :doc:`документ `.
48 |
--------------------------------------------------------------------------------
/contributing/index.rst:
--------------------------------------------------------------------------------
1 | Содействие
2 | ============
3 |
4 | Помощь в разработке Symfony2:
5 |
6 | .. toctree::
7 | :hidden:
8 |
9 | code/index
10 | documentation/index
11 | community/index
12 |
13 | .. include:: map.rst.inc
14 |
--------------------------------------------------------------------------------
/contributing/map.rst.inc:
--------------------------------------------------------------------------------
1 | * **Код**:
2 |
3 | * :doc:`Ошибки ` |
4 | * :doc:`Патчи ` |
5 | * :doc:`Безопасность ` |
6 | * :doc:`Тесты ` |
7 | * :doc:`Правила написания кода ` |
8 | * :doc:`Договорённости по коду ` |
9 | * :doc:`Лицензия `
10 |
11 | * **Документация**:
12 |
13 | * :doc:`Обзор ` |
14 | * :doc:`Формат ` |
15 | * :doc:`Переводы ` |
16 | * :doc:`Лицензия `
17 |
18 | * **Сообщество**:
19 |
20 | * :doc:`Совещания в IRC ` |
21 | * :doc:`Другие источники `
22 |
--------------------------------------------------------------------------------
/cookbook/cache/varnish.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Кеширование; Varnish
3 |
4 | Как использовать Varnish для ускорения работы сайта
5 | ===================================================
6 |
7 | Так как кеш Symfony2 использует стандартные HTTP-заголовки кеша, :ref:`symfony-gateway-cache`
8 | может быть легко заменен любым другим reverse proxy. Varnish - это мощный HTTP-акселератор
9 | с открыытми исходными кодами, который позволяет быстро отдавать закешированный контент
10 | и позволяет использовать :ref:`Edge Side Includes`.
11 |
12 | .. index::
13 | single: Varnish; настройка
14 |
15 | Настройка
16 | ---------
17 |
18 | Как мы видели раньше, Symfony2 может определить, используется ли reverse proxy, который
19 | понимает ESI, или нет. Это работает «из коробки», когда вы пользуетесь reverse proxy в Symfony2, но
20 | для работы с Varnish нужна специальная настройка. Благодаря стандарту, разработанному Akamaï
21 | (`Edge Architecture`_), советы из этой главы могут быть полезны даже если вы не используете Symfony2.
22 |
23 | .. note::
24 |
25 | Varnish поддерживает только атрибут ``src`` для тегов ESI (атрибуты ``onerror`` и ``alt`` игнорируются).
26 |
27 | Для начала настройте Varnish таким образом, чтобы он оповещал о поддержке ESI
28 | через заголовок ``Surrogate-Capability`` тех запросов, которые перенаправляются backend-приложению:
29 |
30 | .. code-block:: text
31 |
32 | sub vcl_recv {
33 | set req.http.Surrogate-Capability = "abc=ESI/1.0";
34 | }
35 |
36 | Затем, оптимизируйте Varnish таким образом, чтобы он парсил содержимое ответа,
37 | когда в нем присутствует хотя бы один тег ESI. Этого можно добиться, проверив наличие ответа
38 | ``Surrogate-Control``, который добавляется автоматически Symfony2:
39 |
40 | .. code-block:: text
41 |
42 | sub vcl_fetch {
43 | if (beresp.http.Surrogate-Control ~ "ESI/1.0") {
44 | unset beresp.http.Surrogate-Control;
45 | esi;
46 | }
47 | }
48 |
49 | .. caution::
50 |
51 | Не используйте сжатие с ESI, так как Varnish не сможет пропарсить
52 | содержимое ответа. Если вы хотите использовать сжатие, установите веб-сервер
53 | перед Varnish, который бы организовывал сжатие ответа.
54 |
55 | .. index::
56 | single: Varnish; Аннулирование
57 |
58 | Аннулирование кеша
59 | ------------------
60 |
61 | По идее, вам никогда не потребуется аннулирование кеша, потому что это уже учитывается в HTTP
62 | (см. :ref:`http-cache-invalidation`).
63 |
64 | Однако, Varnish может быть настроен так, чтобы мог принимать специальный метод HTTP - ``PURGE`` -
65 | который может аннулировать кеш для входящих запросов:
66 |
67 | .. code-block:: text
68 |
69 | sub vcl_hit {
70 | if (req.request == "PURGE") {
71 | set obj.ttl = 0s;
72 | error 200 "Purged";
73 | }
74 | }
75 |
76 | sub vcl_miss {
77 | if (req.request == "PURGE") {
78 | error 404 "Not purged";
79 | }
80 | }
81 |
82 | .. caution::
83 |
84 | Мы должны ограничить доступ к HTTP-методу ``PURGE``, чтобы избежать его использование
85 | другими людьми;
86 |
--------------------------------------------------------------------------------
/cookbook/controller/error_pages.rst:
--------------------------------------------------------------------------------
1 | Как создать собственные страницы ошибок
2 | =======================================
3 |
4 | Когда происходит какое-либо исключение в Symfony2, оно перехватывается внутри
5 | класса ``Kernel`` и в конечном счете перенаправляется специальному контроллеру,
6 | ``TwigBundle:Exception:show`` для обработки. Данный контроллер, который
7 | расположен в ядре пакета ``TwigBundle``, определяет какой из шаблонов
8 | ошибок показать, и какой установить код ошибки данному исключению.
9 |
10 | .. tip::
11 |
12 | Способов настройки перехвата исключений гораздо больше, чем описано здесь.
13 | Обработка внутреннего события ``kernel.exception``, которое возникает
14 | при возникновении исключений позволяет полностью получить контроль над
15 | обработкой исключений. Для получения дополнительной информации см.
16 | :ref:`kernel-kernel.exception`.
17 |
18 | Все шаблоны ошибок размещены внутри пакета ``TwigBundle``. Для переопределения
19 | шаблонов, следует использовать стандартный способ переопределения шаблонов,
20 | которые размещены внутри пакета. Для получения дополнительной информации см.
21 | :ref:`overiding-bundle-templates`.
22 |
23 | Например, чтобы переопределить шаблон по-умолчанию, который показывается
24 | конечному пользователю, создайте шаблон расположенный здесь:
25 | ``app/Resources/TwigBundle/views/Exception/error.html.twig``:
26 |
27 | .. code-block:: html+jinja
28 |
29 |
30 |
31 |
32 |
33 | An Error Occurred: {{ status_text }}
34 |
35 |
36 |
Oops! An Error Occurred
37 |
The server returned a "{{ status_code }} {{ status_text }}".
38 |
39 |
40 |
41 | .. tip::
42 |
43 | Если вы не знакомы с Twig'ом, не стоит переживать. Twig - простой,
44 | мощный и необязательный шаблонизатор, который интегрирован с ``Symfony2``.
45 |
46 | В добавок к обычной HTML странице ошибок, Symfony предоставляет доступ
47 | к страницам ошибок для самых распростренных форматов ответов, включая JSON
48 | (``error.json.twig``), XML, (``error.xml.twig``), и даже Javascript
49 | (``error.js.twig``). И мы назвали всего несоколько из них. Для переопределения
50 | любого из этих шаблонов, просто создайте новый файл с тем же именем в каталоге
51 | ``app/Resources/TwigBundle/views/Exception``.
52 | Такой способ является стандартным, с помощью которого переопределяются любые
53 | шаблоны которые есть в пакете.
54 |
55 | .. _cookbook-error-pages-by-status-code:
56 |
57 | Настройка 404 страницы и других страниц ошибок
58 | ----------------------------------------------
59 |
60 | Также вы можете настроить отдельные шаблоны ошибок в зависимости от кода
61 | состояния HTTP. Например, создайте шаблон
62 | ``app/Resources/TwigBundle/views/Exception/error404.html.twig`` для отображения
63 | специальной страницы для 404 ошибки (страница не найдена).
64 |
65 | Для определения, какой шаблон использовать, Symfony использует следующий
66 | алгоритм:
67 |
68 | * Сперва, он ищет шаблон для текущего формата и кода состояния (например
69 | ``error404.json.twig``);
70 |
71 | * Если такого шаблона не существует, тогда он ищет шаблон для текущего формата
72 | (например ``error.json.twig``);
73 |
74 | * Если такого шаблона не существует, тогда он возвращается к HTML шаблону
75 | (например ``error.html.twig``).
76 |
77 | .. tip::
78 | Полный список стандартных шаблонов ошибок находится в каталоге
79 | ``Resources/views/Exception``, пакета ``TwigBundle``. В стандартной поставке
80 | Symfony2, пакет ``TwigBundle`` находится в каталоге
81 | ``vendor/symfony/src/Symfony/Bundle/TwigBundle``. Чаще всего, самым простым
82 | способом настройки страницы ошибок, является её копирование из пакета
83 | ``TwigBundle`` в каталог ``app/Resources/TwigBundle/views/Exception`` и
84 | последующее редактирование.
85 |
86 | .. note::
87 |
88 | Страницы-исключения, которые удобны для отладки и которые демонстрируются
89 | разработчику также могут быть настроены данным способом - создайте шаблоны
90 | ``exception.html.twig`` для стандартной HTML страницы ошибок или
91 | соотвественно ``exception.json.twig`` для JSON.
92 |
--------------------------------------------------------------------------------
/cookbook/controller/service.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Контроллер; В качестве сервиса
3 |
4 | Как определять Контроллеры в качестве сервисов
5 | ==============================================
6 |
7 | Из руководства, вы узнали, что работать с контроллером легче,
8 | если он расширяет базовый класс :class:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller`.
9 | Данный способ хорошо работает, однако контроллер можно определить в виде службы.
10 |
11 | Чтобы сослаться на контроллер который определен в виде службы, следует использовать
12 | нотацию (обозначение) с одним знаком двоеточия (:). Например, мы определили сервис
13 | с именем ``my_controller`` и хотим вызвать метод ``indexAction()`` внутри него::
14 |
15 | $this->forward('my_controller:indexAction', array('foo' => $bar));
16 |
17 | Также необходимо использовать такую же запись для значений маршрута ``_controller``
18 |
19 | .. code-block:: yaml
20 |
21 | my_controller:
22 | pattern: /
23 | defaults: { _controller: my_controller:indexAction }
24 |
25 | При таком способе использования контроллера, он должен быть определен
26 | в настройках контейнера сервисов.
27 | Для получения дополнительной информации см. главу :doc:`Service Container
28 | `
29 |
30 | Контроллеры определенные как сервисы, скорее всего не будут
31 | наследниками базового класса ``Controller``. Вместо того, чтобы использовать
32 | методы которые он предоставляет, скорее всего вы будете работать непосредственно
33 | со службами которые необходимы именно вам. К счастью, решения многих
34 | распространенных задач не сопровождается большими сложностями и базовый класс
35 | ``Controller`` является хорошим источником знаний,
36 |
37 | .. note::
38 |
39 | Определение контроллера в виде службы требует немного больше усилий, чем
40 | просто контроллера. Основным преимуществом сервиса является то, что весь
41 | контроллер или любая служба которая передается контроллеру, может быть
42 | изменена через настройку контейнера сервисов. При разработке пакетов
43 | с открытым исходным кодом или пакета, который будет использован во множестве
44 | разных проектов, данное преимущество представляется особенно применимым.
45 | Даже если вы не будете использовать контроллеры в качестве служб, их
46 | применение можно будет обнаружить в пакетах Symfony2 с открытым исходным кодом.
47 |
--------------------------------------------------------------------------------
/cookbook/email.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Emails
3 |
4 | Как отправлять электронную почту
5 | ================================
6 | Рассылка электронной почты, является классической задачей для любого веб-приложения,
7 | и одной из тех задач, в которой имеются определенные сложности и потенциальные
8 | проблемы. Вместо изобретения колеса, одним из решений по рассылке электронной почты,
9 | является использование пакета ``SwiftmailerBundle``, который использует возможности
10 | библиотеки `Swiftmailer`_ .
11 |
12 | .. note::
13 |
14 | Не забудьте подключить пакет в ядре, до начала его использования::
15 |
16 | public function registerBundles()
17 | {
18 | $bundles = array(
19 | // ...
20 | new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
21 | );
22 |
23 | // ...
24 | }
25 |
26 | .. _swift-mailer-configuration:
27 |
28 | Настройка
29 | -------------
30 |
31 | До момента использования компонента Swiftmailer, его необходимо настроить.
32 | Обязательным в настройке компонента является параметр ``transport``:
33 |
34 | .. configuration-block::
35 |
36 | .. code-block:: yaml
37 |
38 | # app/config/config.yml
39 | swiftmailer:
40 | transport: smtp
41 | encryption: ssl
42 | auth_mode: login
43 | host: smtp.gmail.com
44 | username: ваш_логин
45 | password: ваш_пароль
46 |
47 | .. code-block:: xml
48 |
49 |
50 |
51 |
55 |
56 |
63 |
64 | .. code-block:: php
65 |
66 | // app/config/config.php
67 | $container->loadFromExtension('swiftmailer', array(
68 | 'transport' => "smtp",
69 | 'encryption' => "ssl",
70 | 'auth_mode' => "login",
71 | 'host' => "smtp.gmail.com",
72 | 'username' => "ваш_логин",
73 | 'password' => "ваш_пароль",
74 | ));
75 |
76 | Большая часть настроек Swiftmailer отвечает за то каким образом сообщения
77 | должны быть доставлены.
78 |
79 | Возможно использовать следующие параметры:
80 |
81 | * ``transport`` (``smtp``, ``mail``, ``sendmail``, или ``gmail``)
82 | * ``username``
83 | * ``password``
84 | * ``host``
85 | * ``port``
86 | * ``encryption`` (``tls``, или ``ssl``)
87 | * ``auth_mode`` (``plain``, ``login``, или ``cram-md5``)
88 | * ``spool``
89 |
90 | * ``type`` (каким образом организовывать очередь сообщений, на данный момент поддерживается только способ ``file``)
91 | * ``path`` (где хранить сообщения)
92 | * ``delivery_address`` (адрес на который отправляют ВСЕ письма)
93 | * ``disable_delivery`` (установка значения в true отключает доставку писем)
94 |
95 | Рассылка электронных сообщений
96 | ------------------------------
97 |
98 | Библиотека Swiftmailer работает с объектами ``Swift_Message``, и занимается их созданием,
99 | конфигурированием и рассылкой. "Рассылатель" (или mailer) отвечает за доставку сообщений
100 | и доступен через сервис ``mailer``. В целом отправка письма достаточно проста::
101 |
102 | public function indexAction($name)
103 | {
104 | // получаем 'mailer' (обязателен для инициализации Swift Mailer)
105 | $mailer = $this->get('mailer');
106 |
107 | $message = \Swift_Message::newInstance()
108 | ->setSubject('Hello Email')
109 | ->setFrom('send@example.com')
110 | ->setTo('recipient@example.com')
111 | ->setBody($this->renderView('HelloBundle:Hello:email', array('name' => $name)))
112 | ;
113 | $mailer->send($message);
114 |
115 | return $this->render(...);
116 | }
117 |
118 | Отметим, что "тело" письма, хранится в шаблоне и отображается с помощью метода
119 | ``renderView()``.
120 |
121 | Объект ``$message`` содержит множество других опций, таких как вложения, содержимое в формате HTML,
122 | и т.д. В документации к библиотеке Swiftmailer хорошо освещена глава `Создание сообщений`_ в которой
123 | можно найти информацию о том как создавать сообщения и опциях которые при этом доступны.
124 |
125 | .. tip::
126 |
127 | Рекомендуем прочитать документ ":doc:`gmail`" в котором рассказано как использовать почту
128 | gmail в качестве транспорта на стадии разработки.
129 |
130 | .. _`Swiftmailer`: http://www.swiftmailer.org/
131 | .. _`Создание сообщений`: http://swiftmailer.org/docs/messages
--------------------------------------------------------------------------------
/cookbook/gmail.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Emails; Gmail
3 |
4 | Как использовать Gmail для отправки электронных писем
5 | =====================================================
6 |
7 | Во время разработки, отправка писем с помощью сервиса Gmail может оказаться
8 | более легким и практичным решением, нежели использование SMTP сервера.
9 |
10 | .. tip::
11 | Вместо того, чтобы использовать свою учетную запись Gmail, лучшим решением будет
12 | создать новый аккаунт, применительно для этих целей.
13 |
14 | В конфигурационном файле для среды разработки, измените настройку ``transport`` на
15 | ``gmail`` и задайте настройки ``username`` и ``password`` согласно значениям из Gmail:
16 |
17 | .. configuration-block::
18 |
19 | .. code-block:: yaml
20 |
21 | # app/config/config_dev.yml
22 | swiftmailer:
23 | transport: gmail
24 | username: ваш_gmail_логин
25 | password: ваш_gmail_пароль
26 |
27 | .. code-block:: xml
28 |
29 |
30 |
31 |
35 |
36 |
40 |
41 | .. code-block:: php
42 |
43 | // app/config/config_dev.php
44 | $container->loadFromExtension('swiftmailer', array(
45 | 'transport' => "gmail",
46 | 'username' => "ваш_gmail_логин",
47 | 'password' => "ваш_gmail_пароль",
48 | ));
49 |
50 | На этом настройка Gmail закончена!
51 |
52 | .. note::
53 |
54 | Транспорт ``gmail`` является всего лишь готовым шаблоном, который использует транспорт ``smtp``
55 | и устанавливает поля ``encryption``, ``auth_mode`` и ``host`` для работы с почтой Gmail.
56 |
--------------------------------------------------------------------------------
/cookbook/index.rst:
--------------------------------------------------------------------------------
1 | Cookbook
2 | ========
3 |
4 | .. toctree::
5 | :hidden:
6 |
7 | workflow/new_project_git
8 | workflow/new_project_svn
9 |
10 | controller/error_pages
11 | controller/service
12 |
13 | routing/scheme
14 | routing/slash_in_parameter
15 |
16 | assetic/asset_management
17 | assetic/yuicompressor
18 | assetic/jpeg_optimize
19 | assetic/apply_to_option
20 |
21 | doctrine/file_uploads
22 | doctrine/common_extensions
23 | doctrine/event_listeners_subscribers
24 | doctrine/reverse_engineering
25 | doctrine/dbal
26 | doctrine/multiple_entity_managers
27 | doctrine/custom_dql_functions
28 |
29 | form/form_customization
30 | form/data_transformers
31 | form/dynamic_form_generation
32 | form/form_collections
33 | form/create_custom_field_type
34 | validation/custom_constraint
35 |
36 | configuration/environments
37 | configuration/external_parameters
38 | service_container/factories
39 | service_container/parentservices
40 | service_container/scopes
41 | configuration/pdo_session_storage
42 |
43 | bundles/best_practices
44 | bundles/inheritance
45 | bundles/override
46 | bundles/extension
47 |
48 | email
49 | gmail
50 | email/dev_environment
51 | email/spool
52 |
53 | testing/http_authentication
54 | testing/insulating_clients
55 | testing/profiling
56 | testing/doctrine
57 |
58 | security/remember_me
59 | security/voters
60 | security/acl
61 | security/acl_advanced
62 | security/force_https
63 | security/form_login
64 | security/securing_services
65 | security/entity_provider
66 | security/custom_provider
67 | security/custom_authentication_provider
68 | security/target_path
69 |
70 | cache/varnish
71 |
72 | templating/global_variables
73 | templating/PHP
74 |
75 | logging/monolog
76 | logging/monolog_email
77 |
78 | tools/autoloader
79 | tools/finder
80 | console
81 | debugging
82 |
83 | event_dispatcher/class_extension
84 | event_dispatcher/method_behavior
85 | request/mime_type
86 | profiler/data_collector
87 |
88 | web_services/php_soap_extension
89 |
90 | symfony1
91 |
92 | .. include:: /cookbook/map.rst.inc
93 |
--------------------------------------------------------------------------------
/cookbook/logging/monolog.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Журналирование
3 |
4 | Как использовать Monolog для журналирования
5 | ===========================================
6 | Библиотека Monolog_ предназначена для ведения журналов в PHP 5.3
7 | и используется Symfony2. Её прототипом послужила библиотека LogBook
8 | в Python.
9 |
10 | Использование
11 | --------------
12 | В Монологе, каждый элемент журналирования(логгер) определяет свой
13 | канал журналирования(logger). Каждый канал имеет стек обработчиков
14 | которые пишут журнал (лог) (причем обработчики могут быть общими).
15 |
16 | .. tip::
17 | При установке логгера в сервис, можно использовать :ref:`свой канал`
18 | и легко просматривать какая часть приложения оставила сообщение в журнале.
19 |
20 | Простейшим обработчиком является ``StreamHandler``, который пишет журнал
21 | в поток (по-умолчанию в ``app/logs/prod.log`` в production среде и
22 | ``app/logs/dev.log`` в среде разработки).
23 |
24 | В состав Monolog также входит мощный обработчик, предназначенный для журналирования
25 | в production среде: ``FingersCrossedHandler``. Он позволяет хранить сообщения в буфере
26 | и записывать их в журнал только при условии того, что оно доходит до уровня контроллера
27 | (ERROR в конфигурации стандартной редакции) перенаправляя их к другому обработчику.
28 |
29 | Чтобы записать сообщение в журнал, просто получите доступ к сервису логгера
30 | из контейнера в вашем контроллере::
31 |
32 | $logger = $this->get('logger');
33 | $logger->info('We just go the logger');
34 | $logger->err('An error occured');
35 |
36 | .. tip::
37 | Использование методов интерфейса
38 | :class:`Symfony\Component\HttpKernel\Log\LoggerInterface`
39 | позволит изменять реализацию логгера без внесения
40 | изменений в ваш код.
41 |
42 | Использование нескольких обработчиков
43 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44 |
45 | Логер использует стек обработчиков которые вызываются последовательно.
46 | Данная особенность позволяет легко записывать сообщения в журнал
47 | различными способами.
48 |
49 | .. configuration-block::
50 |
51 | .. code-block:: yaml
52 |
53 | monolog:
54 | handlers:
55 | syslog:
56 | type: stream
57 | path: /var/log/symfony.log
58 | level: error
59 | main:
60 | type: fingerscrossed
61 | action_level: warning
62 | handler: file
63 | file:
64 | type: stream
65 | level: debug
66 |
67 | .. code-block:: xml
68 |
69 |
74 |
75 |
76 |
82 |
88 |
93 |
94 |
95 |
96 | Конфигурация выше, определяет стек обработчиков которые будут вызваны в порядке
97 | в котором они объявлены.
98 |
99 | .. tip::
100 | Обработчик "file" не будет включен в стек, так как он сам используется в
101 | качестве вложенного обработчика в production среде.
102 |
103 | .. note::
104 | Если у вас появиться желание изменить настройки MonologBundle в другом
105 | файле настроек, то необходимо будет полностью переопределить весь стек.
106 | Он не может быть объединен с текущими настройками, т.к. в результате
107 | объединения настроек невозможно управлять порядком вызова обработчиков.
108 |
109 |
110 | Изменение форматирования
111 | ~~~~~~~~~~~~~~~~~~~~~~~~
112 |
113 | Обработчик использует ``Formatter`` для форматирования записей, перед записью их в журнал.
114 | Все обработчики Monolog по-умолчанию используют экземпляр ``Monolog\Formatter\LineFormatter``,
115 | но его легко заменить своим собственным. Ваш собственный форматировщик должен использовать интерфейс
116 | ``Monolog\Formatter\LineFormatterInterface``.
117 |
118 | .. configuration-block::
119 |
120 | .. code-block:: yaml
121 |
122 | services:
123 | my_formatter:
124 | class: Monolog\Formatter\JsonFormatter
125 | monolog:
126 | handlers:
127 | file:
128 | type: stream
129 | level: debug
130 | formatter: my_formatter
131 |
132 | .. code-block:: xml
133 |
134 |
139 |
140 |
141 |
142 |
143 |
144 |
150 |
151 |
152 |
153 |
154 | Дополнительная информация в сообщениях журнала
155 | ----------------------------------------------
156 |
157 | Monolog позволяет добавлять дополнительные данные в сообщения
158 | перед их записью в журнал. Процессор может быть применен как ко всему стеку
159 | так и к какому-либо определенному обработчику из его состава.
160 |
161 | Процессор - это сервис получающий запись в качестве первого аргумента и
162 | логгер или обработчик в качестве второго, в зависимости от того на каком уровне
163 | он вызывается.
164 |
165 | .. configuration-block::
166 |
167 | .. code-block:: yaml
168 |
169 | services:
170 | my_processor:
171 | class: Monolog\Processor\WebProcessor
172 | monolog:
173 | handlers:
174 | file:
175 | type: stream
176 | level: debug
177 | processors:
178 | - Acme\MyBundle\MyProcessor::process
179 | processors:
180 | - @my_processor
181 |
182 | .. code-block:: xml
183 |
184 |
189 |
190 |
191 |
192 |
193 |
194 |
200 |
201 |
202 |
203 |
204 |
205 |
206 | .. tip::
207 | Если вашему процессору требуются зависимости, то можно объявить
208 | сервис и реализовать метод ``__invoke`` в классе, с тем чтобы сделать
209 | его вызываемым. После изменений процессор можно добавить в стек.
210 |
211 | .. _Monolog: https://github.com/Seldaek/monolog
212 |
--------------------------------------------------------------------------------
/cookbook/map.rst.inc:
--------------------------------------------------------------------------------
1 | * **Процесс**
2 |
3 | * :doc:`/cookbook/workflow/new_project_git`
4 | * :doc:`/cookbook/workflow/new_project_svn`
5 |
6 | * **Контроллеры**
7 |
8 | * :doc:`/cookbook/controller/error_pages`
9 | * :doc:`/cookbook/controller/service`
10 |
11 | * **Маршрутизация**
12 |
13 | * :doc:`/cookbook/routing/scheme`
14 | * :doc:`/cookbook/routing/slash_in_parameter`
15 |
16 | * **Работа с JavaScript и CSS ресурсами**
17 |
18 | * :doc:`/cookbook/assetic/asset_management`
19 | * :doc:`/cookbook/assetic/yuicompressor`
20 | * :doc:`/cookbook/assetic/jpeg_optimize`
21 | * :doc:`/cookbook/assetic/apply_to_option`
22 |
23 | * **Взаимодествие с СУБД (Doctrine)**
24 |
25 | * :doc:`/cookbook/doctrine/file_uploads`
26 | * :doc:`/cookbook/doctrine/common_extensions`
27 | * :doc:`/cookbook/doctrine/event_listeners_subscribers`
28 | * :doc:`/cookbook/doctrine/dbal`
29 | * :doc:`/cookbook/doctrine/reverse_engineering`
30 | * :doc:`/cookbook/doctrine/multiple_entity_managers`
31 | * :doc:`/cookbook/doctrine/custom_dql_functions`
32 |
33 | * **Формы и Валидация**
34 |
35 | * :doc:`/cookbook/form/form_customization`
36 | * :doc:`/cookbook/form/create_custom_field_type`
37 | * :doc:`/cookbook/validation/custom_constraint`
38 | * (doctrine) :doc:`/cookbook/doctrine/file_uploads`
39 |
40 | * **Конфигурация и Сервис Контейнер**
41 |
42 | * :doc:`/cookbook/configuration/environments`
43 | * :doc:`/cookbook/configuration/external_parameters`
44 | * :doc:`/cookbook/service_container/factories`
45 | * :doc:`/cookbook/service_container/parentservices`
46 | * :doc:`/cookbook/service_container/scopes`
47 | * :doc:`/cookbook/configuration/pdo_session_storage`
48 |
49 | * **Пакеты**
50 |
51 | * :doc:`/cookbook/bundles/best_practices`
52 | * :doc:`/cookbook/bundles/inheritance`
53 | * :doc:`/cookbook/bundles/override`
54 | * :doc:`/cookbook/bundles/extension`
55 |
56 | * **Работа с Email**
57 |
58 | * :doc:`/cookbook/email`
59 | * :doc:`/cookbook/gmail`
60 | * :doc:`/cookbook/email/dev_environment`
61 | * :doc:`/cookbook/email/spool`
62 |
63 | * **Тестирование**
64 |
65 | * :doc:`/cookbook/testing/http_authentication`
66 | * :doc:`/cookbook/testing/insulating_clients`
67 | * :doc:`/cookbook/testing/profiling`
68 | * :doc:`/cookbook/testing/doctrine`
69 |
70 | * **Безопасность**
71 |
72 | * :doc:`/cookbook/security/remember_me`
73 | * :doc:`/cookbook/security/voters`
74 | * :doc:`/cookbook/security/acl`
75 | * :doc:`/cookbook/security/acl_advanced`
76 | * :doc:`/cookbook/security/force_https`
77 | * :doc:`/cookbook/security/form_login`
78 | * :doc:`/cookbook/security/securing_services`
79 | * :doc:`/cookbook/security/entity_provider`
80 | * :doc:`/cookbook/security/custom_provider`
81 | * :doc:`/cookbook/security/custom_authentication_provider`
82 | * :doc:`/cookbook/security/target_path`
83 |
84 | * **Кэширование**
85 |
86 | * :doc:`/cookbook/cache/varnish`
87 |
88 | * **Шаблоны**
89 |
90 | * :doc:`/cookbook/templating/global_variables`
91 | * :doc:`/cookbook/templating/PHP`
92 |
93 | * **Инструменты, Логгирование внутренние компоненты**
94 |
95 | * :doc:`/cookbook/tools/autoloader`
96 | * :doc:`/cookbook/tools/finder`
97 | * :doc:`/cookbook/console`
98 | * :doc:`/cookbook/debugging`
99 | * :doc:`/cookbook/logging/monolog`
100 |
101 | * **Web Сервисы**
102 |
103 | * :doc:`/cookbook/web_services/php_soap_extension`
104 |
105 | * **Расширение Symfony**
106 |
107 | * :doc:`/cookbook/event_dispatcher/class_extension`
108 | * :doc:`/cookbook/event_dispatcher/method_behavior`
109 | * :doc:`/cookbook/request/mime_type`
110 | * :doc:`/cookbook/profiler/data_collector`
111 |
112 | * **Symfony2 для разработчиков symfony1**
113 |
114 | * :doc:`/cookbook/symfony1`
115 |
116 | .. toctree::
117 | :hidden:
118 |
119 | Translation source: 2011-09-30 283b2f5
120 |
--------------------------------------------------------------------------------
/cookbook/routing/scheme.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Routing; Scheme requirement
3 |
4 | Как заставить маршрутизатор всегда использовать HTTPS или HTTP
5 | ===============================================
6 |
7 | Иногда Вам необходимо установить защищенное соединение для ресурса и Вы хотите
8 | быть уверенными, что доступ к этому ресурсу будет всегда осуществляться через
9 | протокол HTTPS. Компонент маршрутизации позволяет Вам настроить принудительное
10 | использование схемы URI с помощью параметра ``_scheme``:
11 |
12 | .. configuration-block::
13 |
14 | .. code-block:: yaml
15 |
16 | secure:
17 | pattern: /secure
18 | defaults: { _controller: AcmeDemoBundle:Main:secure }
19 | requirements:
20 | _scheme: https
21 |
22 | .. code-block:: xml
23 |
24 |
25 |
26 |
29 |
30 |
31 | AcmeDemoBundle:Main:secure
32 | https
33 |
34 |
35 |
36 | .. code-block:: php
37 |
38 | use Symfony\Component\Routing\RouteCollection;
39 | use Symfony\Component\Routing\Route;
40 |
41 | $collection = new RouteCollection();
42 | $collection->add('secure', new Route('/secure', array(
43 | '_controller' => 'AcmeDemoBundle:Main:secure',
44 | ), array(
45 | '_scheme' => 'https',
46 | )));
47 |
48 | return $collection;
49 |
50 | Приведенная выше конфигурация маршрута ``secure`` всегда будет использовать
51 | протокол HTTPS.
52 |
53 | Когда генерируется URL ``secure``, в случае, если текущая схема HTTP, то
54 | Symfony автоматически сгенерирует абсолютный URL со схемой HTTPS.
55 |
56 | .. code-block:: text
57 |
58 | # Если текущая схема - HTTPS
59 | {{ path('secure') }}
60 | # сгенерирует /secure
61 |
62 | # Если текущая схема - HTTP
63 | {{ path('secure') }}
64 | # сгенерирует https://example.com/secure
65 |
66 | Правило также применяется и для входящих запросов. Если Вы попробуете
67 | получить доступ к ресурсу ``/secure`` через HTTP, Symfony автоматически
68 | перенаправит Вас на тот же URL, но с использованием схемы HTTPS.
69 |
70 | Приведенные выше примеры используют протокол ``https`` для ``_scheme``, но
71 | также Вы можете ограничить маршрут на использование только ``http`` протокола.
72 |
73 | .. note::
74 |
75 | Компонент Безопасности предлагает другой способ ограничить использование
76 | только HTTP или HTTPs протокола посредством параметра ``requires_channel``.
77 | Этот альтернативный метод больше подходит для защиты "области" Вашего web-сайта
78 | (все URL в ``/admin``) или когда Вы хотите защитить все URL, объявленные в
79 | стороннем пакете.
80 |
81 | .. toctree::
82 | :hidden:
83 |
84 | Translation source: 2011-10-30 [a4dbf4c91]
85 |
--------------------------------------------------------------------------------
/cookbook/routing/slash_in_parameter.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Routing; Allow / in route parameter
3 |
4 | Как разрешить символ "/" в параметре маршрута
5 | =================================================
6 |
7 | Иногда у Вас возникает необходимость иметь в параметрах URL символ слеш
8 | ``/``. Например, рассмотрим классический маршрут ``/hello/{name}``.
9 | По умолчанию, ``/hello/Fabien`` будет соответствовать этому маршруту, но не
10 | ``/hello/Fabien/Kris``. Так получается из-за того, что Symfony использует
11 | этот символ в качестве разделителя между частями маршрута.
12 |
13 | В этом руководстве описывается, как Вы можете настроить маршрут так, чтобы
14 | ``/hello/Fabien/Kris`` соответствовал шаблону ``/hello/{name}``, и где
15 | ``{name}`` был бы равен ``Fabien/Kris``.
16 |
17 | Настройка Маршрута
18 | -------------------
19 |
20 | По умолчанию система маршрутизации Symfony принимает только те параметры,
21 | которые соответствуют регулярному выражению: ``[^/]+``. Оно соответствует
22 | всем символам, за исключением символа слеш ``/``.
23 |
24 | Вам необходимо явно разрешить слеш ``/`` в параметрах. Для этого укажите
25 | более "либеральное" регулярное выражение.
26 |
27 | .. configuration-block::
28 |
29 | .. code-block:: yaml
30 |
31 | _hello:
32 | pattern: /hello/{name}
33 | defaults: { _controller: AcmeDemoBundle:Demo:hello }
34 | requirements:
35 | name: ".+"
36 |
37 | .. code-block:: xml
38 |
39 |
40 |
41 |
44 |
45 |
46 | AcmeDemoBundle:Demo:hello
47 | .+
48 |
49 |
50 |
51 | .. code-block:: php
52 |
53 | use Symfony\Component\Routing\RouteCollection;
54 | use Symfony\Component\Routing\Route;
55 |
56 | $collection = new RouteCollection();
57 | $collection->add('_hello', new Route('/hello/{name}', array(
58 | '_controller' => 'AcmeDemoBundle:Demo:hello',
59 | ), array(
60 | 'name' => '.+',
61 | )));
62 |
63 | return $collection;
64 |
65 | .. code-block:: php-annotations
66 |
67 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
68 |
69 | class DemoController
70 | {
71 | /**
72 | * @Route("/hello/{name}", name="_hello", requirements={"name" = ".+"})
73 | */
74 | public function helloAction($name)
75 | {
76 | // ...
77 | }
78 | }
79 |
80 | Вот и все! Сейчас параметр ``{name}`` может содержать символ ``/``.
81 |
82 | .. toctree::
83 | :hidden:
84 |
85 | Translation source: 2012-02-10 [d4cee24]
--------------------------------------------------------------------------------
/cookbook/templating/PHP.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: PHP Templates
3 |
4 | Как использовать PHP шаблоны вмесро Twig
5 | ========================================
6 |
7 | Не смотря на то, что Symfony2 по умолчанию использует шаблоны Twig в частве
8 | шаблонного движка, вы можете использовать PHP шаблоны, если захотите. Оба шаблонных
9 | движка одинаково поддерживаются в Symfony2. Symfony2 также добавляет к PHP
10 | шаблонам несколько удобных фич, чтобы сделать их более мощными.
11 |
12 | Отображение PHP шаблонов
13 | -----------------------
14 |
15 | Если вы хотите использовать PHP шаблоны, во-первых, убедитесь что вы их активировали
16 | в настройках приложения:
17 |
18 | .. configuration-block::
19 |
20 | .. code-block:: yaml
21 |
22 | # app/config/config.yml
23 | framework:
24 | # ...
25 | templating: { engines: ['twig', 'php'] }
26 |
27 | .. code-block:: xml
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | .. code-block:: php
39 |
40 | $container->loadFromExtension('framework', array(
41 | // ...
42 | 'templating' => array(
43 | 'engines' => array('twig', 'php'),
44 | ),
45 | ));
46 |
47 | Теперь вы можете использовать PHP шаблоны взамен Twig, просто указывая
48 | расширение ``.php`` для ваших шаблонов, а не ``.twig``. Контроллер из
49 | примера ниже отображает шаблон ``index.html.php``:
50 |
51 | .. code-block:: php
52 |
53 | render('AcmeHelloBundle:Hello:index.html.php', array('name' => $name));
59 | }
60 |
61 | .. index::
62 | single: Templating; Layout
63 | single: Layout
64 |
65 | Декорирование шаблонов
66 | ----------------------
67 |
68 | Чаще всего, шаблоны используют некоторые общие элементы, например всем известные
69 | header и footer. В Symfony2 этот вопрос решается несколько иначе - шаблон может
70 | быть декорирован другим шаблоном.
71 |
72 | Шаблон ``index.html.php`` будет декорироваться шаблоном ``layout.html.php``
73 | благодаря вызову метода ``extend()``:
74 |
75 | .. code-block:: html+php
76 |
77 |
78 | extend('AcmeHelloBundle::layout.html.php') ?>
79 |
80 | Hello !
81 |
82 | Нотация ``AcmeHelloBundle::layout.html.php`` выглядит знакомо, не так ли? Это
83 | такая же нотация, которая используется для ссылки на шаблон. Часть ``::``
84 | означает, что элемент "контроллер", таким образом соответствующий файл
85 | распложен напрямую в директории ``views/``.
86 |
87 | Теперь давайте взглянем на файл ``layout.html.php``:
88 |
89 | .. code-block:: html+php
90 |
91 |
92 | extend('::base.html.php') ?>
93 |
94 |
Hello Application
95 |
96 | output('_content') ?>
97 |
98 | Декорирующий шаблон (layout) в свою очередь декорирован другим шаблоном (``::base.html.php``).
99 | Symfony2 поддерживает множественные уровни декорирования: layout может быть декорирован
100 | другим шаблоном более высокого уровня. Когда часть "bundle" в наименовании шаблона
101 | пуста, он ищется в директории ``app/Resources/views/``. Она содержит глобальные
102 | шаблоны уровня приложения:
103 |
104 | .. code-block:: html+php
105 |
106 |
107 |
108 |
109 |
110 |
111 | output('title', 'Hello Application') ?>
112 |
113 |
114 | output('_content') ?>
115 |
116 |
117 |
118 | Для обоих шаблонов, выражение ``$view['slots']->output('_content')`` заменяется
119 | контентом дочернего шаблона: ``index.html.php`` и ``layout.html.php`` соответственно
120 | (о слотах подробнее поговорим в следующей секции).
121 |
122 | Как вы можете видеть, Symfony2 предоставляет методы посредством объекта ``$view``.
123 | В шаблоне переменная ``$view`` всегда доступна и представляет собой специальный объект,
124 | которые предоставляет пакет методов, которые собственно и крутят винтики в движке
125 | шаблонизатора.
126 |
127 | .. index::
128 | single: Templating; Slot
129 | single: Slot
130 |
131 | Работаем со Слотами
132 | ------------------
133 |
134 | Слот - это некоторый кусочек кода, определённый в шаблоне и который можно
135 | повторно использовать в любом декорирующем шаблоне. В шаблоне ``index.html.php``
136 | определён слот ``title``:
137 |
138 | .. code-block:: html+php
139 |
140 |
141 | extend('AcmeHelloBundle::layout.html.php') ?>
142 |
143 | set('title', 'Hello World Application') ?>
144 |
145 | Hello !
146 |
147 | Базовый шаблон уже имеет код для вывода заголовка:
148 |
149 | .. code-block:: html+php
150 |
151 |
152 |
153 |
154 | output('title', 'Hello Application') ?>
155 |
156 |
157 | Метод ``output()`` вставляет контент слота и опционально принимает значение по умолчанию,
158 | которое будет использовано, если слот не будет определён. ``_content`` - это
159 | особый слот, который содержит рендер дочернего шаблона.
160 |
161 | Для больших слотов можно использовать расширенный синтаксис:
162 |
163 | .. code-block:: html+php
164 |
165 | start('title') ?>
166 | Some large amount of HTML
167 | stop() ?>
168 |
169 | .. index::
170 | single: Templating; Include
171 |
172 | Включение других шаблонов
173 | -------------------------
174 |
175 | Наилучшим способом сделать доступным в других шаблонах некоторый кусочек кода -
176 | это включить его в другие шаблорны.
177 |
178 | Создадим шаблон ``hello.html.php``:
179 |
180 | .. code-block:: html+php
181 |
182 |
183 | Hello !
184 |
185 | И изменим шаблон ``index.html.php`` таким образом чтобы он его подключал:
186 |
187 | .. code-block:: html+php
188 |
189 |
190 | extend('AcmeHelloBundle::layout.html.php') ?>
191 |
192 | render('AcmeHelloBundle:Hello:hello.html.php', array('name' => $name)) ?>
193 |
194 | Метод ``render()`` вычисляет и возвращает значение другого шаблона (это такой
195 | же метод, который используется в контроллере).
196 |
197 | .. index::
198 | single: Templating; Embedding Pages
199 |
200 | Встраивание Контроллеров
201 | ---------------------------
202 |
203 | Что, если вы захотите встроить результат выполнения другого контроллера в шаблон?
204 | Это очень удобно при работе с Ajax, или же когда встраиваемый шаблон требует
205 | некоторые переменные, не доступные в главном шаблоне.
206 |
207 | Если вы создадите действие ``fancy`` и захотите включить его в
208 | шаблон ``index.html.php``, просто используйте такой код:
209 |
210 | .. code-block:: html+php
211 |
212 |
213 | render('AcmeHelloBundle:Hello:fancy', array('name' => $name, 'color' => 'green')) ?>
214 |
215 | Строка ``AcmeHelloBundle:Hello:fancy`` ссылается на действие ``fancy`` контроллера ``Hello``:
216 |
217 | .. code-block:: php
218 |
219 | render('AcmeHelloBundle:Hello:fancy.html.php', array('name' => $name, 'object' => $object));
230 | }
231 |
232 | // ...
233 | }
234 |
235 | Но где же определён элемент массива ``$view['actions']``? Как и ``$view['slots']``,
236 | здесь вызывается хелпер и в следующей секции об этом будет чуть подробнее.
237 |
238 | .. index::
239 | single: Templating; Helpers
240 |
241 | Использование хелперов в шаблонах
242 | ----------------------
243 |
244 | Система шаблонов Symfony2 может быть легко и просто при помощи хелперов. Хелперы
245 | это PHP объекты, которые предоставляют удобные фичи в контексте шаблонов. ``actions``
246 | и ``slots`` - это два хелпера из числа встроенных в Symfony2.
247 |
248 | Создание ссылок между страницами
249 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
250 |
251 | Говоря о веб-приложениях, создание ссылок между страницами - это крайне необходимая
252 | функция. Вместо того, чтобы хордкодить URLы в шаблонах, нужно использовать
253 | хелпер ``router``, который знает как генерировать URL, основываясь на конфигурацию
254 | маршрутизатора. Если использовать этот подход, любой URL может быть легко
255 | обновлён при помощи изменения конфигурации:
256 |
257 | .. code-block:: html+php
258 |
259 |
260 | Greet Thomas!
261 |
262 |
263 | Метод ``generate()`` принимает имя маршрута и массив параметров в качестве аргументов.
264 | Имя маршрута - это ключ, по которому определяется маршрут, а параметры - это значения
265 | плэйсхолдеров из шаблона маршрута:
266 |
267 | .. code-block:: yaml
268 |
269 | # src/Acme/HelloBundle/Resources/config/routing.yml
270 | hello: # The route name
271 | pattern: /hello/{name}
272 | defaults: { _controller: AcmeHelloBundle:Hello:index }
273 |
274 | Работа с ресурсами: картинки, JavaScript, CSS
275 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
276 |
277 | Чем бы был интернет без картинок, джаваскриптов и стилей? Symfony2 предоставляет
278 | вам таг ``assets`` для работы с ними:
279 |
280 | .. code-block:: html+php
281 |
282 |
283 |
284 |
285 |
286 | Главной обязанностью хелпера ``assets`` - сделать ваше приложение более
287 | портируемым. Благодаря этому хелперу вы можете перемещать корень вашего
288 | приложения внутри web root не меняя ничего у коде шаблонов.
289 |
290 | Экранирование
291 | ---------------
292 |
293 | При использовании PHP шаблонов необходимо экранировать все переменные::
294 |
295 | escape($var) ?>
296 |
297 | По умолчанию, метод ``escape()`` полагает, что переменная выводится в контексте HTML.
298 | Второй аргумент метода позволяет изменить контекст. Например, выводя что-то в JavaScript,
299 | используйте ``js`` контекст::
300 |
301 | escape($var, 'js') ?>
302 |
303 | .. toctree::
304 | :hidden:
305 |
306 | Translation source: 2011-12-06 4cd15f3
307 |
--------------------------------------------------------------------------------
/cookbook/templating/global_variables.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Templating; Global variables
3 |
4 | Внедрение переменных во все шаблоны (т.н. Глобальные переменные)
5 | ==============================================================
6 |
7 | Иногда вам может потребоваться, чтобы некоторая переменная была доступна
8 | во всех ваших шаблонах. Этого можно достичь при помощи вашего файла ``app/config/config.yml``:
9 |
10 | .. code-block:: yaml
11 |
12 | # app/config/config.yml
13 | twig:
14 | # ...
15 | globals:
16 | ga_tracking: UA-xxxxx-x
17 |
18 | Теперь, переменная ``ga_tracking`` будет доступна во всех шаблонах Twig:
19 |
20 | .. code-block:: html+jinja
21 |
22 |
Our google tracking code is: {{ ga_tracking }}
23 |
24 | Так просто! Вы также можете получить доступ к системным параметрам
25 | ":ref:`book-service-container-parameters`", которые позволят вам изолировать
26 | или повторно использовать значение:
27 |
28 | .. code-block:: ini
29 |
30 | ; app/config/parameters.yml
31 | [parameters]
32 | ga_tracking: UA-xxxxx-x
33 |
34 | .. code-block:: yaml
35 |
36 | # app/config/config.yml
37 | twig:
38 | globals:
39 | ga_tracking: %ga_tracking%
40 |
41 | The same variable is available exactly as before.
42 |
43 | Более сложные глобальные переменные
44 | -----------------------------------
45 |
46 | Если глобальная переменная, которую вам надо использовать, более сложная -
47 | к примеру, объект - тогда вы не сможете воспользоваться приведённым выше методом.
48 | Вместо этого вам нужно создать :ref:`Расширение Twig `
49 | и возвращать глобальную переменную среди значений метода ``getGlobals``.
50 |
51 | .. toctree::
52 | :hidden:
53 |
54 | Translation source: 2011-12-06 5d5cdf2
55 |
--------------------------------------------------------------------------------
/cookbook/testing/http_authentication.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Тесты; HTTP Аутентификация
3 |
4 | Как смоделировать HTTP аутентификацию в Функциональном тесте
5 | ============================================================
6 |
7 | Если вашему приложению необходима HTTP аутентификация, передайте имя
8 | пользователя и пароль в качестве переменных сервера в метод ``createClient()``::
9 |
10 | $client = $this->createClient(array(), array(
11 | 'PHP_AUTH_USER' => 'username',
12 | 'PHP_AUTH_PW' => 'pa$$word',
13 | ));
14 |
15 | Также можно делать переопределения в каждом запросе::
16 |
17 | $client->request('DELETE', '/post/12', array(), array(
18 | 'PHP_AUTH_USER' => 'username',
19 | 'PHP_AUTH_PW' => 'pa$$word',
20 | ));
21 |
22 |
--------------------------------------------------------------------------------
/cookbook/testing/insulating_clients.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Тесты
3 |
4 | Как тестировать взаимодействие с несколькими клиентами
5 | ======================================================
6 |
7 | Если требуется смоделировать взаимодействие между разными Клиентами
8 | (представьте, например, чат), то создайте несколько Клиентов::
9 |
10 | $harry = static::createClient();
11 | $sally = static::createClient();
12 |
13 | $harry->request('POST', '/say/sally/Hello');
14 | $sally->request('GET', '/messages');
15 |
16 | $this->assertEquals(201, $harry->getResponse()->getStatusCode());
17 | $this->assertRegExp('/Hello/', $sally->getResponse()->getContent());
18 |
19 | Этот подход работает, за исключением тех случаев, когда ваш код обрабатывает
20 | глобальное состояния или зависит от библиотек третьих лиц, которые также его
21 | используют. Для подобных случаев можно изолировать клиентов::
22 |
23 | $harry = static::createClient();
24 | $sally = static::createClient();
25 |
26 | $harry->insulate();
27 | $sally->insulate();
28 |
29 | $harry->request('POST', '/say/sally/Hello');
30 | $sally->request('GET', '/messages');
31 |
32 | $this->assertEquals(201, $harry->getResponse()->getStatusCode());
33 | $this->assertRegExp('/Hello/', $sally->getResponse()->getContent());
34 |
35 | Изолированные клиенты выполняют свои запросы в отдельных чистых PHP процессах,
36 | что исключает любые побочные эффекты.
37 |
38 | .. tip::
39 |
40 | Так как изолированный клиент работает медленнее, то можно одного клиента
41 | оставить выполняться в главном процессе, а остальных изолировать.
42 |
--------------------------------------------------------------------------------
/cookbook/testing/profiling.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Тесты; Профилирование
3 |
4 | Как использовать профилировщик в Функциональном тесте
5 | =====================================================
6 |
7 | Настоятельно рекомендуется чтобы функциональный тест проверял только Response.
8 | Но если пишутся функциональные тесты, следящие за production серверами,
9 | то возможно у вас появится желание написать тесты, использующие данные
10 | профилировщика, т. к. они позволяют проверить множество параметров и обеспечить
11 | соблюдение определенных показателей.
12 |
13 | :doc:`Профилировщик ` в Symfony2 собирает множество
14 | данных по каждому запросу. Используйте их для замера количества запросов к БД,
15 | времени затраченного фреймворком и т. д. Но, прежде чем писать проверочные
16 | выражения, всегда следует проверять доступность профилировщика (по-умолчанию
17 | к нему есть доступ в ``test`` окружении)::
18 |
19 | class HelloControllerTest extends WebTestCase
20 | {
21 | public function testIndex()
22 | {
23 | $client = static::createClient();
24 | $crawler = $client->request('GET', '/hello/Fabien');
25 |
26 | // Напишите выражения, относящиеся к Response
27 | // ...
28 |
29 | // Проверяет, доступен ли профилировщик
30 | if ($profile = $client->getProfile()) {
31 | // проверяет количество запросов
32 | $this->assertTrue($profile->get('db')->getQueryCount() < 10);
33 |
34 | // проверяет время, затраченное фреймворком
35 | $this->assertTrue( $profile->get('timer')->getTime() < 0.5);
36 | }
37 | }
38 | }
39 |
40 | Если тест провалится, основываясь на данных профилировщика (например, слишком
41 | много запросов к БД), то можно воспользоваться Веб Профилировщиком для анализа
42 | запросов после завершения тестов. Это легко сделать если встроить метку в
43 | сообщение об ошибке::
44 |
45 | $this->assertTrue(
46 | $profile->get('db')->getQueryCount() < 30,
47 | sprintf('Checks that query count is less than 30 (token %s)', $profile->getToken())
48 | );
49 |
50 | .. caution::
51 |
52 | Хранилище профилировщика может различаться в зависимости от окружения
53 | (особенно если используется хранилище SQLite, являющееся одним из
54 | сконфигурированных по-умолчанию).
55 |
56 | .. note::
57 |
58 | В тестах информация профилировщика доступна даже в тех случаях, когда клиент
59 | изолирован либо используется HTTP слой.
60 |
61 | .. tip::
62 |
63 | Прочитайте про API встроенных :doc:`сборщиков данных `
64 | чтобы узнать больше об их интерфейсах.
65 |
--------------------------------------------------------------------------------
/cookbook/tools/autoloader.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | pair: Автозагрузчик; Конфигурирование
3 |
4 | Как автоматически загружать классы
5 | ===================================
6 |
7 | В случаях когда используются неопределенные классы, PHP использует
8 | механизм автозагрузки которому поручает загрузку файла описывающего
9 | класс. С Symfony2 поставляется универсальный автозагрузчик, который
10 | может загружать классы из файлов, которые реализуют одно из следующих
11 | соглашений:
12 |
13 | * Технические `стандарты`_ взаимодействия для имен пространств
14 | и классов PHP 5.3;
15 | * Соглашения именования классов в `PEAR`_.
16 |
17 | Если ваши классы и библиотеки 3-х лиц которыми вы пользуетесь в проекте
18 | следуют данным стандартам, автозагрузчик Symfony2 единственный автозагрузчик
19 | который вам когда-либо понадобиться.
20 |
21 | Использование
22 | -------------
23 |
24 | .. versionadded:: 2.1
25 | The ``useIncludePath`` method was added in Symfony 2.1.
26 |
27 | Регистрация класса :class:`Symfony\\Component\\ClassLoader\\UniversalClassLoader`
28 | автозагрузки проста:
29 |
30 | .. code-block:: php
31 |
32 | useIncludePath(true);
41 |
42 | $loader->register();
43 |
44 | С целью улучшения быстродействия - пути к классам могут кэшироваться в памяти
45 | при помощи APC - для этого необходимо регистрировать класс
46 | :class:`Symfony\\Component\\ClassLoader\\ApcUniversalClassLoader`:
47 |
48 | .. code-block:: php
49 |
50 | register();
58 |
59 | Автозагрузчик полезен только при условии того, что вы добавите несколько библиотек для
60 | автозагрузки.
61 |
62 | .. note::
63 | Автозагрузчик автоматически регистрируется приложением на Symfony2 (см.
64 | ``app/autoload.php``).
65 |
66 | Если классы которые требуется автоматически загружать используют пространства имён,
67 | применяйте методы :method:`Symfony\\Component\\ClassLoader\\UniversalClassLoader::registerNamespace`
68 | или
69 | :method:`Symfony\\Component\\ClassLoader\\UniversalClassLoader::registerNamespaces`:
70 |
71 | .. code-block:: php
72 |
73 | registerNamespace('Symfony', __DIR__.'/vendor/symfony/src');
75 |
76 | $loader->registerNamespaces(array(
77 | 'Symfony' => __DIR__.'/../vendor/symfony/src',
78 | 'Monolog' => __DIR__.'/../vendor/monolog/src',
79 | ));
80 |
81 | $loader->register();
82 |
83 | Для классов которые используют соглашения об именовании в стиле
84 | PEAR, используйте метод :method:`Symfony\\Component\\ClassLoader\\UniversalClassLoader::registerPrefix`
85 | или :method:`Symfony\\Component\\ClassLoader\\UniversalClassLoader::registerPrefixes`:
86 |
87 | .. code-block:: php
88 |
89 | registerPrefix('Twig_', __DIR__.'/vendor/twig/lib');
91 |
92 | $loader->registerPrefixes(array(
93 | 'Swift_' => __DIR__.'/vendor/swiftmailer/lib/classes',
94 | 'Twig_' => __DIR__.'/vendor/twig/lib',
95 | ));
96 |
97 | $loader->register();
98 |
99 | .. note::
100 | Некоторые библиотеки требуют чтобы их корневой каталог также был
101 | включен в качестве пути для поиска PHP (``set_include_path()``).
102 |
103 | Классы находящиеся в подпространствах имён или в суб-иерархии классов PEAR
104 | можно легко сгруппировать в подмножества, которые можно использовать в
105 | больших проектах:
106 |
107 | .. code-block:: php
108 |
109 | registerNamespaces(array(
111 | 'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
112 | 'Doctrine\\DBAL\\Migrations' => __DIR__.'/vendor/doctrine-migrations/lib',
113 | 'Doctrine\\DBAL' => __DIR__.'/vendor/doctrine-dbal/lib',
114 | 'Doctrine' => __DIR__.'/vendor/doctrine/lib',
115 | ));
116 |
117 | $loader->register();
118 |
119 | В этом примере, при попытке использования класса в пространстве имен ``Doctrine\Common``
120 | или его потомков, автозагрузчик в первую очередь просмотрит в поисках класса каталог
121 | ``doctrine-common``, и в последнюю очередь каталог ``Doctrine`` (который сконфигурирован
122 | последним). В данном случае порядок регистрации классов важен.
123 |
124 | .. _стандарты: http://groups.google.com/group/php-standards/web/psr-0-final-proposal
125 | .. _PEAR: http://pear.php.net/manual/en/standards.php
126 |
127 | .. toctree::
128 | :hidden:
129 |
130 | Translation source: n/a
131 | Corrected from: 2011-10-29 4459652
132 |
--------------------------------------------------------------------------------
/cookbook/tools/finder.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Поисковик (Finder)
3 |
4 | Как искать файлы
5 | ================
6 |
7 | С помощью компонента :namespace:`Symfony\\Component\\Finder` можно
8 | легко и быстро находить необходимые файлы и каталоги.
9 |
10 | Использование
11 | -------------
12 |
13 | Класс :class:`Symfony\\Component\\Finder\\Finder` производит поиск
14 | файлов и/или каталогов::
15 |
16 | use Symfony\Component\Finder\Finder;
17 |
18 | $finder = new Finder();
19 | $finder->files()->in(__DIR__);
20 |
21 | foreach ($finder as $file) {
22 | print $file->getRealpath()."\n";
23 | }
24 |
25 | Объект ``$file`` является экземпляром класса :phpclass:`SplFileInfo`.
26 | Код выше печатает имена всех файлов в текущем каталоге рекурсивно. Класс Finder
27 | использует свободный интерфейс, так что все методы возвращают тип данных Finder.
28 |
29 | .. tip::
30 | Экземпляр класса Finder является `Iterator`_ (итератором) PHP. Так, что вместо
31 | прохода над Finder'ом с помощью ``foreach``, можно также конвертировать его
32 | в массив с помощью метода :phpfunction:`iterator_to_array`, или получить
33 | количество элементов, с помощью :phpfunction:`iterator_count`.
34 |
35 | Критерии поиска
36 | ---------------
37 | Расположение
38 | ~~~~~~~~~~~~
39 |
40 | Расположение является единственным обязательным параметром. Данный параметр
41 | указывает поисковику какую директорию использовать для поиска::
42 |
43 | $finder->in(__DIR__);
44 |
45 | Поиск в нескольких местах реализуется с помощью последовательных вызовов
46 | метода :method:`Symfony\\Component\\Finder\\Finder::in`::
47 |
48 | $finder->files()->in(__DIR__)->in('/elsewhere');
49 |
50 | Исключение каталогов из поиска осуществляется методом
51 | :method:`Symfony\\Component\\Finder\\Finder::exclude` ::
52 |
53 | $finder->in(__DIR__)->exclude('ruby');
54 |
55 | Т.к. Finder использует PHP итераторы, ему можно передать любой
56 | URL с поддерживаемым протоколом `protocol`_::
57 |
58 | $finder->in('ftp://example.com/pub/');
59 |
60 | Также он работает с пользовательскими потоками::
61 |
62 | use Symfony\Component\Finder\Finder;
63 |
64 | $s3 = new \Zend_Service_Amazon_S3($key, $secret);
65 | $s3->registerStreamWrapper("s3");
66 |
67 | $finder = new Finder();
68 | $finder->name('photos*')->size('< 100K')->date('since 1 hour ago');
69 | foreach ($finder->in('s3://bucket-name') as $file) {
70 | // do something
71 |
72 | print $file->getFilename()."\n";
73 | }
74 |
75 | .. note::
76 | В документации `Streams`_ можно узнать как создавать свои собственные потоки.
77 |
78 | Файлы или каталоги
79 | ~~~~~~~~~~~~~~~~~~
80 |
81 | По-умолчанию, Finder возвращает файлы или каталоги; но
82 | методами :method:`Symfony\\Component\\Finder\\Finder::files`
83 | и :method:`Symfony\\Component\\Finder\\Finder::directories`
84 | можно управлять его поведением::
85 |
86 | $finder->files();
87 |
88 | $finder->directories();
89 |
90 | Если хотите следовать по ссылкам, используйте метод ``followLinks()``::
91 |
92 | $finder->files()->followLinks();
93 |
94 | По-умолчанию, итератор игнорирует популярные файлы VCS. Данное поведение может быть изменено
95 | с помощью метода ``ignoreVCS()``::
96 |
97 | $finder->ignoreVCS(false);
98 |
99 | Сортировка
100 | ~~~~~~~~~~
101 |
102 | Сортировка результатов по имени или типу (каталоги первыми, файлы последними)::
103 |
104 | $finder->sortByName();
105 |
106 | $finder->sortByType();
107 |
108 | .. note::
109 | Обратите внимание, что методам ``sort*`` требуется получить все подходящие
110 | под обработку объекты. Данная процедура при больших объемах весьма медленна.
111 |
112 | Также можно определить свои собственные алгоритмы сортировки с помощью метода ``sort()``::
113 |
114 | $sort = function (\SplFileInfo $a, \SplFileInfo $b)
115 | {
116 | return strcmp($a->getRealpath(), $b->getRealpath());
117 | };
118 |
119 | $finder->sort($sort);
120 |
121 | Имена файлов
122 | ~~~~~~~~~~~~
123 |
124 | Наложить ограничения по имени файлов можно с помощью метода
125 | :method:`Symfony\\Component\\Finder\\Finder::name`::
126 |
127 | $finder->files()->name('*.php');
128 |
129 | Метод ``name()`` принимает строки, регулярные выражения или шаблоны::
130 |
131 | $finder->files()->name('/\.php$/');
132 |
133 | Метод ``notNames()`` исключает файлы по шаблону::
134 |
135 | $finder->files()->notName('*.rb');
136 |
137 | Размер файла
138 | ~~~~~~~~~~~~
139 |
140 | Ограничить размер файлов можно с помощью метода
141 | Restrict files by size with the :method:`Symfony\\Component\\Finder\\Finder::size`::
142 |
143 | :method:`Symfony\\Component\\Finder\\Finder::size` method::
144 |
145 | $finder->files()->size('< 1.5K');
146 | Ограничить размер в рамках можно с помощью связанных вызовов::
147 |
148 | Оператор сравнения может быть любым из следующих: ``>``, ``>=``, ``<``, '<=',
149 | '=='.
150 |
151 | Целевое значение может использовать приставки (``k``, ``ki``) килобайты,
152 | (``m``, ``mi``) мегабайты, или (``g``, ``gi``) гигабайты. Те которые используют
153 | суффиксы ``i`` (киби/миби и т.д.) в названии являются версиями ``2**n`` согласно
154 | стандарту`IEC standard`_.
155 |
156 | Дата файла
157 | ~~~~~~~~~~
158 |
159 | С помощью метода :method:`Symfony\\Component\\Finder\\Finder::date`
160 | можно наложить ограничения на файлы по дате последнего изменения::
161 |
162 | $finder->date('since yesterday');
163 | Оператор сравнения может быть любым из следующих:``>``, ``>=``, ``<``, '<=',
164 | '=='. Также можно использовать псевдонимы ``since`` или ``after`` для оператора
165 | ``>``, и ``until`` или ``before`` в качестве ``<``.
166 |
167 | Целевое значение может быть любой датой поддерживаемой функцией `strtotime`_
168 |
169 |
170 | Глубина каталогов
171 | ~~~~~~~~~~~~~~~~~
172 |
173 | По-умолчанию Finder просматривает каталоги рекурсивно. Ограничить глубину
174 | поиска можно с помощью метода :method:`Symfony\\Component\\Finder\\Finder::depth`::
175 |
176 | $finder->depth('== 0');
177 | $finder->depth('< 3');
178 |
179 | Фильтрация
180 | ~~~~~~~~~~
181 |
182 | Ограничить результаты поиска согласно собственным параметрам,
183 | можно используя метод :method:`Symfony\\Component\\Finder\\Finder::filter`::
184 |
185 | $filter = function (\SplFileInfo $file)
186 | {
187 | if (strlen($file) > 10) {
188 | return false;
189 | }
190 | };
191 |
192 | $finder->files()->filter($filter);
193 |
194 | Метод ``filter()`` получает замыкание в качестве аргумента. Для каждого подходящего
195 | файла, замыкание вызывается с аргументом в виде объекта который является экземпляром
196 | класса :phpclass:`SplFileInfo`.
197 | Файл исключается из множества результатов если замыкание возвращает ``false``.
198 |
199 | .. _strtotime: http://www.php.net/manual/en/datetime.formats.php
200 | .. _Iterator: http://www.php.net/manual/en/spl.iterators.php
201 | .. _protocol: http://www.php.net/manual/en/wrappers.php
202 | .. _Streams: http://www.php.net/streams
203 | .. _IEC standard: http://physics.nist.gov/cuu/Units/binary.html
204 |
--------------------------------------------------------------------------------
/cookbook/workflow/_vendor_deps.rst.inc:
--------------------------------------------------------------------------------
1 | Управление внешними библиотеками с помощью bin/vendors и deps
2 | ---------------------------------------------------
3 |
4 | Каждый проект на Symfony использует большую группу сторонних библиотек.
5 |
6 | По умолчанию, эти библиотеки скачиваются при запуске команды ``php bin/vendors install``.
7 | Этот скрипт читает из файла ``deps`` и скачивает полученные библиотеки в папку
8 | ``vendor/``. Он также читает файл ``deps.lock`` и связывает каждую упомянутую библиотеку
9 | с указанным git хешем в репозитории.
10 |
11 | В нашем проекте сторонние библиотеки не являются частью git репозитория.
12 | Они также не являются дочерними модулями (submodules). Вместо этого мы
13 | полагаемся на файлы ``deps`` и ``deps.lock``, а также на скрипт ``bin/vendors``,
14 | который всем управляет. Эти файлы лежат в репозитории, и каждая версия проекта
15 | использует необходимые версии сторонних библиотек. Получается, Вы можете
16 | использовать скрипт vendors, чтобы Ваш проект был в актуальном состоянии.
17 |
18 | Всякий раз, когда разработчик копирует проект, он должен выполнить скрипт
19 | ``php bin/vendors install`` чтобы убедиться, что все необходимые сторонние библиотеки
20 | установлены.
21 |
22 | .. sidebar:: Обновление Symfony
23 |
24 | Поскольку Symfony это группа сторонних библиотек и эти сторонние
25 | библиотеки полностью контролируются через ``deps`` и ``deps.lock``,
26 | обновление Symfony - это простое обновление этих файлов до состояния их
27 | в последней версии Symfony Standard Edition.
28 |
29 | Конечно же, если Вы добавили дополнительные источники в ``deps`` или ``deps.lock``,
30 | убедитесь, что обновляете только оригинальные источники (т.е. не трогайте
31 | Ваши дополнительные источники).
32 |
33 | .. caution::
34 |
35 | Также существует команда ``php bin/vendors update``, но она не предназначена
36 | для обновления Вашего проекта и Вам не надо ее использовать в работе. Эта
37 | команда служит для фиксации версий всех Ваших сторонних библиотек при обновлений
38 | их до версии, указанной в ``deps``, и записывает их хеши в файл ``deps.lock``.
39 |
40 | Кроме того, если Вам захотелось обновить файл ``deps.lock`` в соответствии с
41 | установленными сторонними библиотеками, то просто запустите команду ``php bin/vendors lock``
42 | чтобы сохранить соответствующие git SHA идентификаторы в файле deps.lock.
43 |
44 | .. toctree::
45 | :hidden:
46 |
47 | Translation source: 2012-02-10 [76b75713b5]
--------------------------------------------------------------------------------
/cookbook/workflow/new_project_git.rst:
--------------------------------------------------------------------------------
1 | Как создать и разместить Проект на Symfony2 в git-репозитории
2 | =================================================
3 |
4 | .. tip::
5 |
6 | Несмотря на то, что эта статья посвещяна git, основные принципы,
7 | описанные тут, актуальны и для Subversion.
8 |
9 | Если Вы уже прочитали статью :doc:`/book/page_creation` и немного познакомились
10 | с Symfony, смело можно создавать свой собственный проект. Этот рецепт познакомит Вас
11 | с лучшим способом создания проекта на Symfony2 с использованием системы контроля версий `git`_.
12 |
13 | Предварительная настройка проекта
14 | ---------------------
15 |
16 | Для начала Вам нужно скачать Symfony и инициализировать Ваш локальный
17 | git репозиторий:
18 |
19 | 1. Скачайте `Symfony2 Standard Edition`_ без сторонных библиотек (without vendors).
20 |
21 | 2. Распакуйте дестрибутив. Будет создана директория Symfony с базовой
22 | структурой проекта, файлами конфигурации и т.д. Переименуйте ее, как
23 | сочтете нужным.
24 |
25 | 3. Создайте новый файл с именем ``.gitignore`` в корне Вашего проекта
26 | и вставьте в него следующий код. Все файлы, совпадающие с перечисленными
27 | шаблонами, git будет игнорировать:
28 |
29 | .. code-block:: text
30 |
31 | /web/bundles/
32 | /app/bootstrap*
33 | /app/cache/*
34 | /app/logs/*
35 | /vendor/
36 | /app/config/parameters.yml
37 |
38 | 4. Скопируйте ``app/config/parameters.yml`` в ``app/config/parameters.yml.dist``.
39 | Файл ``parameters.yml`` игнорируется git'ом (смотрите выше), поэтому такие
40 | машино-зависимые настройки, как например пароль от базы данных, не будут отправляться в репозиторий.
41 | Имея файл ``app/config/parameters.yml.dist`` в репозитории, новые разработчики смогут
42 | быстро выгрузуть проект, скопировать этот файл в ``parameters.yml``, настроить его и
43 | начать разработку.
44 |
45 | 5. Инициализируйте Ваш git репозиторий:
46 |
47 | .. code-block:: bash
48 |
49 | $ git init
50 |
51 | 6. Добавьте все начальные файлы в git:
52 |
53 | .. code-block:: bash
54 |
55 | $ git add .
56 |
57 | 7. Создайте первый коммит Вашего проекта:
58 |
59 | .. code-block:: bash
60 |
61 | $ git commit -m "Initial commit"
62 |
63 | 8. Наконец, скачайте все сторонние библиотеки:
64 |
65 | .. code-block:: bash
66 |
67 | $ php bin/vendors install
68 |
69 | На этом моменте Вы имеете полностью функционирующий проект на Symfony2, который
70 | правильно размещен в git. Вы можете начинать программировать и отправлять изменения
71 | в Ваш репозиторий.
72 |
73 | Сейчас Вы можете переключиться на статью :doc:`/book/page_creation`
74 | для изучения вопросов конфигурации и разработки Вашего приложения.
75 |
76 | .. tip::
77 |
78 | Стандартная версия Symfony2 содержит в себе некоторый функционал для демонстрации.
79 | Чтобы убрать демонстрационный код, следуйте инструкциям `Standard Edition Readme`_.
80 |
81 | .. _cookbook-managing-vendor-libraries:
82 |
83 | .. include:: _vendor_deps.rst.inc
84 |
85 | Сторонние библиотеки и Дочерние модули
86 | ~~~~~~~~~~~~~~~~~~~~~~
87 |
88 | Вместо того, чтобы использовать ``deps`` и скрипт ``bin/vendors`` для управления
89 | Вашими сторонними библиотеками, Вы можете использовать родные `git submodules`_.
90 | Нет ничего плохого в этом выборе, но система ``deps`` - это официальное решение
91 | этой проблемы и дочерние модули git'а могут внести дополнительные сложности в работу.
92 |
93 | Хранение Вашего проекта на Удаленном Сервере
94 | ---------------------------------------
95 |
96 | Сейчас у Вас имеется полностью функционирующий проект на Symfony2,
97 | сохраненный в git. Тем не менее, во многих случаях Вам понадобится
98 | хранить проект на удаленном сервере. Например для хранения резервной
99 | копии проекта или чтобы другие разработчики также имели доступ к проекту
100 | для совместной работы.
101 |
102 | Самый простой способ хранить Ваш проект на удаленном сервере - это `GitHub`_.
103 | На нем публичный репозитории бесплатны. За закрытые репозитории
104 | Вам нужно будет платить ежемесячную плату.
105 |
106 | С другой стороны, Вы можете хранить Ваш git репозиторий на любом сервере.
107 | Достаточно лишь создать `barebones repository`_ и загрузить данные на него.
108 | Библиотека `Gitolite`_ может помочь Вам в этом процессе.
109 |
110 | .. _`git`: http://git-scm.com/
111 | .. _`Symfony2 Standard Edition`: http://symfony.com/download
112 | .. _`Standard Edition Readme`: https://github.com/symfony/symfony-standard/blob/master/README.md
113 | .. _`git submodules`: http://book.git-scm.com/5_submodules.html
114 | .. _`GitHub`: https://github.com/
115 | .. _`barebones repository`: http://progit.org/book/ch4-4.html
116 | .. _`Gitolite`: https://github.com/sitaramc/gitolite
117 |
118 | .. toctree::
119 | :hidden:
120 |
121 | Translation source: 2012-01-08 [de00067aa5]
122 | Corrected from: 2012-02-10 [76b75713b5]
--------------------------------------------------------------------------------
/cookbook/workflow/new_project_svn.rst:
--------------------------------------------------------------------------------
1 | Как создать и разместить Проект на Symfony2 в Subversion
2 | =========================================================
3 |
4 | .. tip::
5 |
6 | Эта статья повествует непосредственно о Subversion и основана на принципах,
7 | описанных в статье :doc:`/cookbook/workflow/new_project_git`.
8 |
9 | Как только Вы прочитали :doc:`/book/page_creation` и познакомились с принципами
10 | Symfony, Вы наверняка уже готовы начинать разрабатывать собственный проект.
11 | Управлять проектами Symfony рекомендуется с помощью системы контроля версии
12 | `git`_, но некоторые предпочитают использовать `Subversion`_, и это тоже
13 | хорошо! После прочтения этого рецепта Вы научитесь управлять проектом,
14 | используя `svn`_, по аналогии, как это делается с помощью `git`_.
15 |
16 | .. tip::
17 |
18 | Этот метод позволяет отслеживать Ваш проект на Symfony2 в репозитории
19 | Subversion. Существует несколько способов сделать это и здесь описывается
20 | один из них.
21 |
22 | Репозиторий Subversion
23 | -------------------------
24 |
25 | В этой статье предполагается, что Ваш репозиторий соответствует
26 | стандартной широкораспространенный структуре:
27 |
28 | .. code-block:: text
29 |
30 | myproject/
31 | branches/
32 | tags/
33 | trunk/
34 |
35 | .. tip::
36 |
37 | Большинство хостингов Subversion должны следовать этой общепринятой
38 | практике. Это рекомендуемая структура в `Version Control with Subversion`_
39 | и она используется многими бесплатными хостингами (смотрите :ref:`svn-hosting`).
40 |
41 | Начальная настройка проекта
42 | ---------------------------
43 |
44 | Для начала вам нужно скачать Symfony2 и получить базовые настройки Subversion:
45 |
46 | 1. Скачайте `Symfony2 Standard Edition`_ со сторонними библиотеками (vendors)
47 | или без них.
48 |
49 | 2. Разархивируйте дистрибутив. Будет создана папка с именем Symfony. В ней
50 | будет располагаться структура нового проекта, файлы конфигурации и т.д.
51 | Переименуйте ее, как Вам больше нравится.
52 |
53 | 3. Выгрузите репозиторий Subversion, который будет хранить проект. Скажем, он
54 | будет расположен в `Google code`_ под именем ``myproject``:
55 |
56 | .. code-block:: bash
57 |
58 | $ svn checkout http://myproject.googlecode.com/svn/trunk myproject
59 |
60 | 4. Скопируйте файлы проекта Symfony2 в директорию Subversion:
61 |
62 | .. code-block:: bash
63 |
64 | $ mv Symfony/* myproject/
65 |
66 | 5. Давайте сейчас установим правила для игнорируемых файлов. Не все *должно*
67 | храниться в Вашем репозитории. Некоторые файлы (такие как кеш) будут
68 | генерироваться, другие (например файлы настройки доступа к базе данных)
69 | должны быть настроены на каждом компьютере по своему. Это делается
70 | с помощью свойства ``svn:ignore``. Таким образом мы можем указать
71 | игнорируемые файлы.
72 |
73 | .. code-block:: bash
74 |
75 | $ cd myproject/
76 | $ svn add --depth=empty app app/cache app/logs app/config web
77 |
78 | $ svn propset svn:ignore "vendor" .
79 | $ svn propset svn:ignore "bootstrap*" app/
80 | $ svn propset svn:ignore "parameters.ini" app/config/
81 | $ svn propset svn:ignore "*" app/cache/
82 | $ svn propset svn:ignore "*" app/logs/
83 |
84 | $ svn propset svn:ignore "bundles" web
85 |
86 | $ svn ci -m "commit basic symfony ignore list (vendor, app/bootstrap*, app/config/parameters.ini, app/cache/*, app/logs/*, web/bundles)"
87 |
88 | 6. Остальные файлы могут быть добавлены и отправлены в репозиторий:
89 |
90 | .. code-block:: bash
91 |
92 | $ svn add --force .
93 | $ svn ci -m "add basic Symfony Standard 2.X.Y"
94 |
95 | 7. Скопируйте ``app/config/parameters.ini`` в ``app/config/parameters.ini.dist``.
96 | Subversion игнорирует файл ``parameters.ini`` (смотрите выше), поэтому
97 | индивидуальные настройки, такие как пароль от базы данных и т.д., не будут
98 | попадать в репизиторий. Если мы создадим ``app/config/parameters.ini.dist``,
99 | новые разработчики смогут быстро выгрузить проект, скопировать файл в
100 | ``parameters.ini``, настроить его и начать работать над проектом.
101 |
102 | 8. Наконец, скачайте и установите все сторонние библиотеки:
103 |
104 | .. code-block:: bash
105 |
106 | $ php bin/vendors install
107 |
108 | .. tip::
109 |
110 | Чтобы запустить ``bin/vendors`` должен быть установлен `git`_. Этот
111 | протокол используется для выгрузки сторонних библиотек. Это означает,
112 | что ``git`` используется как инструмент, который помогает скачать
113 | библиотеки в директорию ``vendor/``.
114 |
115 | На этом этапе Вы имеете полностью функционирующий проект на Symfony2,
116 | хранящийся в репозитории Subversion. Можно начать работу над проектом и
117 | сохранять наработки непосредственно в репозитории Subversion.
118 |
119 | Вы можете продолжать изучение главы :doc:`/book/page_creation`, чтобы
120 | лучше понимать, как настраивать и разрабатывать Ваше приложение.
121 |
122 | .. tip::
123 |
124 | Symfony2 Standard Edition поставляется с дополнительными примерами. Чтобы
125 | удалить лишний код, следуйте инструкциям, которые описаны в
126 | `Standard Edition Readme`_.
127 |
128 | .. include:: _vendor_deps.rst.inc
129 |
130 | .. _svn-hosting:
131 |
132 | Решения для Subversion хостинга
133 | -------------------------------
134 |
135 | Главное отличие между `git`_ и `svn`_ в том, что Subversion для работы
136 | *необходим* централизованный репозиторий. Поэтому у Вас есть несколько
137 | решений:
138 |
139 | - Собственный хостинг: создайте свой репозиторий и организуйте доступ к нему
140 | через файловую систему или сеть. Более подробно об этом Вы можете почитать в
141 | `Version Control with Subversion`_.
142 |
143 | - Сторонние хостинги: существует множество надежных бесплатных хостинговых
144 | решений. Например, `GitHub`_, `Google code`_, `SourceForge`_ или `Gna`_.
145 | Некоторые из них также предоставляют хостинг для git репозиториев.
146 |
147 | .. _`git`: http://git-scm.com/
148 | .. _`svn`: http://subversion.apache.org/
149 | .. _`Subversion`: http://subversion.apache.org/
150 | .. _`Symfony2 Standard Edition`: http://symfony.com/download
151 | .. _`Standard Edition Readme`: https://github.com/symfony/symfony-standard/blob/master/README.md
152 | .. _`Version Control with Subversion`: http://svnbook.red-bean.com/
153 | .. _`GitHub`: http://github.com/
154 | .. _`Google code`: http://code.google.com/hosting/
155 | .. _`SourceForge`: http://sourceforge.net/
156 | .. _`Gna`: http://gna.org/
157 |
158 | .. toctree::
159 | :hidden:
160 |
161 | Translation source: 2012-02-10 [76b75713b5]
--------------------------------------------------------------------------------
/glossary.rst:
--------------------------------------------------------------------------------
1 | :orphan:
2 |
3 | Словарь терминов
4 | ================
5 |
6 | .. glossary::
7 | :sorted:
8 |
9 | Дистрибутив
10 | *Дистрибутив* (Distribution) это сборка компонентов Symfony2, набор пакетов,
11 | структура директорий проекта, конфигурация по умолчанию и
12 | опциональные настройки.
13 |
14 | Проект
15 | *Проект* (Project) - это директория некоторого Приложения, набор пакетов,
16 | сторонних библиотек, автозагрузчик и фронт-контроллер.
17 |
18 | Приложение
19 | *Приложение* (Application) - это директория, содержащая *конфигурацию* для
20 | данного набора Пакетов.
21 |
22 | Пакет
23 | *Пакет* (Bundle), это директория, содержащая набор файлов
24 | (PHP-файлы, стили, яваскрипты, изображения), который *реализует*
25 | единичную фичу (блог, форум и т.д.). В Symfony2, *как правило*,
26 | всё распложено в пакетах (см. :ref:`page-creation-bundles`).
27 |
28 | Фронт контроллер
29 | *Фронт контроллер* (Front controller) - это короткий PHP-скрипт, который располагается
30 | в web-директории вашего проекта. Как правило, *все* запросы обрабатываются
31 | этим фронт-контроллером, чьей работой является загрузка приложения
32 | Symfony.
33 |
34 | Контроллер
35 | *Контроллер* (Controller) - это PHP функция, которая содержит всю логику, необходимую
36 | для возврата объекта ``Response``, который представляет собой некоторую
37 | страницу. Как правило, маршрут связан с контроллером, который затем
38 | использует информацию из запроса для обработки данных, выполнения некоторых
39 | действий и, в конечном счёте, возврате объекта ``Response``.
40 |
41 | Служба
42 | *Служба* (также Сервис, Service) - это обобщённое наименование любого PHP
43 | объекта, который выполняет некую, специфичную только для него, задачу.
44 | Служба, как правило, используется "глобально", например, объект подключения
45 | к базе данных, или же объект для отправки email сообщений. В Symfony2
46 | службы часто конфигурируются и получаются посредством контейнера служб.
47 | О приложении, которое имеет много отдельных служб, говорят, что оно реализует
48 | сервис-ориентированную архитектуру (см. `Сервис-ориентированная архитектура`_).
49 |
50 | Контейнер служб
51 | *Контейнер служб* (Service Container), также известен как *Контейнер
52 | внедрения зависимости* (Dependency Injection Container), это особый объект,
53 | который управляет созданием экземпляров служб в приложении. Вместо того,
54 | чтобы создавать службы напрямую, разработчик *обучает* контейнер служб
55 | (при помощи конфигурации) как создавать службы. Контейнер служб позаботится
56 | о создании и внедрении зависимых служб. См. главу :doc:`/book/service_container`.
57 |
58 | Спецификация протокола HTTP
59 | *Спецификация протокола HTTP* - это набор правил, определяющий классическую
60 | схему клиент-серверного взаимодействия при помощи запросов и ответов.
61 | Эта спецификация определяет формат, используемый для запросов и ответов,
62 | а также возможные HTTP заголовки, которые они могут иметь. Дополнительную
63 | информацию вы можете поучить на страницах `Http Wikipedia`_ или же
64 | непосредственно из спецификации `HTTP 1.1 RFC`_.
65 |
66 | Окружение
67 | *Окружение* (Environment) это строка (например, ``prod`` или ``dev``), которая
68 | соответствует некоторой конфигурации приложения. Одно и то же приложение
69 | может быть выполнено на одной и той же машине с использованием различных
70 | конфигураций при помощи окружений. Это очень удобно, так как позволяет
71 | приложению иметь ``dev`` окружение, которое предназначено для отладки, и
72 | ``prod`` окружение, которое оптимизировано для получения наибольшей
73 | скорости.
74 |
75 | Вендор
76 | *Вендор* (Vendor) - это поставщик PHP библиотек и пакетов, включая сам
77 | Symfony2. Не смотря на типичный смысл этого слова в мире коммерции,
78 | вендоры в Symfony часто (даже в основном) включают в себя бесплатное
79 | программное обеспечение. Любая библиотека, которую вы добавите в ваш
80 | Symfony2 проект, должна находиться в директории ``vendor``. См.
81 | :ref:`Архитектура: использование вендоров `.
82 |
83 | Acme
84 | *Acme* - это наименование несуществующей компании, используемое в
85 | демонстрациях и документации Symfony. Оно используется в качестве пространства
86 | имён, где вы, как правило, будете использовать наименование вашей компании
87 | (например, ``Acme\BlogBundle``).
88 |
89 | Действие
90 | *Действие* (Action) - это PHP-функция или метод, которые выполняются,
91 | например, при обнаружении соответствия URI с некоторым маршрутом.
92 | Термин Действие по сути является синонимом термина *Контроллер*,
93 | за исключением того, что контроллер может также ссылаться на
94 | PHP класс, который может включать в себя несколько действий.
95 | См. главу :doc:`Контроллер `.
96 |
97 | Ресурс
98 | *Ресурс* (Asset) - это любой не исполнимый статический компонент веб-приложения,
99 | такой как CSS, JavaScript, изображение или видео. Ресурс может быть размещён
100 | непосредственно в директории ``web`` или же опубликован из Пакета (см. :term:`Пакет`)
101 | в веб-директорию при помощи консольной команды ``assets:install``.
102 |
103 | Ядро
104 | *Ядро* (Kernel) - это сердце Symfony2. Объект ядра обрабатывает HTTP запросы
105 | с использованием всех пакетов и библиотек в нём зарегистрированных. См.
106 | :ref:`Архитектура: Директория приложения ` и
107 | главу :doc:`/book/internals`.
108 |
109 | Брандмауэр
110 | В Symfony2 *Брандмауэр* (Firewall) не имеет отношения к сетевым технологиям.
111 | Вместо этого он определяет механизм аутентификации (т.е. он занимается процессом
112 | определения личности ваших пользователей) для всего приложения целиком,
113 | либо лишь для некоторой его части. См. главу :doc:`/book/security`.
114 |
115 | YAML
116 | *YAML* - это рекурсивный акроним для строки "YAML Ain't a Markup Language"
117 | (YAML не является языком разметки). Это простой, легко читаемый язык
118 | сериализации данных, широко применяемый в конфигурационных файлах Symfony2.
119 | См. главу :doc:`/reference/YAML`.
120 |
121 | .. _`Сервис-ориентированная архитектура`: http://ru.wikipedia.org/wiki/Сервис-ориентированная_архитектура
122 | .. _`HTTP Wikipedia`: http://ru.wikipedia.org/wiki/HTTP
123 | .. _`HTTP 1.1 RFC`: http://www.w3.org/Protocols/rfc2616/rfc2616.html
124 |
125 | .. toctree::
126 | :hidden:
127 |
128 | Translation source: 2011-10-11 df9104b
129 | Corrected from:
130 |
--------------------------------------------------------------------------------
/guides/cache/index.rst:
--------------------------------------------------------------------------------
1 | Кэширование
2 | =====
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | http
8 |
--------------------------------------------------------------------------------
/guides/emails.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Emails
3 |
4 | Emails
5 | ======
6 |
7 | Symfony2 использует возможности `Swiftmailer`_ для рассылки e-mail.
8 |
9 | Установка
10 | ---------
11 |
12 | Включите ``SwiftmailerBundle`` в своем ядре::
13 |
14 | public function registerBundles()
15 | {
16 | $bundles = array(
17 | // ...
18 | new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
19 | );
20 |
21 | // ...
22 | }
23 |
24 | Настройка
25 | ---------
26 |
27 | Единственным обязательным параметром является ``transport``:
28 |
29 | .. configuration-block::
30 |
31 | .. code-block:: yaml
32 |
33 | # app/config/config.yml
34 | swiftmailer.config:
35 | transport: smtp
36 | encryption: ssl
37 | auth_mode: login
38 | host: smtp.gmail.com
39 | username: your_username
40 | password: your_password
41 |
42 | .. code-block:: xml
43 |
44 |
45 |
46 |
50 |
51 |
58 |
59 | .. code-block:: php
60 |
61 | // app/config/config.php
62 | $container->loadFromExtension('swiftmailer', 'config', array(
63 | 'transport' => "smtp",
64 | 'encryption' => "ssl",
65 | 'auth_mode' => "login",
66 | 'host' => "smtp.gmail.com",
67 | 'username' => "your_username",
68 | 'password' => "your_password",
69 | ));
70 |
71 | Допустимы следующие атрибуты настройки:
72 |
73 | * ``transport`` (``smtp``, ``mail``, ``sendmail``, or ``gmail``)
74 | * ``username``
75 | * ``password``
76 | * ``host``
77 | * ``port``
78 | * ``encryption`` (``tls``, or ``ssl``)
79 | * ``auth_mode`` (``plain``, ``login``, or ``cram-md5``)
80 | * ``type``
81 | * ``delivery_strategy`` (``realtime``, ``spool``, ``single_address``, or ``none``)
82 | * ``delivery_address`` (an email address where to send ALL emails)
83 | * ``disable_delivery``
84 |
85 |
86 | Отправка e-mail
87 | ---------------
88 |
89 | Доступ к Mailer можно получить с помощью сервиса ``mailer`` из действия::
90 |
91 | public function indexAction($name)
92 | {
93 | // get the mailer first (mandatory to initialize Swift Mailer)
94 | $mailer = $this->get('mailer');
95 |
96 | $message = \Swift_Message::newInstance()
97 | ->setSubject('Hello Email')
98 | ->setFrom('send@example.com')
99 | ->setTo('recipient@example.com')
100 | ->setBody($this->renderView('HelloBundle:Hello:email', array('name' => $name)))
101 | ;
102 | $mailer->send($message);
103 |
104 | return $this->render(...);
105 | }
106 |
107 | .. note::
108 | Чтобы не усложнять картину, тело email хранится в шаблоне, рендеренном методом ``renderView()``.
109 |
110 | Использование Gmail
111 | -----------
112 |
113 | Если вы хотите использовать свой аккаунт в Gmail для рассылки писем, используйте специальный транспорт ``gmail``:
114 |
115 | .. configuration-block::
116 |
117 | .. code-block:: yaml
118 |
119 | # app/config/config.yml
120 | swiftmailer.config:
121 | transport: gmail
122 | username: your_gmail_username
123 | password: your_gmail_password
124 |
125 | .. code-block:: xml
126 |
127 |
128 |
129 |
133 |
134 |
138 |
139 | .. code-block:: php
140 |
141 | // app/config/config.php
142 | $container->loadFromExtension('swiftmailer', 'config', array(
143 | 'transport' => "gmail",
144 | 'username' => "your_gmail_username",
145 | 'password' => "your_gmail_password",
146 | ));
147 |
148 | .. _`Swiftmailer`: http://www.swiftmailer.org/
149 |
--------------------------------------------------------------------------------
/guides/forms/fields.rst:
--------------------------------------------------------------------------------
1 | Поля формы
2 | ===========
3 |
4 | Форма состоит из одного или более полей. Каждое поле является объектом, класс которого реализует :class:`Symfony\\Component\\Form\\FormFieldInterface`. Поля преобразовывают данные из нормализованного представления в человеческое.
5 |
6 | Посмотрим, к примеру, на ``DateField``. Хотя ваше приложение хранит даты как строки или объекты ``DateField``, пользователи предпочитают выбирать дату из выпадающего списка. ``DateField`` занимается за вас рендерингом и преобразованием типов.
7 |
8 | Параметры полей ядра
9 | --------------------
10 |
11 | Все встроенные поля принимают массив свойств в свой конструктор. Для удобства эти поля ядра являются подклассами :class:`Symfony\\Component\\Form\\Field`, который предопределяет несколько свойств.
12 |
13 | ``data``
14 | ~~~~~~~~
15 | При создании формы каждое поле изначально отображает значение соответствующего объекта доменного объекта формы. Если вы хотите переопределить это первоначальное значение, можете выставить его в свойстве ``data``.
16 |
17 | .. code-block:: php
18 |
19 | use Symfony\Component\Form\HiddenField
20 |
21 | $field = new HiddenField('token', array(
22 | 'data' => 'abcdef',
23 | ));
24 |
25 | assert('abcdef' === $field->getData());
26 |
27 | ..Примечание::
28 | При выставлении опций ``data`` поле не будет писать доменный объект, потому что опция ``property_path`` неявно будет нулевой. Больше информации в :ref:`form-field-property_path`.
29 |
30 | ``required``
31 | ~~~~~~~~~~~~
32 | По умолчанию каждое ``Field`` предполагает, что его значение является обязательным, поэтому должны использоваться не пустые значения. Этот параметр влияет на поведение и рендеринг некоторых полей. Например, ``ChoiceField`` включает в себя пустой выбор, если не является обязательным.
33 |
34 | .. code-block:: php
35 |
36 | use Symfony\Component\Form\ChoiceField
37 |
38 | $field = new ChoiceField('status', array(
39 | 'choices' => array('tbd' => 'To be done', 'rdy' => 'Ready'),
40 | 'required' => false,
41 | ));
42 |
43 | ``disabled``
44 | ~~~~~~~~~~~~
45 | Если вы хотите, чтобы пользователь мог изменять значение поля, можете установить опцию ``disabled`` в ``true``. Любые отправленные значения будут игнорироваться.
46 |
47 | .. code-block:: php
48 |
49 | use Symfony\Component\Form\TextField
50 |
51 | $field = new TextField('status', array(
52 | 'data' => 'Old data',
53 | 'disabled' => true,
54 | ));
55 | $field->submit('New data');
56 |
57 | assert('Old data' === $field->getData());
58 |
59 | ``trim``
60 | ~~~~~~~~
61 | Многие пользователи случайно вводят начальный или конечный пробел в поля ввода данных. Формы фреймворка автоматически удаляют такие пробелы. Если хотите сохранять их, установите опцию ``trim`` в ``false``.
62 | .. code-block:: php
63 |
64 | use Symfony\Component\Form\TextField
65 |
66 | $field = new TextField('status', array(
67 | 'trim' => false,
68 | ));
69 | $field->submit(' Data ');
70 |
71 | assert(' Data ' === $field->getData());
72 |
73 | .. _form-field-property_path:
74 |
75 |
76 | ``property_path``
77 | ~~~~~~~~~~~~~~~~~
78 | Поля по умолчанию отображают свойства значений доменного объекта формы. При отправке формы, отправляемое значение записывается обратно в объект.
79 |
80 | Если вы хотите переопределить свойство, из которого поле читает и куда впоследствии записывает, можно установить опцию ``property_path``. Ее значение по умолчанию - имя поля.
81 | .. code-block:: php
82 |
83 | use Symfony\Component\Form\Form
84 | use Symfony\Component\Form\TextField
85 |
86 | $author = new Author();
87 | $author->setFirstName('Your name...');
88 |
89 | $form = new Form('author');
90 | $form->add(new TextField('name', array(
91 | 'property_path' => 'firstName',
92 | )));
93 | $form->bind($request, $author);
94 |
95 | assert('Your name...' === $form['name']->getData());
96 |
97 | Для свойства пути классу доменного объекта необходимы:
98 | 1. Совпадающее публичное свойство или
99 | 2. Публичные setter и getter с префиксами "set"/"get", следующие за путем свойства.
100 |
101 | Пути свойства также могут ссылаться на вложенные объекты при помощи точек.
102 |
103 | .. code-block:: php
104 |
105 | use Symfony\Component\Form\Form
106 | use Symfony\Component\Form\TextField
107 |
108 | $author = new Author();
109 | $author->getEmail()->setAddress('me@example.com');
110 |
111 | $form = new Form('author');
112 | $form->add(new EmailField('email', array(
113 | 'property_path' => 'email.address',
114 | )));
115 | $form->bind($request, $author);
116 |
117 | assert('me@example.com' === $form['email']->getData());
118 |
119 | Вы можете обращаться к записям вложенных массивов или объектов, реализующих ``\Traversable``, с помощью квадратных скобок.
120 |
121 | .. code-block:: php
122 |
123 | use Symfony\Component\Form\Form
124 | use Symfony\Component\Form\TextField
125 |
126 | $author = new Author();
127 | $author->setEmails(array(0 => 'me@example.com'));
128 |
129 | $form = new Form('author');
130 | $form->add(new EmailField('email', array(
131 | 'property_path' => 'emails[0]',
132 | )));
133 | $form->bind($request, $author);
134 |
135 | assert('me@example.com' === $form['email']->getData());
136 |
137 | Если свойство пути - ``null``, поле не будет ни читать из доменного объекта, ни писать в него. Это удобно, если вы хотите иметь поля с фиксированными значениями.
138 |
139 | .. code-block:: php
140 |
141 | use Symfony\Component\Form\HiddenField
142 |
143 | $field = new HiddenField('token', array(
144 | 'data' => 'abcdef',
145 | 'property_path' => null,
146 | ));
147 |
148 | Поскольку это весьма распространенный сценарий, ``property_path`` всегда ``null``, если вы устанавливаете опцию ``data``. Так что предыдущий пример кода может быть упрощен до:
149 |
150 | .. code-block:: php
151 |
152 | use Symfony\Component\Form\HiddenField
153 |
154 | $field = new HiddenField('token', array(
155 | 'data' => 'abcdef',
156 | ));
157 |
158 | .. Примечание::
159 | Если вы хотите установить специальное значение, но тем не менее писать в доменный объект, вам придется пропустить ``property_path`` вручную.
160 |
161 | .. code-block:: php
162 |
163 | use Symfony\Component\Form\TextField
164 |
165 | $field = new TextField('name', array(
166 | 'data' => 'Custom default...',
167 | 'property_path' => 'token',
168 | ));
169 |
170 | Обычно в этом нет необходимости, поскольку лучше использовать значение по умолчанию свойства ``token`` в вашем доменном объекте.
171 |
172 | Встроенные поля
173 | ---------------
174 | Symfony2 использует следующие поля:
175 | .. toctree::
176 | :hidden:
177 |
178 | fields/index
179 |
180 | .. include:: fields/map.rst.inc
181 |
182 |
--------------------------------------------------------------------------------
/guides/forms/fields/CollectionField.rst:
--------------------------------------------------------------------------------
1 | CollectionField
2 | ===============
3 |
4 | ``CollectionField`` - особая группа полей для управления массивами или объектами, которые реализуют интерфейс ``Traversable``. Чтобы продемонстрировать это, мы расширим класс ``Customer`` до хранения трех e-mail адресов::
5 |
6 | class Customer
7 | {
8 | // other properties ...
9 |
10 | public $emails = array('', '', '');
11 | }
12 |
13 | А теперь добавим ``CollectionField`` для управления этими адресами:
14 |
15 | use Symfony\Component\Form\CollectionField;
16 |
17 | $form->add(new CollectionField('emails', array(
18 | 'prototype' => new EmailField(),
19 | )));
20 |
21 | Если установить опцию "modifiable" в ``true``, вы сможете даже добавлять или удалять строки в набор с помощью Javascript! ``CollectionField`` заметит это и соответственно изменит размер основного массива.
22 |
23 |
24 |
--------------------------------------------------------------------------------
/guides/forms/fields/RepeatedField.rst:
--------------------------------------------------------------------------------
1 | RepeatedField
2 | =============
3 |
4 | ``RepeatedField`` - обширная группа полей, которая позволяет выводить поле дважды. Повторяемое поле будет проверяться только если пользователь введет одно и то же значение в оба поля::
5 |
6 | use Symfony\Component\Form\RepeatedField;
7 |
8 | $form->add(new RepeatedField(new TextField('email')));
9 |
10 | Это весьма удобное поле для проверки e-mail адресов или паролей!
11 |
--------------------------------------------------------------------------------
/guides/forms/index.rst:
--------------------------------------------------------------------------------
1 | Symfony2 Forms
2 | ==============
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | Обзор
8 | Вид
9 |
--------------------------------------------------------------------------------
/guides/index.rst:
--------------------------------------------------------------------------------
1 | Руководства
2 | ======
3 |
4 | Погрузись в Symfony2 с актуальными руководствами:
5 |
6 | .. toctree::
7 | :hidden:
8 |
9 | templating/index
10 | doctrine/index
11 | testing/index
12 | validator/index
13 | forms/index
14 | security/index
15 | cache/index
16 | emails
17 | translation
18 | event/index
19 | tools/index
20 | bundles/index
21 | internals/index
22 | symfony1
23 | stable_api
24 |
25 | .. include:: map.rst.inc
26 |
--------------------------------------------------------------------------------
/guides/map.rst.inc:
--------------------------------------------------------------------------------
1 | * **Шаблоны**:
2 |
3 | * `Twig`_ |
4 | * :doc:`PHP ` |
5 | * :doc:`Рецепты `
6 |
7 | * **Doctrine**:
8 |
9 | * :doc:`DBAL ` |
10 | * :doc:`ORM ` |
11 | * :doc:`Migrations ` |
12 | * :doc:`MongoDB `
13 |
14 | * **Тестирование**:
15 |
16 | * :doc:`Обзор ` |
17 | * :doc:`Настройка ` |
18 | * :doc:`Crawler ` |
19 | * :doc:`Client ` |
20 | * :doc:`Рецепты `
21 |
22 | * **Валидация**:
23 |
24 | * :doc:`Обзор ` |
25 | * :doc:`Проверка ` |
26 | * :doc:`Исключения `
27 |
28 | * **Формы**:
29 |
30 | * :doc:`Обзор ` |
31 | * :doc:`Шаблоны `
32 |
33 | * **Безопасность**:
34 |
35 | * :doc:`Обзор ` |
36 | * :doc:`Пользователи ` |
37 | * :doc:`Идентификация ` |
38 | * :doc:`Авторизация ` |
39 | * :doc:`ACL ` |
40 | * :doc:`Продвинутые ACL `
41 |
42 | * **Кэширование**:
43 |
44 | * :doc:`/guides/cache/http`
45 |
46 | * :doc:`/guides/emails`
47 | * :doc:`/guides/translation`
48 | * **Диспетчер событий**:
49 |
50 | * :doc:`Обзор ` |
51 | * :doc:`Рецепты `
52 |
53 | * **Инструменты**:
54 |
55 | * :doc:`/guides/tools/autoloader` |
56 | * :doc:`Finder ` |
57 | * :doc:`/guides/tools/YAML` |
58 | * :doc:`Process `
59 |
60 | * **Бандлы**:
61 |
62 | * :doc:`Наилучшее применение ` |
63 | * :doc:`Настройка `
64 |
65 | * **Внедрение зависимости**:
66 |
67 | * :doc:`Расширения `
68 |
69 | * **Внутренности**:
70 |
71 | * :doc:`Обзор ` |
72 | * :doc:`Ядро ` |
73 | * :doc:`Профилировщик `
74 |
75 | * :doc:`Symfony2 для пользователей symfony 1`
76 | * :doc:`Symfony2 стабильный API`
77 |
78 | .. _Twig: http://www.twig-project.org/documentation
79 |
--------------------------------------------------------------------------------
/guides/security/authorization.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Security; Authorization
3 |
4 | Авторизация
5 | =============
6 |
7 | Если пользователь идентифицирован, то вы можете ограничить доступ к ресурсам
8 | приложения через правила контроля доступа. Авторизация в Symfony2 предусматривает
9 | эту потребность, а также предоставляет стандартный и мощный способ рассуждений
10 | может ли пользователь получать любой ресурс (URL, объектную модель, вызов
11 | метода и т. д.), благодаря гибкому менеджеру разрешения доступа.
12 |
13 | .. index::
14 | single: Security; Access Control
15 |
16 | Определение правил контроля доступа для ресурсов HTTP
17 | ------------------------------------------------
18 |
19 | Авторизация выполняется для каждого запроса, основываясь на правилах контроля
20 | доступа, указанных в конфигурации:
21 |
22 | .. configuration-block::
23 |
24 | .. code-block:: yaml
25 |
26 | # app/config/security.yml
27 | security.config:
28 | access_control:
29 | - { path: /admin/.*, role: ROLE_ADMIN }
30 | - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
31 |
32 | .. code-block:: xml
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 | .. code-block:: php
43 |
44 | // app/config/security.php
45 | $container->loadFromExtension('security', 'config', array(
46 | 'access_control' => array(
47 | array('path' => '/admin/.*', 'role' => 'ROLE_ADMIN'),
48 | array('path' => '/.*', 'role' => 'IS_AUTHENTICATED_ANONYMOUSLY'),
49 | ),
50 | ));
51 |
52 | Для каждого входящего запроса Symfony2 ищет совпадающее правило контроля доступа
53 | (выбирается первое совпадение) и выбрасывает
54 | :class:`Symfony\\Component\Security\\Exception\\AccessDeniedException` если
55 | пользователь не имеет необходимых ролей или
56 | :class:`Symfony\\Component\Security\\Exception\\AuthenticationCredentialsNotFoundException`
57 | если он ещё не авторизован.
58 |
59 | В примере выше мы подбирали запросы, основываясь на их пути, но есть и другие
60 | способы, о которых вы узнаете в следующем разделе.
61 |
62 | .. tip::
63 |
64 | Symfony2 automatically adds a special role based on the anonymous flag:
65 | ``IS_AUTHENTICATED_ANONYMOUSLY`` for anonymous users and
66 | ``IS_AUTHENTICATED_FULLY`` for all others.
67 |
68 | Соотвествие запросу
69 | ------------------
70 |
71 | Правила контроля доступа могут соотвествовать запросу различными способами:
72 |
73 | .. configuration-block::
74 |
75 | .. code-block:: yaml
76 |
77 | # app/config/security.yml
78 | security.config:
79 | access_control:
80 | # match the path info
81 | - { path: /admin/.*, role: ROLE_ADMIN }
82 |
83 | # match the controller class name
84 | - { controller: .*\\.*Bundle\\Admin\\.*, role: ROLE_ADMIN }
85 |
86 | # match any request attribute
87 | -
88 | attributes:
89 | - { key: _controller, pattern: .*\\.*Bundle\\Admin\\.* }
90 | role: ROLE_ADMIN
91 |
92 | .. code-block:: xml
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 | .. code-block:: php
111 |
112 | // app/config/security.php
113 | $container->loadFromExtension('security', 'config', array(
114 | 'access_control' => array(
115 | // match the path info
116 | array('path' => '/admin/.*', 'role' => 'ROLE_ADMIN'),
117 |
118 | // match the controller class name
119 | array('controller' => '.*\\.*Bundle\\Admin\\.*', 'role' => 'ROLE_ADMIN'),
120 |
121 | // match any request attribute
122 | array(
123 | 'attributes' => array(
124 | array('key' => '_controller', 'pattern' => '.*\\.*Bundle\\Admin\\.*'),
125 | ),
126 | 'role' => 'ROLE_ADMIN',
127 | ),
128 | ),
129 | ));
130 |
131 | .. index::
132 | single: Security; HTTPS
133 |
134 | Принудительный HTTP или HTTPS
135 | -----------------------
136 |
137 | Помимо ролей также можно принудить части вашего web сайта использовать HTTP или
138 | HTTPS:
139 |
140 | .. configuration-block::
141 |
142 | .. code-block:: yaml
143 |
144 | # app/config/security.yml
145 | security.config:
146 | access_control:
147 | - { path: /admin/.*, role: ROLE_ADMIN, requires_channel: https }
148 | - { path: /.*, requires_channel: http }
149 |
150 | .. code-block:: xml
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 | .. code-block:: php
161 |
162 | // app/config/security.php
163 | $container->loadFromExtension('security', 'config', array(
164 | 'access_control' => array(
165 | array('path' => '/admin/.*', 'role' => 'ROLE_ADMIN', 'requires_channel' => 'https'),
166 | array('path' => '/.*', 'requires_channel' => 'http'),
167 | ),
168 | ));
169 |
170 | Если ``requires-channel`` не указан, то Symfony2 разрешает оба HTTP и HTTPS.
171 | Но если настройка установлена на HTTP or HTTPS, то Symfony2 переадресует
172 | пользователей при необходимости.
173 |
174 | Контроль доступа в шаблонах
175 | ---------------------------
176 |
177 | Если хотите проверить роль пользователя внутри шаблона, то используйте синтаксис:
178 |
179 | .. configuration-block::
180 |
181 | .. code-block:: php
182 |
183 | vote('ROLE_ADMIN')): ?>
184 | Delete
185 |
186 |
187 | .. code-block:: jinja
188 |
189 | {% ifrole "ROLE_ADMIN" %}
190 | Delete
191 | {% endifrole %}
192 |
193 | .. note::
194 |
195 | Если вам нужен доступ к пользователю из шаблона, то вам необходимо явно
196 | передавать его.
197 |
--------------------------------------------------------------------------------
/guides/security/index.rst:
--------------------------------------------------------------------------------
1 | Безопасность
2 | ============
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | Обзор
8 | Пользователи
9 | Идентификация
10 | Авторизация
11 | acl
12 | Продвинутые ACL
13 |
--------------------------------------------------------------------------------
/guides/security/overview.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Security
3 |
4 | Безопасность
5 | ========
6 |
7 | Symfony2 поставляется со встроенным слоем безопасности. Он защищает ваше
8 | приложение, обеспечивая идентификацию и авторизацию.
9 |
10 | *Идентификация* удостоверяет что пользователь действительно тот, на кого он
11 | претендует. *Авторизация* связана с принятием решения, может или нет пользователь
12 | выполнить действие (авторизация идёт после идентификации).
13 |
14 | Этот документ является кратким обзором этих концепций, но настоящая мощь
15 | содержится в следующих трёх частях: :doc:`Пользователи `,
16 | :doc:`Идентификация ` и
17 | :doc:`Авторизация `.
18 |
19 | .. index::
20 | pair: Security; Configuration
21 |
22 | Конфигурация
23 | -------------
24 |
25 | В большинстве случаев безопасность в Symfony2 может быть легко настроена через
26 | ваш главный конфигурационный файл; вот типичная конфигурация:
27 |
28 | .. configuration-block::
29 |
30 | .. code-block:: yaml
31 |
32 | # app/config/config.yml
33 | security.config:
34 | providers:
35 | main:
36 | password_encoder: sha1
37 | users:
38 | foo: { password: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33, roles: ROLE_USER }
39 |
40 | firewalls:
41 | main:
42 | pattern: /.*
43 | http-basic: true
44 | logout: true
45 |
46 | access_control:
47 | - { path: /.*, role: ROLE_USER }
48 |
49 | .. code-block:: xml
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | .. code-block:: php
69 |
70 | // app/config/config.php
71 | $container->loadFromExtension('security', 'config', array(
72 | 'provider' => array(
73 | 'main' => array('password_encoder' => 'sha1', 'users' => array(
74 | 'foo' => array('password' => '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33', 'roles' => 'ROLE_USER'),
75 | )),
76 | ),
77 | 'firewalls' => array(
78 | 'main' => array('pattern' => '/.*', 'http-basic' => true, 'logout' => true),
79 | ),
80 | 'access_control' => array(
81 | array('path' => '/.*', 'role' => 'ROLE_USER'),
82 | ),
83 | ));
84 |
85 | Предпочтительнее вынести всю конфигурацию, касающуюся безопасности, во внешний
86 | файл. Если вы используете XML, внешний файл может использовать пространство имён
87 | безопасности как значение по умолчанию, чтобы сделать его более читабельным:
88 |
89 | .. code-block:: xml
90 |
91 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 | .. note::
114 |
115 | Все примеры документации предполагают, что вы используете внешний файл с
116 | пространством имён безопасности по умолчанию, как сказано выше.
117 |
118 | Как вы можете видеть, конфигурация состоит из трех разделов:
119 |
120 | * *provider*: Провайдер знает как создавать пользователей;
121 |
122 | * *firewall*: Фаервол определяет механизмы идентификации для приложения в целом
123 | или хотя бы его части;
124 |
125 | * *access-control*: Правила контроля доступа защищают части вашего приложения
126 | с помощью ролей.
127 |
128 | Подводя итоги рабочего процесса, фаервол идентифицирует клиента на основе
129 | представленных полномочий, пользователь создаётся провайдером, а контроль
130 | доступа уполномачивает на доступ к ресурсам.
131 |
132 | Идентификация
133 | --------------
134 |
135 | В Symfony2 есть поддержка различных механизмов идентификации прямо из корбки,
136 | а также многие могут быть легко добавлены при необходимости; главными из них
137 | являются:
138 |
139 | * HTTP Basic;
140 | * HTTP Digest;
141 | * идентификация через форму;
142 | * сертификаты X.509.
143 |
144 | Здесь показано как вы можете защитить приложение при помощи базовой HTTP
145 | идентификации:
146 |
147 | .. configuration-block::
148 |
149 | .. code-block:: yaml
150 |
151 | # app/config/security.yml
152 | security.config:
153 | firewalls:
154 | main:
155 | http-basic: true
156 |
157 | .. code-block:: xml
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 | .. code-block:: php
167 |
168 | // app/config/security.php
169 | $container->loadFromExtension('security', 'config', array(
170 | 'firewalls' => array(
171 | 'main' => array('http-basic' => true),
172 | ),
173 | ));
174 |
175 | Можно определить несколько фаерволов если вам необходимо использование различных
176 | механизмов идентификаци в различных частях приложения:
177 |
178 | .. configuration-block::
179 |
180 | .. code-block:: yaml
181 |
182 | # app/config/security.yml
183 | security.config:
184 | firewalls:
185 | backend:
186 | pattern: /admin/.*
187 | http-basic: true
188 | public:
189 | pattern: /.*
190 | security: false
191 |
192 | .. code-block:: xml
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 | .. code-block:: php
204 |
205 | // app/config/security.php
206 | $container->loadFromExtension('security', 'config', array(
207 | 'firewalls' => array(
208 | 'backend' => array('pattern' => '/admin/.*', 'http-basic' => true),
209 | 'public' => array('pattern' => '/.*', 'security' => false),
210 | ),
211 | ));
212 |
213 | .. tip::
214 |
215 | Проще всего использовать базовую HTTP идентификацию, но прочтите документ
216 | :doc:`Идентификация ` чтобы научиться
217 | настраивать другие механизмы идентификации, настраивать идентификацию без
218 | состояний, имитировать другого пользователя, навязать https и многое другое.
219 |
220 | Пользователи
221 | -----
222 |
223 | Во время идентификации, Symfony2 опрашивает провайдера пользователя для создания
224 | объекта пользователя, отвечающего клиентскому запросу (через такие полномочия
225 | как имя пользователя и пароль). Чтобы быстрее начать, вы можете определить
226 | провайдера "в памяти" прямо в конфигурации:
227 |
228 | .. configuration-block::
229 |
230 | .. code-block:: yaml
231 |
232 | # app/config/security.yml
233 | security.config:
234 | providers:
235 | main:
236 | users:
237 | foo: { password: foo }
238 |
239 | .. code-block:: xml
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 | .. code-block:: php
249 |
250 | // app/config/security.php
251 | $container->loadFromExtension('security', 'config', array(
252 | 'provider' => array(
253 | 'main' => array('users' => array(
254 | 'foo' => array('password' => 'foo'),
255 | )),
256 | ),
257 | ));
258 |
259 | Эта конфигурация устанавливает пользователя 'foo' с паролем 'foo'. После
260 | идентификации, вы можете получить доступ к идентифицированному пользователю
261 | через безопасный контекст (пользователь является экземпляром класса :class:`Symfony\\Component\\Security\\User\\User`)::
262 |
263 | $user = $container->get('security.context')->getUser();
264 |
265 | .. tip::
266 |
267 | Использование провайдера "в памяти" это отличный способ легко защитить
268 | бэкэнд вашего персонального сайта, создать прототип или приспособления для
269 | тестов. Прочитайте документ :doc:`Пользователи ` чтобы
270 | изучить как избежать паролей, которые будут в чистом виде, как использовать
271 | Doctrine Entity в качестве провайдера пользователя, как определить
272 | нескольких поставщиков и многое другое.
273 |
274 | Авторизация
275 | -------------
276 |
277 | Авторизация необязательна, но предоставляет мощный способ ограничивать доступ к
278 | ресурсам вашего приложения на основе пользовательских ролей:
279 |
280 | .. configuration-block::
281 |
282 | .. code-block:: yaml
283 |
284 | # app/config/security.yml
285 | security.config:
286 | providers:
287 | main:
288 | users:
289 | foo: { password: foo, roles: ['ROLE_USER', 'ROLE_ADMIN'] }
290 | access_control:
291 | - { path: /.*, role: ROLE_USER }
292 |
293 | .. code-block:: xml
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 | .. code-block:: php
307 |
308 | // app/config/security.php
309 | $container->loadFromExtension('security', 'config', array(
310 | 'provider' => array(
311 | 'main' => array('users' => array(
312 | 'foo' => array('password' => 'foo', 'roles' => array('ROLE_USER', 'ROLE_ADMIN')),
313 | )),
314 | ),
315 |
316 | 'access_control' => array(
317 | array('path' => '/.*', 'role' => 'ROLE_USER'),
318 | ),
319 | ));
320 |
321 | Эта конфигурация устанавливает пользователя 'foo' с ролями 'ROLE_USER' и
322 | 'ROLE_ADMIN' и ограничивает доступ ко всему приложению для пользователей,
323 | имеющих роль 'ROLE_USER'.
324 |
325 | .. tip::
326 |
327 | Прочитайте документ :doc:`Авторизация ` чтобы
328 | узнать как устанавливать иерархию роли, как настроить шаблон, основываясь на
329 | ролях, как определить правила контроля доступа, основываясь на атрибутах
330 | запроса и многое другое.
331 |
--------------------------------------------------------------------------------
/guides/stable_api.rst:
--------------------------------------------------------------------------------
1 | Стабильный API для Symfony2
2 | =======================
3 |
4 | Стабильный API это набор всех public методов Symfony2 (компонентов и бандлов
5 | ядра), которые соотвествуют следующим критериям:
6 |
7 | * пространство имён и имя класса не изменятся;
8 | * названия метода не изменится;
9 | * сигнатура (аргументы и возвращаемое значение) метода не изменится;
10 | * семантика того, что делает метод не изменится.
11 |
12 | Хотя реализация может изменится. Единственный обоснованный случай для
13 | изменения в стабильном API это исправление проблемы безопасности.
14 |
15 | .. note::
16 |
17 | Стабильное API основано на белом списке. Таким образом, всё что
18 | не перечислено в этом документе не является частью стабильного API.
19 |
20 | .. note::
21 |
22 | Список находится в стадии разработки, окончательный вариант опубликуют когда
23 | будет выпущена финальная Symfony2. В то же время, если вы считаете что
24 | некоторые методы заслуживают того чтобы быть в нём, пожалуйста, начните
25 | обсуждение в Symfony developer mailing-list.
26 |
27 | .. tip::
28 |
29 | Любой метод из стабильного API отмечен как таковой на сайте Symfony2 API
30 | (имеет примечание ``@stable``).
31 |
32 | .. tip::
33 |
34 | Любой сторонний бандл должен публиковать свой стабильный API.
35 |
36 | Компонент HttpKernel
37 | --------------------
38 |
39 | * HttpKernelInterface:::method:`Symfony\\Components\\HttpKernel\\HttpKernelInterface::handle`
40 |
--------------------------------------------------------------------------------
/guides/symfony1.rst:
--------------------------------------------------------------------------------
1 | Symfony2 для пользователей symfony 1
2 | ============================
3 |
4 | Приложения
5 | ------------
6 |
7 | В проекте symfony 1 распространено иметь несколько приложений: например, одно для
8 | фронтэнда и одно для бэкэнда.
9 |
10 | В проекте Symfony2 вам надо создать только одно прилоежение (приложение для
11 | блога, интернет приложение и т. д.). В большинстве случаев, если вам необходимо
12 | создать второе приложение, то лучше будет создать другой проект и разделить
13 | некоторые бандлы между ними.
14 |
15 | Если вам надо разделить фронтэнд и бэкэнд функции некоторых бандлов, создайте
16 | подпространства имён для контроллеров, подпапки для шаблонов, различные
17 | семантические настройки, разделите настройки маршрутизации и т. д.
18 |
19 | .. tip::
20 |
21 | Прочтите определения :term:`Project` и :term:`Application`, а также
22 | :term:`Bundle` в словаре.
--------------------------------------------------------------------------------
/guides/templating/index.rst:
--------------------------------------------------------------------------------
1 | Шаблоны
2 | ==========
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | PHP
8 | Рецепты
9 |
10 |
--------------------------------------------------------------------------------
/guides/templating/recipes.rst:
--------------------------------------------------------------------------------
1 | Рецепты шаблонов
2 | ================
3 |
4 | .. _twig_extension_tag:
5 |
6 | Включение пользовательских расширений Twig
7 | -------------------------------
8 |
9 | Чтобы включить расширение Twig добавьте его как постоянную службу в одну из
10 | ваших конфигураций и привяжите через тег ``twig.extension``:
11 |
12 | .. configuration-block::
13 |
14 | .. code-block:: yaml
15 |
16 | services:
17 | twig.extension.your_extension_name:
18 | class: Fully\Qualified\Extension\Class\Name
19 | tags:
20 | - { name: twig.extension }
21 |
22 | .. code-block:: xml
23 |
24 |
25 |
26 |
27 |
28 | .. code-block:: php
29 |
30 | $container
31 | ->register('twig.extension.your_extension_name', 'Fully\Qualified\Extension\Class\Name')
32 | ->addTag('twig.extension')
33 | ;
34 |
35 | .. _templating_renderer_tag:
36 |
37 | Включение пользовательских визуализаторов шаблона
38 | ----------------------------------
39 |
40 | Чтобы включить пользовательский визуализатор шаблона добавьте его как постоянную
41 | службу в одну из ваших конфигураций и привяжите через тег ``templating.renderer``
42 | и установите атрибут ``alias`` (визуализатор будет известен через алиас в имени
43 | шаблона):
44 |
45 | .. configuration-block::
46 |
47 | .. code-block:: yaml
48 |
49 | services:
50 | templating.renderer.your_renderer_name:
51 | class: Fully\Qualified\Renderer\Class\Name
52 | tags:
53 | - { name: templating.renderer, alias: alias_name }
54 |
55 | .. code-block:: xml
56 |
57 |
58 |
59 |
60 |
61 | .. code-block:: php
62 |
63 | $container
64 | ->register('templating.renderer.your_renderer_name', 'Fully\Qualified\Renderer\Class\Name')
65 | ->addTag('templating.renderer', array('alias' => 'alias_name'))
66 | ;
67 |
68 | .. _templating_helper_tag:
69 |
70 | Включение пользовательских хелперов для шаблонов PHP
71 | ------------------------------------
72 |
73 | ЧТобы включить пользовательский хелпер для шаблона добавьте его как постоянную
74 | службу в одну из ваших конфигураций и привяжите через тег ``templating.helper``
75 | и установите атрибут ``alias`` (хелпер будет доступен через него в шаблонах):
76 |
77 | .. configuration-block::
78 |
79 | .. code-block:: yaml
80 |
81 | services:
82 | templating.helper.your_helper_name:
83 | class: Fully\Qualified\Helper\Class\Name
84 | tags:
85 | - { name: templating.helper, alias: alias_name }
86 |
87 | .. code-block:: xml
88 |
89 |
90 |
91 |
92 |
93 | .. code-block:: php
94 |
95 | $container
96 | ->register('templating.helper.your_helper_name', 'Fully\Qualified\Helper\Class\Name')
97 | ->addTag('templating.helper', array('alias' => 'alias_name'))
98 | ;
99 |
--------------------------------------------------------------------------------
/images/book/doctrine_image_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/doctrine_image_1.png
--------------------------------------------------------------------------------
/images/book/doctrine_image_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/doctrine_image_2.png
--------------------------------------------------------------------------------
/images/book/doctrine_image_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/doctrine_image_3.png
--------------------------------------------------------------------------------
/images/book/doctrine_web_debug_toolbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/doctrine_web_debug_toolbar.png
--------------------------------------------------------------------------------
/images/book/form-simple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/form-simple.png
--------------------------------------------------------------------------------
/images/book/form-simple2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/form-simple2.png
--------------------------------------------------------------------------------
/images/book/security_admin_role_access.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/security_admin_role_access.png
--------------------------------------------------------------------------------
/images/book/security_anonymous_user_access.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/security_anonymous_user_access.png
--------------------------------------------------------------------------------
/images/book/security_anonymous_user_denied_authorization.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/security_anonymous_user_denied_authorization.png
--------------------------------------------------------------------------------
/images/book/security_authentication_authorization.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/security_authentication_authorization.png
--------------------------------------------------------------------------------
/images/book/security_full_step_authorization.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/security_full_step_authorization.png
--------------------------------------------------------------------------------
/images/book/security_ryan_no_role_admin_access.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/book/security_ryan_no_role_admin_access.png
--------------------------------------------------------------------------------
/images/docs-pull-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/docs-pull-request.png
--------------------------------------------------------------------------------
/images/http-xkcd-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/http-xkcd-request.png
--------------------------------------------------------------------------------
/images/http-xkcd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/http-xkcd.png
--------------------------------------------------------------------------------
/images/quick_tour/hello_fabien.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/quick_tour/hello_fabien.png
--------------------------------------------------------------------------------
/images/quick_tour/profiler.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/quick_tour/profiler.png
--------------------------------------------------------------------------------
/images/quick_tour/web_debug_toolbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/quick_tour/web_debug_toolbar.png
--------------------------------------------------------------------------------
/images/quick_tour/welcome.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/quick_tour/welcome.jpg
--------------------------------------------------------------------------------
/images/request-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avalanche123/symfony-docs-ru/26ec65622e109340d168de47abb05b70f18f2008/images/request-flow.png
--------------------------------------------------------------------------------
/index.rst:
--------------------------------------------------------------------------------
1 | Документация Symfony2
2 | =====================
3 |
4 | Краткий Обзор
5 | -------------
6 |
7 | Быстрый старт с Symfony2 :doc:`Краткий Обзор `:
8 |
9 | .. toctree::
10 | :hidden:
11 |
12 | quick_tour/index
13 |
14 | * :doc:`quick_tour/the_big_picture` >
15 | * :doc:`quick_tour/the_view` >
16 | * :doc:`quick_tour/the_controller` >
17 | * :doc:`quick_tour/the_architecture`
18 |
19 | Руководства
20 | -----------
21 |
22 | Погрузитесь в мир Symfony2 с помощью актуальных руководств:
23 |
24 | .. toctree::
25 | :hidden:
26 |
27 | book/index
28 |
29 | .. include:: /book/map.rst.inc
30 |
31 | Рецепты
32 | -------
33 |
34 | .. toctree::
35 | :hidden:
36 |
37 | cookbook/index
38 |
39 | Прочитайте :doc:`Рецепты `.
40 |
41 | Справочные документы
42 | --------------------
43 |
44 | С ними вы быстро получите ответы:
45 |
46 | .. toctree::
47 | :hidden:
48 |
49 | reference/index
50 |
51 | .. include:: /reference/map.rst.inc
52 |
53 | Пакеты
54 | -------
55 |
56 | Symfony Standard Edition поставляется с несколькими пакетами. Узнайте о них больше:
57 |
58 | .. toctree::
59 | :hidden:
60 |
61 | bundles/index
62 |
63 | .. include:: /bundles/map.rst.inc
64 |
65 | Участие в проекте
66 | -----------------
67 |
68 | Примите участие в развитии Symfony2:
69 |
70 | .. toctree::
71 | :hidden:
72 |
73 | contributing/index
74 |
75 | .. include:: /contributing/map.rst.inc
76 |
--------------------------------------------------------------------------------
/quick_tour/index.rst:
--------------------------------------------------------------------------------
1 | Краткий тур
2 | ==========
3 |
4 | Быстрый старт с кратким туром по Symfony2:
5 |
6 | .. toctree::
7 | :maxdepth: 2
8 | :glob:
9 | :numbered:
10 |
11 | Общая картина
12 | Вид
13 | Контроллер
14 | Архитектура
15 |
--------------------------------------------------------------------------------
/quick_tour/the_big_picture.rst:
--------------------------------------------------------------------------------
1 | Общая картина
2 | =============
3 |
4 | Итак вы хотите попробовать Symfony2, но в наличии у вас не более 10 минут?
5 | Первая часть этого учебника написана для вас. Она объяснит как быстро начать
6 | с Symfony2, показав структуру простого готового проекта.
7 |
8 | Если вы когда-нибудь использовали какой-либо веб-фреймворк прежде, вы будете
9 | чувствовать себя в Symfony2 как дома.
10 |
11 | .. index::
12 | pair: Sandbox; Download
13 |
14 | Загрузка и установка
15 | --------------------
16 |
17 | В первую очередь, убедитесь что у вас установлен как минимум PHP 5.3.2 и он
18 | настроен для работы с web сервером, таким как Apache.
19 |
20 | Готовы? Давайте начнем с загрузки Symfony2. Для быстрого старта мы будем
21 | использовать "Symfony2 песочницу". Это Symfony2, который содержит все
22 | необходимые библиотеки и несколько простых контроллеров; также в неё включена
23 | базовая конфигурация. Наибольшее преимущество песочницы перед другими типами
24 | инсталляции в том, что вы можете сразу же начать экспериментировать с Symfony2.
25 |
26 | Загрузите песочницу (`sandbox`_), и распакуйте её в корневую директорию web
27 | сервера. Сейчас у вас должна быть папка ``sandbox/``::
28 |
29 | www/ <- ваша корневая web директория
30 | sandbox/ <- распакованный архив
31 | app/
32 | cache/
33 | config/
34 | logs/
35 | src/
36 | Application/
37 | HelloBundle/
38 | Controller/
39 | Resources/
40 | vendor/
41 | symfony/
42 | web/
43 |
44 | .. index::
45 | single: Installation; Check
46 |
47 | Проверка конфигурации
48 | ---------------------
49 |
50 | Для того чтобы избежать головной боли в будущем, проверьте, сможет ли ваша
51 | система запустить Symfony2 без проблем – для этого откройте следующий URL:
52 |
53 | http://localhost/sandbox/web/check.php
54 |
55 | Внимательно прочитайте вывод скрипта и исправьте все проблемы, которые он найдет.
56 |
57 | Теперь запросите вашу первую "реальную" страничку на Symfony2:
58 |
59 | http://localhost/sandbox/web/app_dev.php/
60 |
61 | Symfony2 должен поблагодарить вас за приложенные усилия!
62 |
63 | Создаём первое приложение
64 | ----------------------
65 |
66 | Песочница поставляется с простым Hello World ":term:`application`".
67 | Мы будем использовать его чтобы узнать больше о Symfony2. Проследуйте по этому
68 | URL чтобы Symfony2 вас поприветствовал (замените Fabien на своё имя):
69 |
70 | http://localhost/sandbox/web/app_dev.php/hello/Fabien
71 |
72 | Что происходит в этом месте? Давайте разберём URL:
73 |
74 | .. index:: Front Controller
75 |
76 | * ``app_dev.php``: Это "front controller". Уникальная точка входа для приложения,
77 | которая отвечает на все запросы пользователя;
78 |
79 | * ``/hello/Fabien``: Это "виртуальный" путь ресурса, к которому пользователь
80 | хочет получить доступ.
81 |
82 | От вас как от разработчика требуется написать код, который сопоставит
83 | пользовательский запрос (``/hello/Fabien``) и ассоциированный с ним ресурс
84 | (``HelloFabien!``).
85 |
86 | .. index::
87 | single: Configuration
88 |
89 | Конфигурация
90 | ~~~~~~~~~~~~
91 |
92 | Но как Symfony2 связывает запрос с вашим кодом? Просто прочитав некоторый файл
93 | конфигурации.
94 |
95 | Все конфигурационные файлы Symfony2 могут быть написаны на PHP, XML, или `YAML`_
96 | (YAML это простой формат, который очень упрощает описание конфигурационных настроек).
97 |
98 | .. tip::
99 |
100 | Песочница настроена на YAML, но вы легко сможете переключиться на XML или PHP
101 | изменив файл ``app/AppKernel.php``. You can switch now by looking at
102 | the bottom of this file for instructions (the tutorials show the
103 | configuration for all supported formats).
104 |
105 | .. index::
106 | single: Routing
107 | pair: Configuration; Routing
108 |
109 | Маршрутизация
110 | ~~~~~~~~~~~~~
111 |
112 | Symfony2 проводит маршрутизацию запроса, анализируя файл конфигурации маршрутов:
113 |
114 | .. configuration-block::
115 |
116 | .. code-block:: yaml
117 |
118 | # app/config/routing.yml
119 | homepage:
120 | pattern: /
121 | defaults: { _controller: FrameworkBundle:Default:index }
122 |
123 | hello:
124 | resource: HelloBundle/Resources/config/routing.yml
125 |
126 | .. code-block:: xml
127 |
128 |
129 |
130 |
131 |
134 |
135 |
136 | FrameworkBundle:Default:index
137 |
138 |
139 |
140 |
141 |
142 | .. code-block:: php
143 |
144 | // app/config/routing.php
145 | use Symfony\Component\Routing\RouteCollection;
146 | use Symfony\Component\Routing\Route;
147 |
148 | $collection = new RouteCollection();
149 | $collection->add('homepage', new Route('/', array(
150 | '_controller' => 'FrameworkBundle:Default:index',
151 | )));
152 | $collection->addCollection($loader->import("HelloBundle/Resources/config/routing.php"));
153 |
154 | return $collection;
155 | Первые несколько строк файла настроек маршрутизации определяют, какой код вызвать
156 | когда пользователь запросит ресурс "``/``". Более интересна концовка, которая
157 | внедряет следующий файл настроек маршрутизации, который состоит из:
158 |
159 | .. configuration-block::
160 |
161 | .. code-block:: yaml
162 |
163 | # src/Application/HelloBundle/Resources/config/routing.yml
164 | hello:
165 | pattern: /hello/{name}
166 | defaults: { _controller: HelloBundle:Hello:index }
167 |
168 | .. code-block:: xml
169 |
170 |
171 |
172 |
173 |
176 |
177 |
178 | HelloBundle:Hello:index
179 |
180 |
181 |
182 | .. code-block:: php
183 |
184 | // src/Application/HelloBundle/Resources/config/routing.php
185 | use Symfony\Component\Routing\RouteCollection;
186 | use Symfony\Component\Routing\Route;
187 |
188 | $collection = new RouteCollection();
189 | $collection->add('hello', new Route('/hello/{name}', array(
190 | '_controller' => 'HelloBundle:Hello:index',
191 | )));
192 |
193 | return $collection;
194 |
195 | Ну, вот! Теперь вы видите, паттерн ресурса "``/hello/{name}``" (строка,
196 | обернутая фигурными скобками ``{name}``, называется заполнитель) сопоставляется с
197 | контроллером, заданным через значение ``_controller``.
198 |
199 | .. index::
200 | single: Controller
201 | single: MVC; Controller
202 |
203 | Контроллеры
204 | ~~~~~~~~~~~
205 |
206 | Контроллер отвественен за возвращение представления ресурса (зачастую это HTML)
207 | и определён как PHP класс:
208 |
209 | .. code-block:: php
210 | :linenos:
211 |
212 | // src/Application/HelloBundle/Controller/HelloController.php
213 |
214 | namespace Application\HelloBundle\Controller;
215 |
216 | use Symfony\Bundle\FrameworkBundle\Controller\Controller;
217 |
218 | class HelloController extends Controller
219 | {
220 | public function indexAction($name)
221 | {
222 | return $this->render('HelloBundle:Hello:index.twig.html', array('name' => $name));
223 |
224 | // render a PHP template instead
225 | // return $this->render('HelloBundle:Hello:index.php.html', array('name' => $name));
226 | }
227 | }
228 |
229 | Код довольно простой, но давайте разберём его по строкам:
230 |
231 | * *строка 3*: Symfony2 использует преимущства новых возможностей PHP 5.3 и
232 | потому все контроллеры находятся в пространствах имён (пространство имён это
233 | первая часть значения переменной для маршрутизации ``_controller``: ``HelloBundle``).
234 |
235 | * *строка 7*: Имя контроллера состоит из второй части значения переменной для
236 | маршрутизации ``_controller`` (``Hello``) и слова ``Controller``. Он
237 | расширяет встроенный класс ``Controller``, который обеспечивает полезные
238 | сокращения (их мы увидим позже в этом руководстве).
239 |
240 | * *строка 9*: Каждый контроллер состоит из нескольких действий. Согласно
241 | конфигурации, страница hello обрабатывается действием ``index`` (третья часть
242 | значения переменной для маршрутизации ``_controller``). Этот метод получает
243 | через аргументы значения заполнителя для данного ресурса (``$name`` в нашем случае).
244 |
245 | * *строка 11*: Метод ``render()`` загружает и заполняет шаблон
246 | (``HelloBundle:Hello:index.twig.html``) переменными, переданными вторым аргументом.
247 |
248 | Но что такое :term:`bundle`? Весь код, написанный в Symfony2 упорядочен
249 | через бандлы. На языке Symfony2 бандл это структурированный набор файлов
250 | (файлы PHP, таблицы стилей, JavaScripts, изображения, ...), который
251 | реализует одну функцию (блог, форум, ...) и который с лёгкостью может быть
252 | распространён среди других разработчиков. В нашем примере только один бандл ``HelloBundle``.
253 |
254 | Шаблоны
255 | ~~~~~~~
256 |
257 | Итак, контроллер заполняет шаблон ``HelloBundle:Hello:index.twig.html``. Но что оно
258 | значит? ``HelloBundle`` это имя бандла, ``Hello`` это контроллер, а ``index.twig.html``
259 | это имя шаблона. Изначально песочница использует движок шаблонов Twig:
260 |
261 | .. code-block:: jinja
262 |
263 | {# src/Application/HelloBundle/Resources/views/Hello/index.twig.html #}
264 | {% extends "HelloBundle::layout.twig.html" %}
265 |
266 | {% block content %}
267 | Hello {{ name }}!
268 | {% endblock %}
269 |
270 | Поздравляем! Вы увидели первый кусочек кода для Symfony2. Это не было трудно,
271 | не так ли? Symfony2 позволяет внедрять сайты удобно и быстро.
272 |
273 | .. index::
274 | single: Environment
275 | single: Configuration; Environment
276 |
277 | Работаем с Окружениями (Environments)
278 | -------------------------
279 |
280 | Теперь, когда вы лучше разбираетесь в работе Symfony2, давайте взглянем на
281 | нижнюю часть страницы; вы увидите небольшую полоску со значками Symfony2 и PHP.
282 | Она называется "Web панель отладки" ("Web Debug Toolbar") - лучший друг
283 | разработчика. Конечно, такой инструмент не должен отображаться, когда вы начнёте
284 | разворачивать приложение на производственном сервере. Для этого обратите
285 | внимание на другой контроллер в папке ``web/`` (``app.php``), оптимизированный
286 | для производственного окружения:
287 |
288 | http://localhost/sandbox/web/app.php/hello/Fabien
289 |
290 | Если вы используете Apache с включённым ``mod_rewrite``, вы можете отказаться от
291 | использования ``app.php`` части в URL:
292 |
293 | http://localhost/sandbox/web/hello/Fabien
294 |
295 | И это ещё не всё, на производственном сервере, вам следует сделать корневой web
296 | директорией папку ``web/`` чтобы обезопасить установку и получить даже более
297 | красивый URL:
298 |
299 | http://localhost/hello/Fabien
300 |
301 | Чтобы сделать производственное окружение быстрым насколько это возможно,
302 | Symfony2 делает кэш в папке ``app/cache/``. Когда вы вносите изменения в код или
303 | конфигурацию, вам необходимо вручную удалить кэш файлы. Вот почему лучше
304 | использовать фронт контроллер для разработки (``app_dev.php``) когда работаете
305 | над проектом.
306 |
307 | Заключительное слово
308 | --------------
309 |
310 | 10 минут истекли. Теперь вы должны быть способны создать свои простые маршруты,
311 | контроллеры и шаблоны. Для закрепления материала, попробуйте создать что-либо
312 | более полезное чем приложение Hello! Но если вы стремитесь узнать больше о
313 | Symfony2, прочтите следующую часть руководства прямо сейчас, в котором мы глубже
314 | затронем систему шаблонов.
315 |
316 | .. _sandbox: http://symfony-reloaded.org/code#sandbox
317 | .. _YAML: http://www.yaml.org/
318 |
--------------------------------------------------------------------------------
/quick_tour/the_controller.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Controller
3 | single: MVC; Controller
4 |
5 | Контроллер
6 | ==========
7 |
8 | Всё ещё с нами после первых двух частей? Вы становитесь ярым приверженцем Symfony2!
9 | Давайте, без лишней суеты, узнаем что контроллеры могут сделать для вас.
10 |
11 | .. index::
12 | single: Formats
13 | single: Controller; Formats
14 | single: Routing; Formats
15 | single: View; Formats
16 |
17 | Использование форматов
18 | -------------
19 |
20 | В наши дни, web приложение должно уметь выдавать не только HTML страницы.
21 | Начиная с XML для RSS каналов и Web служб, заканчивая JSON для Ajax запросов,
22 | существует множество различных форматов. Поддержка этих форматов в Symfony2
23 | проста. Измените ``routing.yml``, добавив ``_format`` со значением ``xml``:
24 |
25 | .. configuration-block::
26 |
27 | .. code-block:: yaml
28 |
29 | # src/Application/HelloBundle/Resources/config/routing.yml
30 | hello:
31 | pattern: /hello/{name}
32 | defaults: { _controller: HelloBundle:Hello:index, _format: xml }
33 |
34 | .. code-block:: xml
35 |
36 |
37 |
38 | HelloBundle:Hello:index
39 | xml
40 |
41 |
42 | .. code-block:: php
43 |
44 | // src/Application/HelloBundle/Resources/config/routing.php
45 | $collection->add('hello', new Route('/hello/{name}', array(
46 | '_controller' => 'HelloBundle:Hello:index',
47 | '_format' => 'xml',
48 | )));
49 |
50 | Затем, наряду с ``index.twig.html`` добавьте шаблон ``index.twig.xml``:
51 |
52 | .. code-block:: xml+php
53 |
54 |
55 |
56 | {{ name }}
57 |
58 |
59 |
60 | И наконец, т.к. шаблон должен быть выбран в соответствии с форматом, внесите
61 | следующие изменения в контроллер:
62 |
63 | .. code-block:: php
64 |
65 | // src/Application/HelloBundle/Controller/HelloController.php
66 | public function indexAction($name, $_format)
67 | {
68 | return $this->render(
69 | 'HelloBundle:Hello:index.twig.'.$_format,
70 | array('name' => $name)
71 | );
72 | }
73 |
74 | Вот и всё что для этого нужно. Нет нужды изменять контроллер. Для стандартных
75 | форматов Symfony2 автоматически подбирает заголовок ``Content-Type`` для ответа.
76 | Если хотите поддержку форматов лишь для одного действия, тогда используйте
77 | заполнитель ``{_format}`` в паттерне:
78 |
79 | .. configuration-block::
80 |
81 | .. code-block:: yaml
82 |
83 | # src/Application/HelloBundle/Resources/config/routing.yml
84 | hello:
85 | pattern: /hello/{name}.{_format}
86 | defaults: { _controller: HelloBundle:Hello:index, _format: html }
87 | requirements: { _format: (html|xml|json) }
88 |
89 | .. code-block:: xml
90 |
91 |
92 |
93 | HelloBundle:Hello:index
94 | html
95 | (html|xml|json)
96 |
97 |
98 | .. code-block:: php
99 |
100 | // src/Application/HelloBundle/Resources/config/routing.php
101 | $collection->add('hello', new Route('/hello/{name}.{_format}', array(
102 | '_controller' => 'HelloBundle:Hello:index',
103 | '_format' => 'html',
104 | ), array(
105 | '_format' => '(html|xml|json)',
106 | )));
107 |
108 | Таким образом контроллер будет вызыван для следующих URL:: ``/hello/Fabien.xml``
109 | или ``/hello/Fabien.json``
110 |
111 | Запись ``requirements`` устанавилвает регулярные выражения, которым должны
112 | соотвествовать заполнители. Если в этом примере запросить ресурс ``/hello/Fabien.js``
113 | вы получите ошибку 404 HTTP, потому что он не удовлетворяет тербованию для ``_format``.
114 |
115 | .. index::
116 | single: Response
117 |
118 | Объект Response
119 | -------------------
120 |
121 | Теперь, давайте вернёмся к контроллеру ``Hello``::
122 |
123 | // src/Application/HelloBundle/Controller/HelloController.php
124 |
125 | public function indexAction($name)
126 | {
127 | return $this->render('HelloBundle:Hello:index.twig.html', array('name' => $name));
128 | }
129 |
130 | Метод ``render()`` заполняет шаблон и возвращает объект ``Response``. Ответ может
131 | быть оптимизирован, перед тем как отправится в браузер, допустим, чтобы изменить
132 | ``Content-Type``::
133 |
134 | public function indexAction($name)
135 | {
136 | $response = $this->render('HelloBundle:Hello:index.twig.html', array('name' => $name));
137 | $response->headers->set('Content-Type', 'text/plain');
138 |
139 | return $response;
140 | }
141 |
142 | Для простейших шаблонов, вы даже можете создать объект ``Response`` вручную и
143 | сэкономить этим несколько миллисекунд::
144 |
145 | public function indexAction($name)
146 | {
147 | return new Response('Hello '.$name);
148 | }
149 |
150 | Это действительно полезно, когда контроллер должен отправить JSON ответ на Ajax
151 | запрос.
152 |
153 | .. index::
154 | single: Exceptions
155 |
156 | Управление ошибками
157 | -------------------
158 |
159 | Когда что-нибудь не найдено, вы должны вести честную игру с протоколом HTTP и
160 | вернуть ответ 404. Это легко сделать выдав встроенное исключение для HTTP::
161 |
162 | use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
163 |
164 | public function indexAction()
165 | {
166 | $product = // retrieve the object from database
167 | if (!$product) {
168 | throw new NotFoundHttpException('The product does not exist.');
169 | }
170 |
171 | return $this->render(...);
172 | }
173 |
174 | ``NotFoundHttpException`` вернёт в браузер ответ 404 HTTP.
175 |
176 | .. index::
177 | single: Controller; Redirect
178 | single: Controller; Forward
179 |
180 | Перемещения и перенаправления
181 | -----------------------------
182 |
183 | Если вы хотите переместить пользователя на другую страницу, используйте метод
184 | ``redirect()``::
185 |
186 | return $this->redirect($this->generateUrl('hello', array('name' => 'Lucas')));
187 |
188 | ``generateUrl()`` такой же метод как и ``generate()``, который мы применяли ранее в
189 | хелпере ``router``. Он получает имя маршрута и массив параметров как аргументы
190 | и возвращает ассоциированный дружественный URL.
191 |
192 | Также вы можете легко переместить одно действие на другое с помощью метода
193 | ``forward()``. Как и для хелпера ``actions``, он применяет внутренний подзапрос,
194 | но возвращает объект ``Response``, что позволяет в дальнейшем его изменить::
195 |
196 | $response = $this->forward('HelloBundle:Hello:fancy', array('name' => $name, 'color' => 'green'));
197 |
198 | // do something with the response or return it directly
199 |
200 | .. index::
201 | single: Request
202 |
203 | Объект Request
204 | ------------------
205 |
206 | Помимо значений заполнителей для маршрутизации, контроллер имеет доступ к
207 | объекту ``Request``::
208 |
209 | $request = $this->get('request');
210 |
211 | $request->isXmlHttpRequest(); // is it an Ajax request?
212 |
213 | $request->getPreferredLanguage(array('en', 'fr'));
214 |
215 | $request->query->get('page'); // get a $_GET parameter
216 |
217 | $request->request->get('page'); // get a $_POST parameter
218 |
219 | В шаблоне получить доступ к объекту ``Request`` можно через хелпер ``app.request``::
220 |
221 | .. code-block:: html+php
222 |
223 | {{ app.request.query.get('page') }}
224 |
225 | {{ app.request.parameter('page') }}
226 |
227 | Сессия
228 | -----------
229 |
230 | Протокол HTTP не имеет состояний, но Symfony2 предоставляет удобный объект
231 | сиссии, который представляет клиента (будь он человеком, использующим браузер,
232 | ботом или web службой). Между двумя запросами Symfony2 хранит атрибуты в cookie,
233 | используя родные сессии из PHP.
234 |
235 | Сохранение и получение информации из сессии легко выполняется из любого
236 | контроллера::
237 |
238 | $session = $this->get('request')->getSession();
239 |
240 | // store an attribute for reuse during a later user request
241 | $session->set('foo', 'bar');
242 |
243 | // in another controller for another request
244 | $foo = $session->get('foo');
245 |
246 | // set the user locale
247 | $session->setLocale('fr');
248 |
249 | Также можно хранить небольшие сообщения, которые будут доступны для следующего
250 | запроса::
251 |
252 | // store a message for the very next request (in a controller)
253 | $session->setFlash('notice', 'Congratulations, your action succeeded!');
254 |
255 | // display the message back in the next request (in a template)
256 | {{ app.session.flash('notice') }}
257 |
258 | Заключительное слово
259 | --------------------
260 |
261 | Вот и всё что хотелось рассказать, и я даже уверен, что мы не использовали все
262 | отведённые 10 минут. Мы коротко рассмотрели бандлы в первой части, и все
263 | особенности о которых мы узнали являются частью бандлов ядра фреймворка.
264 | Но благодаря бандлам, в Symfony2 всё может быть
265 | расширено или заменено. Это и есть тема следующей части руководства.
266 |
--------------------------------------------------------------------------------
/quick_tour/the_view.rst:
--------------------------------------------------------------------------------
1 | Вид
2 | ========
3 |
4 | Прочитав первую часть, вы решили что Symfony2 заслуживает ещё 10 минут. Хорошо.
5 | Во второй части вы узнаете больше о движке шаблонов `Twig`_ в Symfony2. Twig
6 | это гибкий, быстрый и безопасный шаблонизатор для PHP. Он делает шаблоны
7 | удобочитаемыми и выразительными, а также более дружественными для web дизайнеров.
8 |
9 | .. note::
10 |
11 | Вместо Twig, можете использовать для шаблонов :doc:`PHP `.
12 | Оба шаблонных движка поддерживаются Symfony2 и имееют одинаковую степень
13 | поддержки.
14 |
15 | .. index::
16 | single: Twig
17 | single: View; Twig
18 |
19 | Twig, краткий обзор
20 | ----------------------
21 |
22 | .. tip::
23 |
24 | Если хотите изучить Twig, мы настоятельно рекомендуем прочесть эту официальную
25 | `документацию `_. Этот раздел лишь кратко описывает основные концепты.
26 |
27 | Шаблон Twig это текстовый файл, который может генерировать любой формат,
28 | основанный на тексте (HTML, XML, CSV, LaTeX, ...). Twig устанавливает два вида
29 | разделителей:
30 |
31 | * ``{{ ... }}``: Выводит переменную или результат выражения в шаблон;
32 |
33 | * ``{% ... %}``: Тег, управляющий логикой шаблона; например, используется для
34 | выполнения ``for`` циклов или ``if`` условий.
35 |
36 | Ниже приведён минимальный шаблон, иллюстрирующий несколько основных правил:
37 |
38 | .. code-block:: html+jinja
39 |
40 |
41 |
42 |
43 | My Webpage
44 |
45 |
46 |
53 |
54 |
55 |
56 | Переменные, переданные в шаблон, могут быть строками, массивами или даже
57 | объектами. Twig абстрагирует разницу между ними и даёт вам доступ к "атрибутам"
58 | переменной, обозначенным через точку (``.``):
59 |
60 | .. code-block:: jinja
61 |
62 | {# array('name' => 'Fabien') #}
63 | {{ name }}
64 |
65 | {# array('user' => array('name' => 'Fabien')) #}
66 | {{ user.name }}
67 |
68 | {# force array lookup #}
69 | {{ user['name'] }}
70 |
71 | {# array('user' => new User('Fabien')) #}
72 | {{ user.name }}
73 | {{ user.getName }}
74 |
75 | {# force method name lookup #}
76 | {{ user.name() }}
77 | {{ user.getName() }}
78 |
79 | {# pass arguments to a method #}
80 | {{ user.date('Y-m-d') }}
81 |
82 | .. note::
83 |
84 | Важно знать что фигурные скобки это не часть переменной, а оператор печати.
85 | Если вы используете переменные внутри тегов, не ставьте скобки вокруг них.
86 |
87 | Декорирование шаблонов
88 | --------------------
89 |
90 | Часто шаблоны в проекте разделяют общие элементы, такие как всем известные
91 | header и footer. В Symfony2, мы смотрим на эту проблему иначе: один шаблон
92 | может быть декорирован другим. Это похоже на классы в PHP: наследование шаблона
93 | позволяет создать его базовый "макет", содержащий общие элементы вашего сайта и
94 | устанавливающий "блоки", которые могут быть переопределены дочерними шаблонами.
95 |
96 | Шаблон ``index.twig.html`` наследуется от ``layout.twig.html``, спасибо тегу ``extends``:
97 |
98 | .. code-block:: jinja
99 |
100 | {# src/Application/HelloBundle/Resources/views/Hello/index.twig.html #}
101 | {% extends "HelloBundle::layout.twig.html" %}
102 |
103 | {% block content %}
104 | Hello {{ name }}!
105 | {% endblock %}
106 |
107 | Обозначение ``HelloBundle::layout.twig.html`` выглядит знакомо, не так ли?
108 | Обозначается так же как ссылка на обычный шаблон. Эта часть ``::`` всего лишь обозначает
109 | что контроллер не указан, т. о. соотвествующий файл хранится прямо в ``views/``.
110 |
111 | Рассмотрим файл ``layout.twig.html``:
112 |
113 | .. code-block:: jinja
114 |
115 | {% extends "::base.twig.html" %}
116 |
117 | {% block body %}
118 |
Hello Application
119 |
120 | {% block content %}{% endblock %}
121 | {% endblock %}
122 |
123 | Тег ``{% block %}`` устанавливает два блока (``body`` и ``content``), которые
124 | дочерние шаблоны смогут заполнить. Всё что делает этот тег, это сообщает движку
125 | шаблонов, что дочерний шаблон может переопределить эти участки. Шаблон ``index.twig.html``
126 | переопределяет блок ``content``, который указан в базовом макете, как если бы наш
127 | макет сам по себе был декорирован оным. Когда бандл в имени шаблона не указан
128 | (``::base.twig.html``), то виды ищутся в папке ``app/views/``. Эта папка хранит
129 | глобальные виды для всего проекта:
130 |
131 | .. code-block:: jinja
132 |
133 | {# app/views/base.twig.html #}
134 |
135 |
136 |
137 |
138 | {% block title %}Hello Application{% endblock %}
139 |
140 |
141 | {% block body '' %}
142 |
143 |
144 |
145 | Теги, фильтры и функции
146 | -------------------------
147 |
148 | Одна из лучших особенностей Twig его расширяемость через теги, фильтры и функции;
149 | Многие из них поставляется вместе с Symfony2, облегчая работу web дизайнера.
150 |
151 | Включения других шаблонов
152 | ~~~~~~~~~~~~~~~~~~~~~~~~~
153 |
154 | Лучший способ распределить фрагмент кода между несколькими различными шаблонами
155 | это определить шаблон, подключаемый в другие.
156 |
157 | Создайте шаблон ``hello.twig.html``:
158 |
159 | .. code-block:: jinja
160 |
161 | {# src/Application/HelloBundle/Resources/views/Hello/hello.twig.html #}
162 | Hello {{ name }}
163 |
164 | Измените шаблон ``index.twig.html`` таким образом, чтобы подключить его:
165 |
166 | .. code-block:: jinja
167 |
168 | {# src/Application/HelloBundle/Resources/views/Hello/index.twig.html #}
169 | {% extends "HelloBundle::layout.twig.html" %}
170 |
171 | {# override the body block from index.twig.html #}
172 | {% block body %}
173 | {% include "HelloBundle:Hello:hello.twig.html" %}
174 | {% endblock %}
175 |
176 | Вложение других контроллеров
177 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~
178 |
179 | Что если вы захотите вложить результат другого контроллера в шаблон? Это очень
180 | удобно когда работаешь с Ajax или когда встроенному шаблону необходимы
181 | переменные, которые не доступны в главном шаблоне.
182 |
183 | Если вы создали действие ``fancy`` и хотите включить его в шаблон ``index``,
184 | используйте тег ``render``:
185 |
186 | .. code-block:: jinja
187 |
188 | {# src/Application/HelloBundle/Resources/views/Hello/index.twig.html #}
189 | {% render "HelloBundle:Hello:fancy" with { 'name': name, 'color': 'green' } %}
190 |
191 | Имеем строку ``HelloBundle:Hello:fancy``, обращающуюся к действию ``fancy``
192 | контроллера ``Hello`` и аргумент, используемый для имитирования запроса для
193 | заданного пути::
194 |
195 | // src/Application/HelloBundle/Controller/HelloController.php
196 |
197 | class HelloController extends Controller
198 | {
199 | public function fancyAction($name, $color)
200 | {
201 | // create some object, based on the $color variable
202 | $object = ...;
203 |
204 | return $this->render('HelloBundle:Hello:fancy.twig.html', array('name' => $name, 'object' => $object));
205 | }
206 |
207 | // ...
208 | }
209 |
210 | Создание ссылок между страницами
211 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
212 |
213 | Говоря о web приложениях, нельзя не упомянуть о ссылках. Вместо жёстких URL-ов
214 | в шаблонах, функция ``path`` поможет сделать URL-ы, основанные на конфигурации
215 | маршрутизатора. Таким образом URL-ы могут быть легко обновлены, если изменить
216 | конфигурацию:
217 |
218 | .. code-block:: jinja
219 |
220 | Greet Thomas!
221 |
222 | Функция ``path`` использует имя маршрута и массив параметров как аргументы.
223 | Имя маршрута это основа, в соотвествии с которой выбираются маршруты, а
224 | параметры это значения заполнителей, объявленных в паттерне маршрута:
225 |
226 | .. code-block:: yaml
227 |
228 | # src/Application/HelloBundle/Resources/config/routing.yml
229 | hello: # The route name
230 | pattern: /hello/{name}
231 | defaults: { _controller: HelloBundle:Hello:index }
232 |
233 | .. tip::
234 |
235 | Функция ``url`` создает *абсолютные* URL-ы:
236 | ``{{ url('hello', { 'name': 'Thomas' }) }}``.
237 |
238 | Подключение активов: изображений, JavaScript-ов и таблиц стилей
239 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
240 |
241 | Как выглядел бы интернет без изображений, JavaScript-ов и таблиц стилей?
242 | Symfony2 предлагает функцию ``asset`` для работы с ними:
243 |
244 | .. code-block:: jinja
245 |
246 |
247 |
248 |
249 |
250 | Основная цель функции ``asset`` сделать приложение более переносимым. Благодаря
251 | ей, можно переместить корневую папку приложения куда угодно внутри вашей
252 | корневой web директории без изменения шаблона.
253 |
254 | Экранирование вывода
255 | ---------------
256 |
257 | Изначально Twig настроен экранировать весь вывод. Прочтите Twig
258 | `documentation`_ чтобы узнать больше об экранировании и расширении Escaper.
259 |
260 | Заключительное слово
261 | --------------
262 |
263 | Twig простой и мощный. Благодаря макетам, блокам, шаблонам и внедрениям действий,
264 | становится действительно просто организовать ваши шаблоны логически и сделать их
265 | расширяемыми.
266 |
267 | Проработав с Symfony2 около 20 минут, вы уже можете делать удивительные вещи.
268 | В этом сила Symfony2. Изучать основы легко, вскоре вы узнаете что эта простота
269 | скрыта в очень гибкой архитектуре.
270 |
271 | Я немного поспешил. Во-первых, вы должны узнать больше о контроллере, именно он
272 | станет темой следующей части учебника. Готовы к следующим 10 минутам с Symfony2?
273 |
274 | .. _Twig: http://www.twig-project.org/
275 | .. _documentation: http://www.twig-project.org/documentation
276 |
--------------------------------------------------------------------------------
/reference/constraints/map.rst.inc:
--------------------------------------------------------------------------------
1 | Базовые ограничения
2 | ~~~~~~~~~~~~~~~~~~~
3 |
4 | Ниже перечислены базовые ограничения: они используются для самых
5 | простых проверок полей классов или значений, возвращаемых методами
6 | объектов.
7 |
8 | * :doc:`NotBlank `
9 | * :doc:`Blank `
10 | * :doc:`NotNull `
11 | * :doc:`Null `
12 | * :doc:`True `
13 | * :doc:`False `
14 | * :doc:`Type `
15 |
16 | Строковые ограничения
17 | ~~~~~~~~~~~~~~~~~~~~~
18 |
19 | * :doc:`Email `
20 | * :doc:`MinLength `
21 | * :doc:`MaxLength `
22 | * :doc:`Url `
23 | * :doc:`Regex `
24 | * :doc:`Ip `
25 |
26 | Числовые ограничения
27 | ~~~~~~~~~~~~~~~~~~~~
28 |
29 | * :doc:`Max `
30 | * :doc:`Min `
31 |
32 | Ограничения дат
33 | ~~~~~~~~~~~~~~~
34 |
35 | * :doc:`Date `
36 | * :doc:`DateTime `
37 | * :doc:`Time `
38 |
39 | Ограничения коллекций
40 | ~~~~~~~~~~~~~~~~~~~~~
41 |
42 | * :doc:`Choice `
43 | * :doc:`Collection `
44 | * :doc:`UniqueEntity `
45 | * :doc:`Language `
46 | * :doc:`Locale `
47 | * :doc:`Country `
48 |
49 | Ограничения файлов
50 | ~~~~~~~~~~~~~~~~~~
51 |
52 | * :doc:`File `
53 | * :doc:`Image `
54 |
55 | Прочие ограничения
56 | ~~~~~~~~~~~~~~~~~~
57 |
58 | * :doc:`Callback `
59 | * :doc:`All `
60 | * :doc:`UserPassword `
61 | * :doc:`Valid `
62 |
63 | .. toctree::
64 | :hidden:
65 |
66 | Translation source: 2011-09-30 283b2f5
67 | Corrected from:
68 |
--------------------------------------------------------------------------------
/reference/forms/twig_reference.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Формы; Справочник функций Twig
3 |
4 | Справочник функций Twig для работы с формами
5 | ============================================
6 |
7 | Это справочное руководство содержит все функции Twig, доступные при
8 | отображении форм. Имеется несколько таких функций, каждая из которых
9 | отвечает за отображение своей части формы (метки, ошибки, виджеты и т.д.).
10 |
11 | form_label(form.name, label, variables)
12 | ---------------------------------------
13 |
14 | Отображает метку для данного поля. Опционально вы можете передать
15 | свой текст для метки в качестве второго аргумента.
16 |
17 | .. code-block:: jinja
18 |
19 | {{ form_label(form.name) }}
20 |
21 | {# Эти две формы записи эквивалентны #}
22 | {{ form_label(form.name, 'Your Name', { 'attr': {'class': 'foo'} }) }}
23 | {{ form_label(form.name, null, { 'label': 'Your name', 'attr': {'class': 'foo'} }) }}
24 |
25 | form_errors(form.name)
26 | ----------------------
27 |
28 | Отображает ошибки для данного поля.
29 |
30 | .. code-block:: jinja
31 |
32 | {{ form_errors(form.name) }}
33 |
34 | {# отображает "глобальные" ошибки формы #}
35 | {{ form_errors(form) }}
36 |
37 | form_widget(form.name, variables)
38 | ---------------------------------
39 |
40 | Отображает HTML виджет для данного поля. Если вы используете этот
41 | хелпер для всей формы или набора полей, они будут полностью отображены.
42 |
43 | .. code-block:: jinja
44 |
45 | {# отображает виджет и добавляет ему класс "foo" #}
46 | {{ form_widget(form.name, { 'attr': {'class': 'foo'} }) }}
47 |
48 | Второй аргумент ``form_widget`` - это массив переменных. Наиболее типичной
49 | из них является ``attr``, который представляет собой мссив HTML-атрибутов,
50 | которые будут применены к HTML-виджету. В некоторых случаях, ряд типов полей
51 | также имеют другие опции, относящиеся к отображению шаблона. Эти опции описаны
52 | для каждого из таких типов полей.
53 |
54 | form_row(form.name, variables)
55 | ------------------------------
56 |
57 | Отображает "строку" для заданного поля, которая является комбинацией метки,
58 | ошибок и виджета.
59 |
60 | .. code-block:: jinja
61 |
62 | {# отображаем строку, метку заменяем на "foo" #}
63 | {{ form_row(form.name, { 'label': 'foo' }) }}
64 |
65 | Второй аргумент ``form_row`` - это массив. Шаблоны, предоставляемые в Symfony
66 | позволяют изменять лишь метку, как, и показано в примере выше.
67 |
68 | form_rest(form, variables)
69 | --------------------------
70 |
71 | Отображает все поля формы, которые ещё не были отображены. Хорошим подходом
72 | является всегда использовать этот хелпер в ваших формах для отображения
73 | скрытых полей, а также полей, которые вы могли случайно забыть.
74 |
75 | .. code-block:: jinja
76 |
77 | {{ form_rest(form) }}
78 |
79 | form_enctype(form)
80 | ------------------
81 |
82 | Если поле содержит хоть одно поле для загрузки файла, этот хелпер
83 | отобразит атрибут формы ``enctype="multipart/form-data"``. Хорошей
84 | практикой является его использование во всех формах:
85 |
86 | .. code-block:: html+jinja
87 |
88 |