Одна из вещей, за которые я благодарен в своей работе, — это возможность писать значимый код на множестве разных языков программирования. Совсем недавно это были JavaScript (node/browser), Objective-C и Ruby, но начинал я как разработчик на Java/JEE, создавал большие приложения на Adobe Flex с использованием ActionScript 3 и даже писал код (с переменным успехом) на C#, Python и Perl. Однако в этом списке отсутствует рабочая лошадка интернета, тот самый «клей», который скрепляет всемирную паутину, — я говорю, конечно же, о PHP. Но, как назло, недавно у меня возникла острая необходимость освоить основы этого почтенного серверного языка сценариев и заполнить этот пробел.
Осваивая PHP-вселенную, я обнаружил, что язык, похоже, переживает некий ренессанс. Если ваше единственное взаимодействие с PHP сводится к редким хакам WordPress, вы не заметите, как веб-разработчики продвигают эту технологию вперед. Несмотря на огромное разнообразие подходов к решению задач, в PHP появился сильный игрок в области управления пакетами — Composer. Язык и среда исполнения продолжают развиваться: PHP 5.6, PHPNG и виртуальная машина HipHop от Facebook демонстрируют, что вокруг платформы по-прежнему кипит здоровая конкуренция и страсть.
Высокоуровневых веб-фреймворков для PHP существует великое множество, и они продолжают активно развиваться. В последнее время большой интерес вызывает фреймворк Laravel. Изучая и исследуя Laravel, я начинаю понимать почему — он объединяет множество инструментов и фреймворков, которые уже давно полюбились и проверены в PHP-сообществе, в единое целое.
Конечно, первое, что я сделал, начав изучать Laravel, — это достиг уровня «Hello World» с Twilio. Возможно, то, что я узнал в процессе, будет полезно и вам? Если разработка веб-приложений на Laravel — это круто, то использование Laravel и Twilio для звонков или отправки сообщений вашим клиентам — это еще круче.
В этом руководстве я покажу, как начать работу с Twilio и Laravel, используя облачную платформу разработки Nitrous.io. Мы научимся принимать входящие звонки и текстовые сообщения в вашем приложении Laravel с помощью механизма обратных вызовов, называемых вебхуками. Также мы будем использовать вспомогательную библиотеку Twilio для PHP, чтобы делать аутентифицированные запросы к REST API, что позволит нам отправлять текстовые сообщения и совершать исходящие звонки. В конце вы получите ресурсы для дальнейшего изучения Twilio, Laravel и других технологий, использованных в этой статье.
Звучит заманчиво? Тогда приступим! Начнем с настройки облачной среды разработки PHP/Laravel на Nitrous, прежде чем перейти к работе с Twilio.
Nitrous — это облачная среда разработки, которая упрощает создание и настройку виртуальной машины для различных популярных языков программирования. Еще одно ее преимущество заключается в том, что она живет в интернете, поэтому вы можете предварительно просматривать результат по живой ссылке, которой можно поделиться с коллегами (и с Twilio, как мы увидим позже). Мы используем Nitrous здесь, потому что это самый быстрый способ, который я нашел, чтобы перейти от полного нуля к функциональной среде разработки PHP. Но если вы предпочитаете использовать Homestead, MAMP или уже имеющуюся среду разработки PHP, смело делайте это и переходите к разделу «Обработка входящих звонков и текстовых сообщений» этого руководства. Просто помните, что Twilio потребуется публичный URL для вашего сервера (ngrok отлично подходит для предоставления вашему локальному компьютеру публичного URL — я написал небольшое руководство об этом здесь).
Это руководство предполагает, что вы будете (по крайней мере, на начальном этапе) использовать облачную IDE от Nitrous, но вы можете скачать их настольное приложение, если предпочитаете работать локально с собственным редактором и инструментами. Давайте настроим нашу Nitrous-машину для работы над приложением Laravel.
#### Создание Nitrous-машины для локальной разработки
Если вы еще этого не сделали, зарегистрируйтесь в Nitrous. После регистрации и аутентификации перейдите в панель управления и создайте новую PHP-машину.
Вы можете настроить доступные ресурсы по своему усмотрению, но учтите, что бесплатный аккаунт имеет ограниченное количество ресурсов. После создания машины нажмите кнопку «IDE».
На следующей странице вас встретит знакомый интерфейс, напоминающий настольные IDE. Здесь есть обозреватель файлов, редактор и терминал в нижней части экрана. Уже установлен и запущен Apache HTTP-сервер на порту 3000, настроенный для обслуживания содержимого папки ~/workspace/www. Чтобы убедиться, что все работает, создайте в этой директории простой PHP-скрипт с именем «index.php» и добавьте в него следующий код:
В вашей IDE вы заметите меню опций в верхней части экрана — одна из них называется «Preview». Нажмите на это меню и выберите порт 3000 (не SSL-версию). Это должно открыть новое окно браузера с информацией о вашей PHP-среде. Иногда уместно использовать PHP без фреймворков, но в этом руководстве мы хотим использовать Laravel. Давайте посмотрим, как его установить на Nitrous.
#### Установка Laravel и создание проекта
Чтобы использовать Laravel на нашей Nitrous-машине, нам предстоит немного поработать. Нам нужно отредактировать некоторые конфигурационные файлы и установить дополнительное программное обеспечение на нашу машину. Ниже обозревателя файлов есть опция отображения скрытых файлов — убедитесь, что она включена, так как нам скоро понадобится редактировать некоторые из этих файлов.
Но сначала давайте убедимся, что у нас установлена последняя версия Composer — менеджера пакетов для PHP. Мы будем использовать его для управления и установки всех зависимостей, включая Twilio и Laravel. В терминале IDE введите команду «composer selfupdate».
Согласно инструкциям в документации Laravel, мы установим команду «laravel» глобально с помощью Composer, чтобы использовать ее для управления и создания новых проектов. В терминале введите команду «composer global require «laravel/installer=~1.1″».
Это загрузит и установит Laravel, но нам все еще нужно добавить команду «laravel» в системный путь. Для этого отредактируем файл «.bash_profile» в домашней директории. Вы должны увидеть этот файл в обозревателе слева, если нажали кнопку «Show Hidden». В этом файле замените строку, настраивающую системный путь, на следующую:
В терминале введите «source .bash_profile» — теперь команда «laravel» должна быть доступна в системном пути. Проверьте это, введя «laravel» в терминал без дополнительных аргументов.
Хорошо, теперь давайте создадим наше новое приложение Laravel. В терминале введите «cd workspace», чтобы перейти в директорию, где мы создадим наше приложение. Введите «laravel new myproject», чтобы создать новый проект Laravel с именем «myproject» в директории workspace.
Отлично — теперь у нас есть проект Laravel на нашей Nitrous-машине. Теперь нужно указать Apache HTTP-серверу на этот новый проект Laravel. В вашем обозревателе файлов найдите конфигурационный файл «httpd.conf» для Apache — он должен находиться в «~/.parts/etc/apache2/httpd.conf». Откройте этот файл и найдите запись конфигурации корневого каталога сервера — измените ссылку на «www» (старое PHP-приложение) на папку public вашего нового проекта. Конфигурация должна выглядеть примерно так:
Папка «public», которую мы установили в качестве корневого каталога, будет содержать все ваши статические ресурсы (CSS, JavaScript, изображения и т.д.). Она также содержит файл конфигурации «.htaccess», который настраивает маршрутизатор Laravel и включает красивые URL. Теперь нужно перезапустить Apache-сервер, чтобы наше новое приложение начало обслуживаться. На Nitrous-машине мы используем менеджер пакетов autoparts для установки и управления зависимым программным обеспечением. С помощью команды «parts» перезапустим Apache командой «parts restart apache2».
Теперь снова предварительно просмотрим наш сайт — в меню «Preview» IDE выберите порт 3000. На этот раз вы должны увидеть логотип Laravel и приветственный текст «You have arrived».
И мы действительно прибыли! Теперь мы готовы создать простое приложение Twilio с использованием Laravel. Начнем с изучения того, как обрабатывать входящие звонки и текстовые сообщения на номер Twilio.
Ваше веб-приложение уже имеет URL — уникальный идентификатор, который вы вводите в адресную строку браузера для доступа к содержимому вашего сайта. С Twilio вы можете дать своему приложению и номер телефона! Ваши пользователи смогут звонить или отправлять сообщения вашему приложению, а вы сможете предоставлять им информацию с помощью речи, аудио или текста. Вы можете создать что-то простое, например корпоративный справочник или систему оповещений по SMS, или даже полноценный колл-центр с помощью Twilio и вашего PHP-приложения.
Но давайте начнем с основ, хорошо? Если вы еще этого не сделали, зарегистрируйтесь в Twilio. После регистрации мы сможем получить номер телефона Twilio для использования с нашим приложением. Вы можете купить новый номер для своего приложения или использовать существующий здесь. Как только у вас будет номер телефона, щелкните по нему, чтобы открыть экран конфигурации, который выглядит следующим образом:
В двух текстовых полях вы укажете URL запроса для входящих голосовых звонков и входящих текстовых сообщений. Twilio отправит HTTP-запрос на эти URL, когда ваш номер телефона, подключенный к Twilio, получит звонок или сообщение. Ваше веб-приложение должно ответить XML-документом, содержащим инструкции по обработке звонка или сообщения. Вы указываете Twilio, как себя вести, с помощью набора XML-тегов, которые мы называем TwiML. Используя TwiML, вы можете сказать Twilio отправить ответное текстовое сообщение, использовать преобразование текста в речь для ответа звонящему, воспроизвести звонящему MP3-файл, подключить звонящего к конференц-звонку и многое другое.
Давайте используем наше приложение Laravel для ответа на входящий звонок. Чтобы помочь нам в этом, мы установим и будем использовать вспомогательную библиотеку Twilio для PHP. Последняя версия помощника Twilio размещена на Packagist — центральном репозитории для Composer. Вы можете установить последнюю версию помощника Twilio с помощью команды «composer require twilio/sdk». Когда вас попросят указать ограничение версии, вы можете ввести «3.x», чтобы указать последнюю версию из линейки 3.x (библиотека PHP от Twilio в основном придерживается семантического версионирования).
Первое, для чего мы будем использовать Twilio SDK, — это генерация инструкций TwiML для входящего звонка. В вашем приложении Laravel откройте файл «/app/routes.php» — этот файл содержит все маршруты, на которые будет отвечать ваше приложение. Laravel настроен на использование простых маршрутов на основе замыканий, а также маршрутов, которые сопоставляются с методами объектов-контроллеров. Для целей этого примера мы будем использовать эти простые маршруты, а не полноценные объекты-контроллеры.
Сейчас в routes.php содержится один маршрут для главной страницы — HTTP-запрос GET к корневому URL «/». Давайте добавим еще один маршрут, который будет отвечать как на GET, так и на POST-запросы, чтобы мы могли тестировать его обоими способами. Прямо над маршрутом для главной страницы добавьте следующий маршрут:
Здесь мы вручную создаем XML-строку, которую возвращаем с помощью объекта Response Laravel. Чтобы проверить, что это работает, вы можете снова предварительно просмотреть свое приложение, но на этот раз добавив «/incoming» к URL в браузере. Вы увидите, что вместо HTML мы возвращаем XML-документ, согласно заголовку Content-Type, который мы установили в нашем ответе.
Однако создание XML-строки вручную — это довольно грубо, поэтому давайте используем помощник Twilio для программной сборки ответа TwiML. Это должно лучше масштабироваться, когда у нас будут более сложные ответы TwiML:
Если вы обновите окно предварительного просмотра, то увидите, что у нас все еще есть XML, но на этот раз тег имеет атрибут «voice» — это указывает механизму преобразования текста в речь Twilio, какой голос использовать для чтения сообщения. Теперь, когда мы знаем, что хотим, чтобы Twilio делал, давайте настроим наш номер Twilio на запрос инструкций у нашего веб-приложения при получении входящих звонков. Скопируйте URL предварительного просмотра в вашем браузере, перейдите в конфигурацию вашего номера Twilio и вставьте URL в поле Voice Request URL, как показано:
Обязательно сохраните изменения после добавления URL. Теперь позвоните на свой номер Twilio — вас должен поприветствовать дружелюбный робот, который скажет, насколько круто ваше приложение Laravel. Я, например, склонен согласиться.
Теперь, когда мы знаем, как обрабатывать входящие сообщения, давайте займемся исходящими и отправим себе текстовое сообщение.
Начнем с создания простой веб-формы с двумя полями — одно для текста сообщения, которое мы отправляем, и другое для номера телефона, на который мы хотим отправить сообщение. Laravel следует шаблону проектирования Model-View-Controller и выделяет рендеринг HTML в «представления» — эти PHP-файлы находятся в директории /app/views. Внутри этой директории создайте новый файл с именем «home.php» — мы будем рендерить это представление при предварительном просмотре нашего сайта. В этом файле разместите следующую простую HTML-форму:
Мы используем Twitter Bootstrap из CDN, чтобы сделать нашу страницу немного привлекательнее, но в остальном это просто форма с двумя необходимыми текстовыми полями. Теперь вернемся к нашему маршрутизатору и изменим представление для главной страницы, чтобы использовать этот новый файл представления:
Снова предварительно просмотрите свой сайт, и вы должны увидеть красивую форму для сбора номера телефона и содержимого текстового сообщения. Однако форма пока никуда не отправляет данные! Нам все еще нужно реализовать маршрут POST /text, что мы и сделаем вскоре. Но прежде чем мы сможем отправить текст, нам нужно настроить информацию об учетной записи Twilio для приложения. Laravel предоставляет возможность хранения специфичных для окружения параметров конфигурации вашего приложения. Вы можете подробнее узнать о том, как это работает, в их документации здесь. В корне вашего проекта, на том же уровне, что и composer.json, создайте новый файл с именем «.env.php». Этот PHP-код вернет ассоциативный массив переменных конфигурации, которые будут доступны вашему приложению.
В этом приложении нам понадобятся три переменные конфигурации — наш номер Twilio, который мы будем использовать в качестве отправителя сообщения, а также SID учетной записи и токен аутентификации, которые по сути являются нашим именем пользователя и паролем для API Twilio. Вы можете найти SID учетной записи и токен аутентификации на панели управления учетной записью. В приведенном ниже коде замените XXX на SID вашей учетной записи Twilio, YYY на токен аутентификации, а номер 612 на ваш собственный номер Twilio:
ВАЖНО: Не добавляйте этот файл в систему контроля версий! Добавьте его в файл .gitignore, если вы используете git, или примите аналогичные меры для других систем контроля версий.
Теперь откройте файл /app/routes.php. Мы можем создать маршрут, который отправляет текстовое сообщение, согласно данным формы, которую мы создали. Где-нибудь в файле routes.php добавьте следующий код — читайте комментарии, чтобы понять, что происходит на каждом этапе:
Теперь предварительно просмотрите свой сайт и введите свой мобильный номер и тестовое сообщение в предоставленные поля. Когда вы нажмете кнопку, вы должны увидеть JSON-представление объекта Message, который возвращается после успешного запроса к Twilio. Что еще важнее, ваш телефон должен завибрировать после получения только что созданного вами текстового сообщения!
Однако иногда что-то идет не по плану. Если по какой-то причине произойдет ошибка при попытке отправить сообщение, помощник Twilio выбросит исключение. По этой причине обычно следует оборачивать вызовы к API Twilio в блок try/catch, вот так:
Мы лишь слегка коснулись того, что возможно с Twilio и Laravel. С Twilio и вашими навыками веб-разработки вы можете создавать кастомизированные колл-центры для предоставления отличного сервиса, автоматизировать бизнес-процессы с помощью голоса и текста, а также обеспечивать сотрудничество между коллегами и клиентами по нескольким каналам связи. Вот некоторые ресурсы, которые могут быть полезны при дальнейшем изучении:
— Документация по помощнику Twilio для PHP
— Краткое руководство по Twilio
— Создание простой IVR-системы на PHP
— Click To Call на PHP
— Документация Laravel
— Документация Nitrous.io
Если у вас есть вопросы или вы просто хотите обсудить что-то крутое, что вы создали, не стесняйтесь найти меня в Twitter. Если у вас есть технические вопросы или нужна помощь в начале работы, напишите нам на help@twilio.com, и мы сделаем все возможное, чтобы помочь. Удачи и получайте удовольствие!