Бесплатная миграция IT-инфраструктуры в облако

Как создать и развернуть приложение на Laravel: быстрый и простой деплой с Apps

Сергей Дурманов
Сергей Дурманов
Технический писатель
11 ноября 2024 г.
26
13 минут чтения
Средний рейтинг статьи: 5

Сегодня мы рассмотрим кейс, как быстро развернуть приложения на Laravel в экосистеме Timeweb Cloud Apps. Laravel — это современный PHP-фреймворк, который значительно упрощает создание веб-приложений, предоставляя встроенные инструменты для работы с HTML-шаблонами, маршрутизацией и взаимодействием с базами данных. 

Архитектура Laravel улучшает производительность и SEO, поскольку поисковые системы могут легко индексировать страницы, а пользователи моментально получают доступ к необходимой информации за счет серверного рендеринга страниц (не нагружая клиент большим количеством JS-кода).

Рассматривать деплой приложения на Laravel мы будем на примере сайта-визитки из трех страниц, редактируемыми новостями и микро-админкой. 

Вам потребуется около 5-7 минут для деплоя подготовленного demo-сайта и еще 10 минут — для рассмотрения деталей кода. В результате вы получите:

  • Готовый сайт (с простым визуальным оформлением) + публичный URL с SSL сертификатом.
  • Научитесь быстро подключать авторизацию пользователей.
  • Научитесь делать запросы к БД.
  • Узнаете варианты использования Laravel для различных полезных бытовых кейсов, а также узнаете, какую пользу представляет данный фреймворк для IT-специалистов.

Вот так будет выглядеть ваше приложение:

Image1

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

Что нам потребуется

  • Зарегистрированный аккаунт на Github, Gitlab или Bitbucket.
  • Зарегистрированный аккаунт на платформе Timeweb Cloud.
  • Знание фреймворка Laravel (подразумевается, что вы хотя бы бегло знакомы с основами фреймворка и PHP).

Кейсы: кому будет полезна данная инструкция

  1. Web-дизайнерам одностраничных и многостраничных сайтов, которым важны SEO-оптимизация и скорость.
  2. Разработчикам корпоративных систем для быстрой разработки админок и внутренних корпоративных систем. Laravel обеспечит безопасность, так как все секреты и бизнес-логика скрыты на backend и не доступны хакерам извне.
  3. Разработчикам API-систем для быстрой разработки действующих прототипов с системой доступов по ключу или паролю, а также с системой самообновляющихся токенов.
  4. Разработчикам систем, требующим большого кол-ва однотипных endpoint для горизонтального скалирования проектов.
  5. Разработчикам ботов на основе Laravel, поскольку многие обладают очень удобными админками.
  6. Всем, кто использует в проектах webhook и различные комбинации баз данных.
  7. Студентам и школьникам для обучения работы с ORM, так как Laravel стал практически классиком и популяризатором такого подхода к работе с таблицами.

Деплой приложения на Laravel

Мы подготовили для вас приложение (сайт-визитку с админкой новостей) для демонстрации простоты деплоя Laravel-приложений на нашем сервисе Timeweb Cloud Apps. Итак, приступим.

Шаг 1: Копирование шаблона

  • Откройте в браузере страницу репозитория с шаблоном подготовленного демо-приложения и нажмите кнопку «Fork», чтобы скопировать его в свой аккаунт Github.

Image7

Сохраните репозиторий, название репозитория можете оставить таким же.

Шаг 2: Деплой приложения на Timeweb apps

Поскольку вы уже зарегистрированы в Timeweb Cloud, перейдите в панели в раздел Apps → Создать и выберите тип приложения «Laravel 8.3».

Image10

Теперь вам нужно подключить свой GitHub аккаунт, чтобы платформа могла отслеживать изменения в проекте и автоматически запускать деплой. Дополнительные настройки не требуются — просто нажмите кнопку «Подключить аккаунт» и выберите ваш репозиторий в Github.

Image9

