Статьи

PHP в Синатру

Когда дело доходит до прототипирования, нет никаких причин, по которым это невозможно сделать с помощью PHP. Мое собственное ядро ​​веб-разработки — на PHP, но я обнаружил, что хочу чего-то лучшего. Лучше, когда вы запускаете веб-приложение с минимальными усилиями.

В этой статье я предполагаю, что ваша отправная точка — то, где я был: компетентен в PHP и в Интернете (HTML и CSS), но искал удобный инструмент для создания прототипов. Мы установим Ruby и Sinatra, а затем создадим простой блог, который не нуждается в базе данных, но поддерживает Markdown .

Варианты получения установки

Вам не нужно много начинать, главным компонентом является язык программирования Ruby. Ruby доступен везде, но его настройка может быть немного проблематичной. Например, если вы используете Mac, у вас уже установлен Ruby, но не версия, которую вы хотите использовать. Почему-то Apple оставила версию 1.8.7 в качестве установленной версии даже на Mountain Lion.

Mac и Windows

Ruby 1.9.3 является текущей версией, так как мы можем установить это? Если вы используете Windows или Mac, вам повезло. Доступна относительно новая опция, называемая Rails Installer . Он предоставляет вам устанавливаемую программу, которая автоматически добавляет все необходимые компоненты без суеты. Вы можете быть удивлены, почему я предлагаю вам установить Rails, когда мы хотим, чтобы это был Sinatra. Ответ прост. Установщик Rails предоставляет все, что вам нужно для работы с Sinatra (почти).

Rails Installer похож на WAMP или MAMP, если вы используете любой из них, вы поймете идею.

Например, он будет устанавливать, среди прочего, Ruby, Git, Sqlite, необходимые вам компиляторы и Ruby Version Manager (RVM). RVM — это удивительный способ управления Ruby в вашей системе. Приятно то, что он устанавливается в «песочницу» и не вызывает конфликтов с чем-либо еще в вашей системе.

А как насчет Linux?

Если вы используете Linux, Ruby будет доступен в репозиториях по вашему выбору. Возможно, вы обнаружите, что версия Ruby будет старой, поэтому я рекомендую установить RVM. Лучшие инструкции для этого можно найти на веб-сайте RVM .

Ruby Gems

Ruby использует систему библиотек, известных как гемы. Вы можете думать о них как о чем-то похожем на идею библиотек PEAR. Установили ли вы через Rails Installer или RVM напрямую, вам нужно будет установить гем Sinatra.

Это не может быть проще. Получить в командной строке и сделать:

gem install sinatra 

Теперь, я не знаю о вас, но кажется, что это гораздо меньше, чем «открытие» каналов PEAR, не так ли?

Кстати, стоит также установить симпатичный веб-сервер под названием Thin. Синатра подхватит его автоматически, если он установлен:

 gem install thin 

Создание приложения — начало

Если вы похожи на меня, вы, вероятно, в настоящее время делаете большую часть своей разработки PHP через фреймворк. Обычно это означает, что вы должны поместить файлы каркаса в папку и начать работу с макетами, уровнем данных или другими необходимыми действиями. Это может быть настройка параметров конфигурации и добавление параметров подключения. Ну, с Синатрой ничего этого нет.

Синатра — это НЕ фреймворк, это язык, специфичный для предметной области, то есть он предназначен для решения конкретной проблемы.

Да, и пока я в этом, не стоит пытаться сравнивать PHP с Синатрой. Единственное, что я делаю, — это как быстро мы можем что-то запустить и запустить.

Хорошо, время для кода. Создайте новую папку с именем sinatra_projects , а затем внутри нее создайте папку с именем blog . Используя ваш любимый текстовый редактор, создайте файл с именем main.rb и сохраните его в папке блога . Затем создайте подпапку с именем public , а другую — под названием views .

В общей папке будут храниться ресурсы, такие как таблицы стилей и изображения, а в папке представлений будет отображаться интерфейс, который увидят наши пользователи. Хотя приложения Sinatra можно разбить на несколько файлов, в большинстве случаев это не обязательно. Для классического приложения Sinatra просто создайте файл с именем main.rb в папке блога .

Затем нам нужно добавить несколько драгоценных камней, чтобы все заработало. Итак, в начале файла main.rb вы просто добавляете:

 require 'sinatra' 

Синатра работает, отвечая на http-глаголы, такие как GET, POST, PUT и т. Д., Поэтому легко заставить что-то работать. В main.rb добавьте такой метод:

require ‘sinatra’
get ‘/’ do
«Hello, World!»
end

Здесь мы просим Синатру «получить» содержимое нашего метода и отобразить его в браузере. Это работает потому, что Sinatra — это слой, который позволяет разработчикам работать с промежуточным программным обеспечением Ruby, известным как Rack . Синатра абстрагирует Rack, чтобы мы могли сосредоточиться на HTTP-запросах, не беспокоясь о каких-либо других технических вещах.

Теперь мы можем проверить файл и посмотреть, как он выглядит. В командной строке перейдите в каталог вашего блога и введите:

 ruby main.rb 

