Создание сайта “Обратный отсчет” на Symfony2

Мы иногда видим сайты с обратным отсчетом, проект стартует через … Его сделать достаточно просто, и не займет много времени. Мы воспользуемся проектом fdevs/coming-soon, который основан на Symfony2. Также будем сохранять введеный пользователями адреса электронной почтой в базу данных MongoDB. У нас есть настроенное рабочее окружение Osx, о настройке можно прочитать в статье Yosemite настройка рабочего окружения. Но главное версия php не меньше 5.4. В проекте можно также использовать реляционную базу данных типа MySQL. По умолчанию в проекте вообще не используется база данных, а введеный email отправляется на почту.

Установка и настройка

Создадим проект с помощью composer и переходим в папку с проектом:

$ composer create-project fdevs/coming-soon coming
$ cd coming

Для нашего приложения настроим разрешения для папок.

$ rm -rf var/cache/*
$ rm -rf var/logs/*
$ rm -rf var/spool/*

$ HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`
$ sudo chmod +a "$HTTPDUSER allow delete,write,append,file_inherit,directory_inherit" var/cache var/logs var/spool
$ sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" var/cache var/logs var/spool

Добавим наш проект в nginx $ vim /usr/local/etc/nginx/sites/coming.conf

server {
    server_name coming.local;
    error_log /usr/local/var/log/nginx/coming.error.log;
    access_log /usr/local/var/log/nginx/coming.access.log;
    root /Users/andrey/Sites/coming/web;
    include templates/symfony.conf;
}

Также добавим проект в $ sudo vim /etc/hosts в конец допишем новую строку

127.0.0.1 coming.local

перегрузим веб сервер $ sudo nginx -s reload

Для отправления почты добавим в планировки задач(cron) задачу $ bin/console swiftmailer:spool:send

Запускаем команду $ bin/console assets:install для обновления css и js.

На данный момент получаем рабочий проект с обратным отсчетом и подпиской, отправляемой email на указанный адрес электронной почты при установке.

Сохранение email адресов в MongoDB

Устанавливаем  Doctrine MongoDB в проект с помощью composer:

$ composer require doctrine/mongodb-odm
$ composer require doctrine/mongodb-odm-bundle

Добавляем конфигурацию для базы 

#app/config/config.yml
doctrine_mongodb:
    connections:
        default:
            server: "%default_server%"
            options: {}
    default_database: "%default_database%"
    document_managers:
        default:
            auto_mapping: true

Также в файлы app/config/parameters.yml и app/config/parameters.yml.dist ваши настройки для базы, в моем примере они будут

parameters:
#...
    default_database: coming
    default_server: ‘mongodb://localhost:27017'

Добавить в app/config/parameters.yml.dist необходимо для того чтобы при обновлении проекта ваши настройки не затерлись.

Добавим bundles в проект app/AppKernel.php

<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
        //...
        new Doctrine\Bundle\MongoDBBundle\DoctrineMongoDBBundle(),
        );
    }
}

Обновляем файл app/config/config.yml

f_devs_contact_us:
#....
    database:
        db_driver: ‘mongodb'

В данном случае мы получаем рабочий проект с сохранением адресов электронной почты в MongoDB и отправлением их на адрес электронной почты. Если мы хотим видеть сохраненные адреса на сайте, необходимо добавить Админ интерфейс.

Добавление административного интерфейса

Устанавливаем Sonata Admin, мы будем ее использовать для просмотра введенных адресов.

$ composer require sonata-project/admin-bundle
$ composer require sonata-project/doctrine-mongodb-admin-bundle

Добавляем в app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        //...
        new Sonata\CoreBundle\SonataCoreBundle(),
        new Sonata\BlockBundle\SonataBlockBundle(),
        new Knp\Bundle\MenuBundle\KnpMenuBundle(),
        new Sonata\AdminBundle\SonataAdminBundle(),
        new Sonata\DoctrineMongoDBAdminBundle\SonataDoctrineMongoDBAdminBundle(),
    );
}

Добавляем config app/config/config.yml

sonata_block:
    default_contexts: [cms]
    blocks:
        sonata.admin.block.admin_list:
            contexts:   [admin]

sonata_admin:
    security:
        acl_user_manager: fos_user.user_manager
    title: 4devs company
    dashboard:
        groups:
            label.contactUs:
                label_catalogue: FDevsContactUsBundle
                items:
                    - f_devs_contact_us.admin.contact_us

Добавляем routes app/config/routing.yml

admin:
    resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
    prefix: /admin

_sonata_admin:
    resource: .
    type: sonata_admin
    prefix: /admin

Обновляем настройки

#app/config/config.yml
f_devs_contact_us:
    database:
        admin_service: ‘sonata'

Теперь можно посмотреть email по адресу coming.local/admin

Добавление контактов

Для добавления контактов используется ContactListBundle. Все контакты находятся в файле src/AppBundle/Contact/Social.php, например для того чтобы добавить адрес корпоративного сайта:

public function social(FactoryInterface $factory, array $options = [])
{
   //….
   $factory->addConnect($contact, 'home', ‘4devs company', 'http://4devs.org/');
   //….
}

Заключение

Данный проект очень легко развернуть, он не требует какое-то специальное рабочее окружение. Все настройки, дизайн и текст находятся в src/AppBundle. Такой проект нужен не часто, в основном перед стартом вашего основного проекта. Настройка не займет много времени, достаточно просто заменить название проекта и его описание. Описание проекта и название не должно быть очень длинным, или вам прийдется учитывать размеры разных экранов(устройств).

Читайте также:

Docker установка и настройка

При разработке используется множество технологий. К примеру данный блог использует php(Symfony 2), mongodb, elastic, nginx это основные но также используется nodejs к примеру для минификации css, js. При разработке приходится настраивать все технологии как показано в статье. Но что делать если проектов несколько или они используют разные технологии, например другой проект использует MySQL, или еще могут использовать разные версии php или других библиотек. Для разработки и поддержки проектов на разных технологиях можно использовать Виртуальную машину и поставить на нее к примеру centos, но это не совсем удобно, надо все равно настраивать подобное окружение как на сервере и на других машинах разработчиков. Мы будет использовать контейнеры, такие как Docker. Настроем блог разработчиков чтобы использовать Docker для разработки.

Как использовать произвольное хранилище пользователей в FOSUserBundle

Практически все используют FOSUserBundle в своих Symfony проектах т.к. он ускоряет разработку и обладает хорошим набором функциональности для управления пользователями. Бандл предоставляет несколько готовых реализаций хранилищ данных: Propel и несколько для Doctrine (ORM и ODM). Это здорово, но иногда возникает необходимость работы с другими хранилищами данных. FOSUserBundle достаточно гибок и позволяет реализовать, и использовать произвольное хранилище. Для того, чтобы использовать все возможности FOSUserBundle Вам достаточно будет написать свой менеджер пользователей под конкретного провайдера.

Интеграция Paysera в Symfony

Сегодня сложно представить себе серьезный проект, где не понадобилась бы интеграция с платежными системами. Не смотря на то что существует множество популярных систем и аггрегаторов, таких как PayPal, RBKMoney, Paymentwall, Robokassa и т.д., я хочу рассказать о Paysera. Это еще одна, довольно новая платежная система. Они позиционируют себя как выгодных с точки зрения комиссий за их услуги. Paysera позволяет вашим пользователям расплачиваться карточками, SMS и т.д. Интеграция довольно простая, однако имеет некоторые неочевидные моменты, которые я и хочу осветить.

Настройка php, MySQL, nodejs, nginx и mongodb в OS X El Capitan

Недавно вышла OS X El Capitan, давайте обновим систему. Систему будем устанавливать с usb-flash. Из рабочего окружения мы поставим  php, nginx, mariadb, mongodb, elasticsearch, nodejs используя brew и настроем проект на symfony2.

Автоматический deploy Symfony 2 используя Capifony

При разработке, и тем более поддержке действующего проекта на Symfony 2 одной из задач, которые приходится постоянно делать, это выгрузка изменений на сервер: рабочей или тестовой. Но так как программисты народ достаточно ленивый, чтобы автоматизировать повторяющиеся монотонные задачи, есть достаточное количество инструментов для облегчения данного процесса. Для Symfony2 мы используем Сapifony. Он основан на Capistrano но оптимизирован для Symfony.