Во время подключения вам будет предложено окно авторизации GitHub. Введите свой код авторизации и нажмите кнопку «Подтвердить».

Image15

Далее укажите репозиторий, к которому вы подключаете систему Timeweb Cloud Apps:

Image13

Также убедитесь, что переключатель установлен на «Сборка по последнему коммиту».

Вы успешно выполнили два необходимых шага. Далее прокрутите страницу вниз и установите два параметра:

  1. Добавьте команду сборки, которая запускает Seeder (добавление первоначальных данных в таблицы):

php artisan db:seed --force
  1. Установите название вашего приложения, например «Демо-сайт на Laravel8».

Image5

Теперь нажмите кнопку «Запустить деплой» и наблюдайте за процессом.

Image12

Платформа Timeweb Cloud Apps на ваших глазах соберет приложение, покажет вам весь процесс компиляции приложения и деплоя на сервер. Первая сборка займет около 5-7 минут, дальнейшие обновления занимают менее 20 секунд.

В процессе деплоя сервер разворачивает все зависимости и запускает миграции БД, однако в нашем демо-приложении миграции не включены, мы просто положили в репозиторий готовую базу sqlite3, чтобы демо сайт сразу выглядел заполненным.

Image3

Ну что же, поздравляем! Спустя несколько минут ваше приложение на Laravel успешно развернуто на сервисе Timeweb Cloud Apps, и теперь вы можете использовать его без необходимости настройки хостинга. 

Важное замечание

В своих проектах, которые вы в будущем будете выкладывать на сервис Timeweb Cloud Apps, обязательно добавляйте следующий код в файл app/Providers/AppServiceProvider.php:

public function boot()
{
  URL::forceScheme('https');
}

Это связано с тем, что при деплое платформа автоматически переводит проект на HTTPS-домен и генерирует ключи SSL. Если вы не добавите данный код в свой проект, страницы с вызовами AJAX-запросов будут работать некорректно, так как будут обращаться к HTTP-путям, и Laravel будет думать, что таких путей не существует (например, при submit форм ввода).

Как устроено приложение на Laravel

Внешний вид и функционал

Визуально ваше приложение состоит из трех блоков:

  • сайт визитка: front, который видят посетители и поисковые системы
  • админка для добавления новостей
  • авторизация для админки

Url

Описание

/

Корневая страница сайта

/about

Страница «О нас»

/contact

Страница «Контакты»

/admin/news/create

Админка, где вы можете добавлять новости, которые размещены на главной странице сайта.

Вот так выглядит шаблон сайта:

Image1