Выходные данные скажут вам, что Sinatra вышла на сцену, и что сервер работает на порту 4567. Так что теперь вы можете посетить http: // localhost: 4567 в вашем браузере, и вы должны увидеть нашу блестящую веб-страницу, приветствующую нас с Сообщение «Привет, мир». Далее мы начнем делать что-то более полезное.

Построение блога, часть 1

Допустим, мы хотели создать приложение Sinatra, которое позволяло бы нам писать посты в блоге, используя Markdown. Для нашей первой итерации нам нужен способ создания файлов, содержащих в себе немного больше контента. Ruby имеет возможность встраиваться в HTML таким образом, который будет похож на PHP. Он известен как Embedded RuBy (erb) и прекрасно работает с Sinatra. Это означает, что мы можем создавать файлы .erb, добавлять желаемую HTML-разметку и вставлять код Ruby.

Создайте новый файл в папке blog / views и назовите его index.erb . В этом файле создайте простую HTML-страницу. Затем мы будем использовать методы Ruby для отображения текущей даты и времени:

<!DOCTYPE html>
<html>
<head>
<meta charsetUTF-8«>
<title></title>
<meta namedescription» content=»» />
<meta namekeywords» content=»» />
</head>
<body>
The date is: <%= @time.strftime(«%d-%m-%Y %H:%M:%S»)%>
</body>
</html>

view raw
index.erb
hosted with ❤ by GitHub

Мы изменим корневой метод в main.rb, чтобы сделать эту работу:

get ‘/’ do
@time = Time.new
erb :index
end

Здесь мы создали переменную экземпляра с именем timeTime Это будет доступно в нашем файле .erb, как мы уже видели.

Вам, вероятно, потребуется перезапустить сервер (CTRL & C, а затем выполнить ruby ​​main.rb, как и раньше), и вы должны увидеть страницу, отображающую дату и время. Это все еще не очень интересно, но по крайней мере мы видели, как мы можем отобразить HTML-страницу со встроенным кодом Ruby.

Создание макета

Синатра умный. Среди его сильных сторон — обнаружение определенных файлов автоматически. Создайте новый файл в папке представлений с именем layout.erb . Сразитесь с дизайном для вашего блога. Вы можете добавить таблицу стилей в общую папку, а затем вызвать ее, как если бы она была в корне сайта. Синатра найдет его автоматически после этого. Единственный фрагмент кода Ruby, который нам нужен для этого файла (на данный момент):

 <%= yield %> 

Везде, где вы хотите, чтобы содержание вашей страницы появлялось. Синатра автоматически обнаружит и использует файл для отображения ваших страниц. Это означает, что вам не нужно добавлять все обычные HTML-теги к вашим файлам .erb, только то, что должно быть в области содержимого вашего дизайна. Вы можете попробовать это с файлом index.erb, если хотите. Очистите все HTML-структуры страницы и перезагрузите страницу. С вашим файлом layout.erb ничего не должно измениться, за исключением того, что теперь страница будет отображаться с добавленным вашим дизайном.

Построение блога, часть 2

Теперь, когда у нас есть отсортированный макет, давайте сосредоточимся на основном коде нашего приложения. Создайте подпапку в вашем блоге / просмотрите папку с именем posts . Здесь мы будем хранить сообщения блога, написанные в Markdown. Что нам нужно сделать, это создать кликабельный список ссылок для каталога статей . Это означает, что каждый раз, когда добавляется новая статья, наш список будет обновляться автоматически.

В main.rb создайте новый метод с именем get_filespath

 def get_files(path) 

Этот метод будет использоваться для перечисления файлов в нашем каталоге сообщений . Вот метод, я объясню, что происходит в данный момент:

def get_files(path)
dir_list_array = Array.new
Find.find(path) do |f|
dir_list_array << File.basename(f, «.*») if !File.directory?(f)
end
return dir_list_array
end

view raw
get_files.rb
hosted with ❤ by GitHub

  1. Сначала мы создаем массив для хранения списка имен файлов, которые были найдены в каталоге, переданном через параметр path
  2. Затем мы используем гем Ruby Find для перебора файлов, которые он находит в нашем каталоге posts , добавляя имя файла в массив dir_list_array
  3. Убедитесь, что вы добавили: require 'find'
  4. Часть File.basename
  5. Часть if !File.directory?(f)

Этот метод сделает большую часть работы за нас. Затем измените ваш метод indexget_files

get ‘/’ do
@arr = get_files(‘./views/posts/’)
erb :index
end

view raw
index.rb
hosted with ❤ by GitHub

Теперь в index.erb мы можем создать простой цикл для итерации по файлам и составить список, по которому можно кликать:

<ul>
<% @arr.each do |page| %>
<li><a href/view/<%=page%>«><%=page %></a></li>
<% end %>
</ul>

view raw
posts_list.erb
hosted with ❤ by GitHub

Здесь вы можете видеть, что мы перебираем массив, переданный из переменной экземпляра, распечатывая имя файла и делая гиперссылку одновременно.

