MongoDB & Laravel

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 08:57, 18 сентября 2018.

Установка Laravel

Требования к серверу

Фреймворк Laravel предъявляет некоторые системные требования. Конечно же, виртуальная машина Laravel Homestead[1] соответствует всем этим требованиям, поэтому настоятельно рекомендуется использовать Homestead в качестве основной локальной среды разработки с Laravel.

Однако, если вы не используете Homestead, вам необходимо убедиться, что ваш сервер соответствует следующим требованиям:

  • PHP >= 5.6.4
  • Расширение PHP OpenSSL
  • Расширение PHP PDO
  • Расширение PHP Mbstring
  • Расширение PHP Tokenizer
  • Расширение PHP XML

Установка

Laravel использует Composer[2] для управления своими зависимостями, поэтому убедитесь в том, что Composer установлен на вашей машине.

С помощью установщика Laravel

Сначала скачайте установщик Laravel с помощью Composer:

composer global require "laravel/installer"

Проверьте, чтобы директория $HOME/.composer/vendor/bin (или аналогичная в зависимости от вашей ОС) находилась в переменной $PATH, что позволит вашей системе найти и выполнить команду laravel.

После установки команда laravel new создаёт свежую установку Laravel в указанной вами директории. Например, laravel new blog создаст директорию с названием blog, которая будет содержать свежую установку Laravel со всеми зависимостями:

laravel new blog

С помощью Composer Create-Project

В качестве альтернативы вы можете использовать Composer для установки Laravel с помощью команды create-project:

composer create-project --prefer-dist laravel/laravel blog

Локальный сервер разработки Если локально у вас уже установлен PHP и вы хотели бы использовать встроенный сервер для работы вашего приложения, то вы можете использовать команду Artisan[3] serve. Эта команда запустит сервер разработки по адресу http://localhost:8000:

php artisan serve

Конечно же, Homestead и Valet предоставляют наиболее надежные способы локальной разработки.

Установка MobgoDB

Добавление репозитория MongoDB

MongoDB доступен из стандартных репозиториев Ubuntu, однако, для установки самых последних версий рекомендуется использовать официальный репозиторий MongoDB. На этом шаге мы добавим этот репозиторий на наш сервер. Ubuntu проверяет подлинность пакетов путём проверки подписей GPG ключей, поэтому сначала нам необходимо импортировать ключ официального репозитория MongoDB.

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

После успешного импорта ключа вы увидите следующий вывод:

Вывод
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

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

Для этого выполните следующую команду:

$ echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

После добавления репозитория нам необходимо обновить список пакетов.

$ sudo apt-get update

Установка

Теперь мы можем установить пакеты MongoDB.

$ sudo apt-get install -y mongodb-org

Эта команда установит несколько пакетов, содержащих последнюю стабильную версию MongoDB, а также некоторые средства настройки сервера MongoDB.

Для того, чтобы запускать MongoDB в виде сервиса Ubuntu 16.04, нам необходимо создать юнит-файл описывающий этот сервис. Юнит-файлы сообщают systemd, как управлять соответствующими ресурсами. Наиболее часто встречающимся типом юнит-файла является сервис, который указывает, как запускать и останавливать тот или иной сервис. Также этот файл указывает, надо ли запускать соответствующий сервис при старте системы, а также, имеет ли сервис зависимости от другого программного обеспечения.

Мы создадим юнит-файл для управления сервисом MongoDB. Создайте файл конфигурации mongodb.service в директории /etc/systemd/system с помощью nano или любого другого текстового редактора.

$ sudo nano /etc/systemd/system/mongodb.service

Вставьте следующий текст в этот файл, сохраните и закройте его.

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target

