├── 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 | <?php $view['slots']->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 | <?php $view['slots']->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 |

{{ page_title }}

47 | 48 | 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 |
89 | 90 | .. toctree:: 91 | :hidden: 92 | 93 | Translation source: 2011-10-02 f19d9dd 94 | Corrected from: 95 | -------------------------------------------------------------------------------- /reference/forms/types.rst: -------------------------------------------------------------------------------- 1 | .. index:: 2 | single: Формы; Справочник типов полей 3 | 4 | Справочник типов полей для форм 5 | =============================== 6 | 7 | .. toctree:: 8 | :maxdepth: 1 9 | :hidden: 10 | 11 | types/birthday 12 | types/checkbox 13 | types/choice 14 | types/collection 15 | types/country 16 | types/csrf 17 | types/date 18 | types/datetime 19 | types/email 20 | types/entity 21 | types/file 22 | types/field 23 | types/form 24 | types/hidden 25 | types/integer 26 | types/language 27 | types/locale 28 | types/money 29 | types/number 30 | types/password 31 | types/percent 32 | types/radio 33 | types/repeated 34 | types/search 35 | types/text 36 | types/textarea 37 | types/time 38 | types/timezone 39 | types/url 40 | 41 | Форма состоит из *полей*, каждое из которых создаётся при помощи *типов* полей 42 | (например, тип ``text``, тип ``choice`` и т.д.). Symfony2 поставляется 43 | с большим количеством типов полей, которые могут быть использованы в вашем 44 | приложении. 45 | 46 | Поддерживаемые типы полей 47 | ------------------------- 48 | 49 | Следующие типы полей доступны в Symfony2: 50 | 51 | .. include:: /reference/forms/types/map.rst.inc 52 | 53 | .. toctree:: 54 | :hidden: 55 | 56 | Translation source: 2011-10-02 8ba03dc 57 | Corrected from: 58 | 59 | -------------------------------------------------------------------------------- /reference/forms/types/collection.rst: -------------------------------------------------------------------------------- 1 | .. index:: 2 | single: Формы; Поля; collection 3 | 4 | Тип поля collection 5 | =================== 6 | 7 | См. класс :class:`Symfony\\Component\\Form\\Extension\\Core\\Type\\CollectionType`. 8 | 9 | .. toctree:: 10 | :hidden: 11 | 12 | Translation source: 2011-10-03 df3a504 13 | Corrected from: 14 | -------------------------------------------------------------------------------- /reference/forms/types/date.rst: -------------------------------------------------------------------------------- 1 | .. index:: 2 | single: Формы; Поля; date 3 | 4 | Поле date 5 | =============== 6 | 7 | Это поле позволяет пользователю изменять информацию о дате при помощи 8 | различных HTML-элементов. 9 | 10 | Соответствующие данные для этого поля должны быть в виде объекта ``\DateTime``, 11 | строки, таймштампа или массива. Если опция `input`_ указана верно, поле будет 12 | заботиться о деталях самостоятельно. 13 | 14 | Это поле может быть отображено как один текстбокс, три текстбокса (месяц, 15 | день, год) или же три селектбокса (см. опцию `widget_`). 16 | 17 | +----------------------+-----------------------------------------------------------------------------+ 18 | | Тип данных | ``\DateTime``, string, timestamp, или array (см. опцию ``input``) | 19 | +----------------------+-----------------------------------------------------------------------------+ 20 | | Отображается как | один text box или три поля select | 21 | +----------------------+-----------------------------------------------------------------------------+ 22 | | Опции | - `widget`_ | 23 | | | - `input`_ | 24 | | | - `empty_value`_ | 25 | | | - `years`_ | 26 | | | - `months`_ | 27 | | | - `days`_ | 28 | | | - `format`_ | 29 | | | - `pattern`_ | 30 | | | - `data_timezone`_ | 31 | | | - `user_timezone`_ | 32 | +----------------------+-----------------------------------------------------------------------------+ 33 | | Родительский тип | ``field`` (если текст), иначе ``form`` | 34 | +----------------------+-----------------------------------------------------------------------------+ 35 | | Класс | :class:`Symfony\\Component\\Form\\Extension\\Core\\Type\\DateType` | 36 | +----------------------+-----------------------------------------------------------------------------+ 37 | 38 | Примеры использования 39 | --------------------- 40 | 41 | Это поле имеет много натроект, но оно просто в использовании. Наиболее 42 | важными опциями являются ``input`` и ``widget``. 43 | 44 | Полагая, что у вас есть поле ``publishedAt``, которое содержит дату в 45 | виде обхекта ``DateTime``. Следующий код конфигурирует поле ``date`` 46 | для этого поля в вите трёх селектов: 47 | 48 | .. code-block:: php 49 | 50 | add('publishedAt', 'date', array( 52 | 'input' => 'datetime', 53 | 'widget' => 'choice', 54 | )); 55 | 56 | Опция ``input`` *должна* всегда соответствовать типу данных, которые используются 57 | для этого поля. Например, если поле ``publishedAt`` использует unix timestamp, 58 | вам нужно присвоить опции ``input`` значение ``timestamp``: 59 | 60 | .. code-block:: php 61 | 62 | add('publishedAt', 'date', array( 64 | 'input' => 'timestamp', 65 | 'widget' => 'choice', 66 | )); 67 | 68 | Это поле также подерживает ``array`` и ``string`` в качестве валидных опций 69 | для ``input``. 70 | 71 | Опции поля 72 | ---------- 73 | 74 | .. include:: /reference/forms/types/options/date_widget.rst.inc 75 | 76 | .. _form-reference-date-input: 77 | 78 | .. include:: /reference/forms/types/options/date_input.rst.inc 79 | 80 | empty_value 81 | ~~~~~~~~~~~ 82 | 83 | **type**: ``string`` | ``array`` 84 | 85 | Если опция widget имеет значение ``choice``, тогда это поле будет представлено 86 | последовательностью селектбоксов. Опция ``empty_value`` может быть использована 87 | для добавления пустой опции в начале списка селектбокса: 88 | 89 | .. code-block:: php 90 | 91 | add('dueDate', 'date', array( 93 | 'empty_value' => '', 94 | )); 95 | 96 | Также вы можете указать строку, которая будет значением "пустой" опции в selectbox: 97 | 98 | .. code-block:: php 99 | 100 | add('dueDate', 'date', array( 102 | 'empty_value' => array('year' => 'Year', 'month' => 'Month', 'day' => 'Day') 103 | )); 104 | 105 | .. include:: /reference/forms/types/options/years.rst.inc 106 | 107 | .. include:: /reference/forms/types/options/months.rst.inc 108 | 109 | .. include:: /reference/forms/types/options/days.rst.inc 110 | 111 | .. include:: /reference/forms/types/options/date_format.rst.inc 112 | 113 | .. include:: /reference/forms/types/options/date_pattern.rst.inc 114 | 115 | .. include:: /reference/forms/types/options/data_timezone.rst.inc 116 | 117 | .. include:: /reference/forms/types/options/user_timezone.rst.inc 118 | 119 | .. toctree:: 120 | :hidden: 121 | 122 | Translation source: 2011-10-02 d150185 123 | Corrected from: 124 | -------------------------------------------------------------------------------- /reference/forms/types/map.rst.inc: -------------------------------------------------------------------------------- 1 | Текстовые поля 2 | ~~~~~~~~~~~~~~ 3 | 4 | * :doc:`text` 5 | * :doc:`textarea` 6 | * :doc:`email` 7 | * :doc:`integer` 8 | * :doc:`money` 9 | * :doc:`number` 10 | * :doc:`password` 11 | * :doc:`percent` 12 | * :doc:`search` 13 | * :doc:`url` 14 | 15 | Поля для выбора 16 | ~~~~~~~~~~~~~~~ 17 | 18 | * :doc:`choice` 19 | * :doc:`entity` 20 | * :doc:`country` 21 | * :doc:`language` 22 | * :doc:`locale` 23 | * :doc:`timezone` 24 | 25 | Поля для даты и времени 26 | ~~~~~~~~~~~~~~~~~~~~~~~ 27 | 28 | * :doc:`date` 29 | * :doc:`datetime` 30 | * :doc:`time` 31 | * :doc:`birthday` 32 | 33 | Прочие поля 34 | ~~~~~~~~~~~ 35 | 36 | * :doc:`checkbox` 37 | * :doc:`file` 38 | * :doc:`radio` 39 | 40 | Группы полей 41 | ~~~~~~~~~~~~ 42 | 43 | * :doc:`collection` 44 | * :doc:`repeated` 45 | 46 | Скрытые поля 47 | ~~~~~~~~~~~~ 48 | 49 | * :doc:`hidden` 50 | * :doc:`csrf` 51 | 52 | Базовые поля 53 | ~~~~~~~~~~~~ 54 | 55 | * :doc:`field` 56 | * :doc:`form` 57 | 58 | .. toctree:: 59 | :hidden: 60 | 61 | Translation source: 2011-10-02 8ba03dc 62 | Corrected from: 63 | -------------------------------------------------------------------------------- /reference/index.rst: -------------------------------------------------------------------------------- 1 | Reference Documents 2 | =================== 3 | 4 | .. toctree:: 5 | :hidden: 6 | 7 | configuration/framework 8 | configuration/assetic 9 | configuration/doctrine 10 | configuration/security 11 | configuration/swiftmailer 12 | configuration/twig 13 | configuration/monolog 14 | configuration/web_profiler 15 | 16 | forms/types 17 | forms/twig_reference 18 | 19 | constraints 20 | dic_tags 21 | YAML 22 | requirements 23 | 24 | .. include:: /reference/map.rst.inc 25 | -------------------------------------------------------------------------------- /reference/map.rst.inc: -------------------------------------------------------------------------------- 1 | * **Конфигурирование**: 2 | 3 | Если вы хоть раз задавались вопросом, что означают различные опции в 4 | ваших конфигурационных файлах, таких как ``app/config/config.yml``, то 5 | этот раздел для вас. Здесь все конфигурационные параметры разбиты 6 | на подразделы по ключу (например ``framework``), которые определяют 7 | все возможные секции в настройках Symfony2. 8 | 9 | * :doc:`framework ` 10 | * :doc:`doctrine ` 11 | * :doc:`security ` 12 | * :doc:`assetic ` 13 | * :doc:`swiftmailer ` 14 | * :doc:`twig ` 15 | * :doc:`monolog ` 16 | * :doc:`web_profiler ` 17 | 18 | * **Формы и валидация** 19 | 20 | * :doc:`Формы, справочник типов полей` 21 | * :doc:`Валидация, справочник ограничений ` 22 | * :doc:`Twig: справочник функций для работы с формами` 23 | 24 | * **Остальные разделы** 25 | 26 | * :doc:`/reference/dic_tags` 27 | * :doc:`/reference/YAML` 28 | * :doc:`/reference/requirements` 29 | --------------------------------------------------------------------------------