Перезапустите сервер и перейдите по адресу http: // localhost: 4567 в своем браузере. Конечно, вы можете ничего не видеть, если вы еще не добавили ни одного сообщения. Просто создайте пару фиктивных сообщений и сохраните их в виде файлов разметки в папке ваших сообщений . Очевидно, что нажатие на ссылку не будет работать в данный момент, мы разберемся с этим дальше.

Построение блога, часть 3

Из файла index.erb мы видим , что теперь нам нужен метод в main.rb для обработки вызовов для view Метод также должен принимать параметр, называемый link

Вот метод:

get ‘/view/:link’ do
halt 404 unless File.exist?(«views/posts/#{params[:link]}.md»)
markdown :»posts/#{params[:link]}«, :layout_engine => :erb
end

view raw
view.rb
hosted with ❤ by GitHub

Сначала убедитесь, что добавили гем rdiscount ( require 'rdiscount' Драгоценный камень представит Markdown как HTML для нас.

Обратите внимание: ссылка добавляется в маршрутный вызов. Именно так мы обозначаем параметр строки запроса, переданный из index.erb.

Теперь вы сможете нажимать на ссылки и переходить на страницу, которая отображает Markdown как HTML для каждого сообщения, сохраненного в папке ваших сообщений .

Действие halt Если это не так, мы отправляемся на страницу 404 (мы создадим пользовательскую через минуту). Во второй строке используется гем rdiscount для визуализации Markdown, найденного в переданном файле Markdown, в виде HTML. Мы указываем, что используется механизм разметки erb.

Создать кастом 404

Идея состоит в том, что если пользователь запросит файл, который не существует в нашей папке сообщений , он получит 404. Мы можем создать специальный метод Sinatra для обработки этой ситуации, который называется not_found

not_found do
erb :missing
end

view raw
404.rb
hosted with ❤ by GitHub

Здесь вы можете увидеть, что нам нужно создать missing.erb в нашей папке views . Добавьте в файл любой контент, который вы хотели бы, но, очевидно, он должен вежливо информировать пользователей о том, что файл не существует.

Как насчет добавления других страниц?

Чтобы добавить больше страниц на сайт, все, что вам нужно сделать, это создать метод в main.rb и соответствующий файл в представлениях . Вы можете даже написать дополнительные страницы, используя Markdown, используя подход, аналогичный тому, что мы уже сделали. Давайте создадим страницу «о»:

get ‘/about’ do
#if you don’t want to use Markdown for pages, do this:
#erb :»pages/about»
#Then create about.erb in views/pages
markdown :»pages/about», :layout_engine => :erb
end

view raw
about.rb
hosted with ❤ by GitHub

Создайте about.md или about.erb, а затем протестируйте страницу в браузере, перейдя по адресу: http: // localhost: 4567 / about .

Уборка ссылок

Если вы использовали схему именования файлов, типичную для сообщений в блоге, у вас, вероятно, есть список с записями, такими как «my-blog-post». Мы можем привести это в порядок, используя вспомогательный метод для удаления дефисов и использования заглавных букв в первом слове заголовка. Это повлияет только на отображаемое имя файла. В main.rb добавьте это после вызова gem:

helpers do
def formatter(page)
formatted = «»
formatted = page.gsub(/[-]/, ‘ ‘).capitalize
return formatted
end
end

view raw
helper.rb
hosted with ❤ by GitHub

Затем вы можете изменить цикл, который проходит по каталогу posts в index.erb, так:

<ul>
<% @arr.each do |page| %>
<li><a href/view/<%=page%>«><%=formatter(page) %></a></li>
<% end %>
</ul>

view raw
index.erb
hosted with ❤ by GitHub

Теперь у вас есть список, в котором отображаемое имя файла выглядит как заголовок блога. Гиперссылка будет работать, как и ожидалось. Вот заполненный файл main.rb :

require ‘sinatra’
require ‘find’
require ‘rdiscount’
def get_files(path)
dir_list_array = Array.new
Find.find(path) do |f|
dir_list_array << File.basename(f, «.*») if !File.directory?(f)
end
return dir_list_array
end
helpers do
def formatter(page)
formatted = «»
formatted = page.gsub(/[-]/, ‘ ‘).capitalize
return formatted
end
end
get ‘/’ do
@arr = get_files(‘./views/posts/’)
erb :index
end
get ‘/view/:link’ do
halt 404 unless File.exist?(«views/posts/#{params[:link]}.md»)
markdown :»posts/#{params[:link]}«, :layout_engine => :erb
end
get ‘/about’ do
#if you don’t want to use Markdown for pages, do this:
#erb :»pages/about»
#Then create about.erb in views/pages
markdown :»pages/about», :layout_engine => :erb
end
not_found do
erb :missing
end

view raw
main.rb
hosted with ❤ by GitHub

В заключение…

Исходя из PHP и работая с Синатрой, конечно, чувствует себя по-другому. Но за очень короткое время вы создали Ruby и создали приложение Sinatra, которое имеет большой потенциал. Стоит отметить, что этого можно достичь, не зная Ruby очень подробно. Работа с Sinatra помогает в процессе изучения Ruby, а также является хорошей подготовкой к освоению Ruby on Rails.