[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf

[Install]
WantedBy=multi-user.target

Этот файл имеет простую структуру:

  • Секция Unit описание сервиса MongoDB, а также его зависимостей, которые должны быть удовлетворены до запуска сервиса. В нашем случае MongoDB требует наличия сетевого подключения для запуска, поэтому мы указали директиву network.target.
  • Секция Service описывает параметры запуска сервиса. Директива User указывает, что сервис будет запущен от имени пользователя mongodb, а директива ExecStart задаёт команду запуска сервера MongoDB.
  • Последняя секция Installсообщает systemd, когда необходимо автоматически запускать сервис. Параметр multi-user.target задаёт стандартную последовательность запуска, что означает, что сервер будет автоматически запущен в процессе загрузки.

Далее запустим только что созданный нами сервис с помощью systemctl.

$ sudo systemctl start mongodb

Последнее, что нам осталось сделать, это включить автоматический запуск MongoDB при старте системы.

$ sudo systemctl enable mongodb

Теперь сервер MongoDB настроен и запущен, и вы можете управлять им с помощью команды systemctl (например, sudo systemctl mongodb stop, sudo systemctl mongodb start).

Настройка Веб-сервера

"Красивые" URL

Apache

В Laravel есть файл public/.htaccess, который используется для отображения ссылок без указания фронт-контроллера index.php в запрашиваемом адресе. Перед началом работы Laravel с сервером Apache, убедитесь, что модуль mod_rewrite включен, он необходим для корректной обработки файла .htaccess.

Если поставляемый с Laravel файл .htaccess не работает с вашим сервером Apache, то попробуйте альтернативу:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Nginx

Если вы используете Nginx, то следующая директива в конфигурации вашего сайта направит все запросы на фронт-контроллер index.php:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

Конечно же, при использовании Homestead или Valet, функция "красивых" URL будет работать без дополнительных настроек.

Использование MongoDB в Laravel

Фреймворк Laravel, из “коробки” не поддерживает работу с указанной базой данных, а значит потребуется дополнительное расширение, благодаря которому появится возможность работы с MongoDB, используя стандартные средства фреймворка. Перейдя в директорию с установленным фреймворком, вводим в консоли:

$ composer require jenssegers/mongodb

Данная команда установит расширение для работы с MongoDB в Laravel.

Затем, в файл config/app.php, добавляем сервис провайдер, установленного расширения:

Jenssegers\Mongodb\MongodbServiceProvider::class,

Далее необходимо настроить подключение к базе данных, потому как по умолчанию используется mysql, поэтому в файл config/database.php, добавляем следующие строки кода:

'mongodb' => [
 'driver' => 'mongodb',
 'host' => env('DB_HOST', 'localhost'),
 'port' => env('DB_PORT', 27017),
 'database' => env('DB_DATABASE'),
 'username' => env('DB_USERNAME'),
 'password' => env('DB_PASSWORD'),
 'options'  => [
 'database' => 'admin' // sets the authentication database required by mongo 3
 ]
],

И наконец, в файл локальной конфигурации .env, внесем следующие изменения.

DB_CONNECTION=mongodb
DB_HOST=localhost
DB_PORT=27017
DB_DATABASE=tlaravel
#DB_USERNAME=homestead
#DB_PASSWORD=secret

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

$ php artisan migrate 

Пример: создание REST API для блога

Создание модели

Создадим модель Article и применим к ней миграции.

$ php artisan make:model Article -m

После выполнения данной команды, в папке app вашего проекта появится файл Article.php, содержащий модель статьи блога.

<?php

namespace App;

use Jenssegers\Mongodb\Eloquent\Model as Model;

class Article extends Model
{
    // Some code here..
}

Также, в папке database/migration появился файл миграции для модели Article

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments("id");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists("articles");
    }
}

Подробнее разберем файл миграции:

  • up() и down() — методы будут выполняться при миграции и ее откате;
  • $table->increments('id') установит автоинкремент для поля id;
  • $table->timestamps() установит timestamps для полей — created_at и updated_at, и можно не беспокоиться о дефолтных значениях, Laravel их внесет по мере необходимости.
  • И наконец, Schema::dropIfExists() удалит таблицу, если такая существует.

На основе вышесказанного давайте добавим в метод up() следующие строки:

$table->string("title");
$table->text("body");

string() метод создаст VARCHAR столбец, а text() создаст TEXT.

После этого выполним миграцию нашей модели:

$ php artisan migrate

Вернемся к нашей модели и добавим атрибуты $fillable чтобы мы могли их использовать в методах Article::create and Article::update нашей модели:

<?php

namespace App;

use Jenssegers\Mongodb\Eloquent\Model as Model;

class Article extends Model
{
    protected $fillable = ["title", "body"];
}

Маршруты и контроллеры

Так как мы создаем api для блога, нам необходимо поддерживать следующие операции:

  • Создание статьи
  • Получение статьи по уникальному идентификатору
  • Удаление статьи
  • Обновление статьи
  • Получение списка всех статей

Для каждого типа операции используется свой метод HTTP-запроса, который мы будем обрабатывать в контроллере. Создадим контроллер ArticleController в папке app/Http/Controllers и напишем следующий код:

<?php

namespace App\Http\Controllers;

use App\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    public function list() {
        return Article::all();
    }
    
    public function byID($id) {
        return Article::find($id);
    } 
    
    public function create(Request $request) {
        return Article::create($request->all());    
    }
    
    public function delete($id) {
        $this->byID($id)->delete();
        return 204;
    }
    
    public function update(Request $request) {
        $article = Article::findOrFail($id);
        $article->update($request->all());
        return $article;
    }
}

Теперь, необходимо связать запрашиваемые URL с соответствующими методами контроллера (файл routes/api.php):

<?php

Route::get("articles", "ArticleController@list");
Route::get("articles/{id}", "ArticleController@byID");
Route::post("article/create", "ArticleController@create");
Route::put("article/update/{id}", "ArticleController@update");
Route::delete("article/delete/{id}", "ArticleController@delete");

Видео инструкция

Примечания

Ссылки/Литература

  • Официальный сайт фреймворка Laravel // laravel.com : сайт. URL: https://laravel.com/ (дата обращения 05.05.2018).
  • Официальный сайт MongoDB // mongodb.com : сайт. URL: https://www.mongodb.com/ (дата обращения 05.05.2018).
  • Репозиторий расширения MongoDB для Laravel на github // jenssegers/mongodb URL: https://github.com/jenssegers/laravel-mongodb (дата обращения 06.05.2018).