Так выглядит простая админка добавления новостей (она находится по адресу https://ваш_url/admin/news/create):

Image11

Добавление пользователя (администратора)

Наш демо-проект соблюдает безопасность, и страницы админки открываются только авторизованным пользователям со статусом is_admin=1. Своего пользователя вы можете создать следующим образом.

Откройте файл database/seeders/AdminUserSeeder.php и внесите собственные логин и пароль в методе run.

public function run()
{
	DB::table('users')->insert([
    	'name' => 'Admin 2',
    	'email' => 'admin2@example.com',
    	'password' => Hash::make('ваш_пароль'),
       'is_admin' => 1,
	]);
}

Далее в терминале запустите команду

php artisan db:seed --class=AdminUserSeeder

Теперь у вас есть новый администратор, и вы можете запушить изменения на сервер (см. инструкцию выше). В данном случае, для создания коммита у вас должны измениться два файла: AdminUserSeeder.php и database/database.sqlite.

После сохранения изменений в GitHub можете смело идти редактировать новости на свой публичный сайт.

Запуск приложения на локальном компьютере

Для локального запуска приложения и дальнейшей разработки (доработки) наберите в командной строке следующую команду: php artisan serve и откройте в браузере адрес http://127.0.01:8000/.

Исходники приложения

Структура файлов

Откройте редактор или IDE (например, VS Code или Zed) и загрузите ваш проект. Структура каталогов вашего приложения выглядит следующим образом:

Image4

Основной каталог, содержащий логику приложения, — это App. Назначение остальных каталогов, которые нас интересуют: 

  • /app — каталог, который содержит контроллеры (бизнес-логику приложения), а также модели используемых таблиц (в нашем случае это Users и News).
  • /resources — содержит стили, JS-файлы и, собственно, сами шаблоны страниц Laravel в формате Blade (это основной каталог, где вы можете редактировать визуальное представление страниц).
  • /routes/web.php — здесь прописаны пути к страницам админки и сайта, а также правила авторизации (например, страницы сайта отдаются всем, а админка только авторизованным пользователям).

Контроллеры

Далее, давайте рассмотрим директорию /app/Http/Controllers и разберем логику работы контроллеров. Для начала откройте файл SiteController.php.

Image14

Как видно из кода, он содержит методы рендеринга страниц согласно URL: /, /about и /contact, при этом главная страница открывается с передачей в нее массива новостей из таблицы News (последние пять записей с обратной сортировкой по дате). Здесь нет ничего особенного — стандартный рендеринг страниц с передачей массивов данных для шаблонов Blade. По аналогии, вы можете добавить обработку других URL из вашего проекта, загрузить для них данные и запустить рендер шаблонов.

Далее рассмотрим файл NewsController.php, который содержит логику добавления новых новостей для сайта:

Image2

Метод create просто рендерит форму для ввода новостей, а вот метод store, который вызывается при submit новой новости, сначала делает проверку, затем вызывает метод из модели News:create, который и сохраняет вашу новую запись с новостью в таблицу News, а затем выводит очищенную форму с диалогом Success.

Image6

Модель таблицы News

В Laravel модели используются для представления таблиц базы данных и взаимодействия с ними. Примером такой модели является класс News, который связывается с таблицей, содержащей новости:

class News extends Model {
	use HasFactory;

	protected $fillable = [
    	'title',  	 
    	'content',	 
    	'created_at',  
    	'updated_at',
	];
}

Описание кода

Класс News расширяет базовый класс Model, предоставляемый Laravel, чтобы получить доступ к функциональности ORM. Это позволяет легко работать с записями в базе данных, выполняя операции создания, чтения, обновления и удаления.

Массив $fillable определяет, какие поля можно массово назначать. В данном случае, это title, content, created_at и updated_at. Этот массив защищает от массового заполнения нежелательных полей, гарантируя, что только перечисленные атрибуты будут сохраняться в базу данных. 

Для тренировки вы можете убрать из кода created_at и updated_at и попробовать обновить эти поля. Вы не сможете это сделать.

Модель таблицы Users

Модель User в Laravel представляет собой класс, связанный с таблицей пользователей в базе данных, и используется для управления процессом аутентификации и авторизации.

Image8

Описание кода

Класс User находится в пространстве имен App\Models и использует несколько встроенных классов Laravel:

Класс, переменная

Назначение

Authenticatable

Базовый класс для моделей, связанных с аутентификацией.

Notifiable 

Для отправки уведомлений пользователю.

Массив $fillable

Определяет поля, которые могут быть обновляться пользователем. В данном случае это name, email, password и is_admin.

Массив $hidden

Содержит поля, которые будут скрыты при запросах от клиента. Это полезно для защиты конфиденциальных данных, таких как password и remember_token.

Массив $casts

Определяет типы данных для атрибутов. Например, email_verified_at будет автоматически преобразован в объект datetime, что упрощает работу с датами и временем.

Авторизация 

Контроллер App\Http\Controllers\Auth\AdminAuthController.php предназначен для управления процессом аутентификации администраторов, включая отображение формы входа, обработку логина и выход из системы.

Тело функции:

class AdminAuthController extends Controller
{
  public function showLoginForm()
  {
	return view('auth.admin_login');
  }

  public function login(Request $request)
  {
	// Проверка учетных данных с использованием базы данных
	$credentials = $request->only('email', 'password');

	if (Auth::attempt($credentials)) {
  	// Проверяем, является ли пользователь администратором
  	$user = Auth::user();
  	if ($user->is_admin) {
    	session(['is_admin' => true]); // Сохраняем информацию о том, что пользователь админ
    	return redirect()->route('admin.news.create')->with('success', 'Вы успешно вошли в админку!');
  	} else {
    	Auth::logout();
    	return redirect()->back()->withErrors(['email' => 'У вас нет прав администратора.']);
  	}
	}
	return redirect()->back()->withErrors(['email' => 'Неверные учетные данные.']);
  }

	public function logout()
	{
  	session()->forget('is_admin'); // Удаляем сессию
  	return redirect('/')->with('success', 'Вы вышли из админки!');
	}
}

Описание кода

Класс, переменная

Назначение

Классы Request и Auth

Используются для обработки HTTP-запросов и управления аутентификацией.

Метод showLoginForm()

Отображает форму входа для администратора. 

Рендерит представление (view) auth.admin_login, где расположена форма логина.

Метод login(Request $request)

Получает учетные данные (email и password) из запроса.

Использует метод Auth::attempt() для проверки этих данных. Если проверка успешна, система загружает данные пользователя.

Далее проверяется, является ли пользователь администратором (проверка поля is_admin).

Если is_admin равно true, в сессии сохраняется информация о том, что пользователь — администратор. Затем выполняется перенаправление на маршрут создания новостей в админке с сообщением об успешном входе.

Если is_admin равно false, пользователь выходит из системы, и выполняется возврат на форму входа с ошибкой.

Если учетные данные неверны, возвращается сообщение об ошибке.

Метод logout()

В нашем проекте не используется, приведен для примера. 

Удаляет информацию о том, что пользователь является администратором, из сессии.

Выполняет перенаправление на главную страницу с сообщением о выходе.

Шаблоны страниц

HTML (Blade)  шаблоны наших страниц находятся в папке resources/views/site. Здесь мы не будем размещать весь громоздкий код HTML, вы можете сами зайти и посмотреть в своем редакторе.

Логика шаблонов проста: мы делаем HTML-структуру, где вставляем данные в нужные места. Например, на главной страницы новости рендерятся следующим образом (файл resources/views/site/index.blade.php):

<div class="row">
  <div class="col-md-12">
	<h2 class="text-center">Новости</h2>

	@foreach($news as $item)
  	<div class="card mb-3">
    	<div class="card-body">
      	<h5 class="card-title">{{ $item->title }}</h5>
      	<p class="card-text">{{ Str::limit($item->content, 100) }}</p>
      	<span class="text-muted news-date">{{ $item->created_at->format('d.m.Y') }}</span>
    	</div>
  	</div>
	@endforeach

	@if($news->isEmpty())
  	<p class="text-center">Нет новостей для отображения.</p>
	@endif
  </div>
</div>

Из кода видно, что для рендера новостей мы запускаем цикл @foreach($news as $item, который берет данные из переменной-массива $news, полученной из контроллера, и вставляет поля в HTML-шаблон: <h5 class="card-title">{{ $item->title }}</h5>. Это достаточно стандартная логика Laravel, поэтому здесь мы не будем подробно описывать все ее механизмы.

Остальные шаблоны страниц устроены аналогично: получаем переменные из контроллера и рендерим их значения в нужных HTML-блоках.

Заключение

В этой статье мы рассмотрели, как создать простое приложение на Laravel и развернуть (задеплоить) его в публичном доступе, не прибегая к использованию собственных серверов и без необходимости покупки сложного хостинга.

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

Мы, в свою очередь, помогаем вам упростить развертывание вашего кода в интернете: здесь вы сможете получить безопасные публичные ссылки на проекты, бесплатные SSL-сертификаты и многое другое. Для быстрого старта мы рекомендуем воспользоваться Timeweb Cloud Apps — это идеальная платформа для запуска приложений.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
11 ноября 2024 г.
26
13 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев