Advertisement
  1. Code
  2. PHP

AngularJS и Laravel: начинаем создание CRM

by
Read Time:11 minsLanguages:
This post is part of a series called Building a Customer Management App Using AngularJS and Laravel.
AngularJS and Laravel: Finishing Building a CRM

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

При создании одностраничного приложения мы должны использовать какой-то фреймворк для выполнения некоторых задач для нас, чтобы мы могли сосредоточиться на фактической функциональности. AngularJS отлично здесь подходит, потому что такие функции, как динамическая инъекция зависимостей и привязка двунаправленных данных, просто великолепны. Иногда нам также нужен какой-то сервер. Если вы выбрали PHP, то Laravel может быть вашим лучшим вариантом, так как с ним легко и довольно эффективно работать.

Введение

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

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

Подготовка

Первое, что нам нужно сделать, это установить Laravel. Полный процесс подробно описан на веб-сайте Laravel. После этого вы должны создать каталог проекта со всеми файлами Laravel. Перейдите в этот каталог в командной строке и выполните там следующую команду:

Если все идет хорошо, вы должны увидеть, что локальный сервер разработки был запущен на locahost:8000. Откройте ваш браузер и перейдите туда, вы должны увидеть страницу приветствия Laravel:

first_runfirst_runfirst_run

Теперь мы можем перейти к фактическому приложению.

Миграции и модели

Модели в Laravel такие же, как и в любом другом фреймворке MVC. Он использует Eloquent ORM для облегчения работы для вас - вам, вероятно, никогда не понадобится снова писать SQL запрос (по крайней мере до тех пор пока вам не понадобится что-то такое, что Eloquent не поддерживает). Используя миграции, вы можете изменить структуру базы данных с возможностью отката изменений, если что-то пойдет не так. Вы можете больше узнать о миграциях в документации.

В нашем приложении мы будем использовать две модели:

  • Customer - будет хранить данные клиента
  • Transaction - будет содержать информацию о транзакции

Начнем с создания миграций для них. Если вы еще этого не сделали, выключите сервер, который мы запустили ранее (Ctrl + C).

Клиенты

Сначала вызовите эту команду:

Это создаст файл миграции с базовой структурой для вас. Теперь перейдите в app/database/migrations. Должен быть файл с его именем, начинающийся с метки времени и заканчивающейся «create_customers_table». Laravel автоматически создал эту базовую структуру для вас. Метод up() вызывается, когда применяется миграция, и down() при его откате.

Сначала вызовите метод Schema::create(). Он принимает два аргумента - имя схемы и функцию обратного вызова:

Обратный вызов выполняется при создании таблицы. Объект таблицы передается как переменная $table, и мы может менять ее структуру. Давайте добавим автоматически увеличивающееся поле id:

Далее для имени, фамилии и электронной почты клиента будут три строковых поля:

Мы делаем поле email уникальным, вызывая метод unique().

Последний метод предназначен для временных меток:

Это создаст два поля даты в схеме: created_at и updated_at. Они будут использоваться Eloquent для хранения времени, когда элемент был создан и обновлен.

Наконец, код должен выглядеть так:

Метод down() будет намного проще - он просто удаляет схему:

Транзакции

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

Теперь найдите соответствующий файл в app/database/migrations и откройте его. Как и раньше, начните с создания схемы:

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

И, конечно, отметки времени:

Окончательный код должен выглядеть следующим образом:

И теперь метод down():

Настройка базы данных

Теперь, прежде чем применять миграции, вам нужно будет настроить соединение с вашей базой данных. Откройте файл app/config/database.php и перейдите к строке 55. Вот данные конфигурации для MySQL (там немного других, например, вы можете использовать SQLite или Postgres):

После того, как вы заполнили это, вы можете двигаться дальше. Убедитесь, что вы сохранили файл и вызываете эту команду из основного каталога приложения (с файлом artisan в нем):

Вот и все. Если ошибок не было, это означает, что таблицы были успешно созданы. Вы можете подключиться к своей db, используя, например, phpMyAdmin, чтобы проверить все вручную.

Модели

В Laravel создание модели после того, как вы настроили свою базу данных с помощью миграции, происходит очень быстро. Перейдите в app/models и удалите пример файла User.php, который там уже есть. Теперь создайте два файла с именем Customer.php и Transaction.php.

Начнем с Customer.php. Каждая модель в Laravel должна наследоваться от класса Eloquent:

Теперь мы определим отношения между клиентом и их транзакциями. Это делается путем определения публичного метода в модели с именем свойства, которое мы хотели бы иметь в нем (в данном случае transactions):

Теперь в теле функции будет только одна строка:

Это сообщает Eloquent, что он должен предоставлять все транзакции с идентификатором клиента customer_id в рамках свойства, называемого transactions.

Теперь мы сделаем практически то же самое для транзакций, но мы изменим соотношение, чтобы сделать владельца транзакции доступным через свойство customer:

Это делается с использованием метода модели $this->belongsTo().

Контроллеры

Теперь, чтобы использовать модели, мы должны создать для них контроллеры. Перейдя к каталогу app/controllers, удалите только HomeController.php - BaseController.php важен, так как наши контроллеры расширяют его. Теперь создайте два файла: CustomerController.php и TransactionController.php.

CustomerController

Этот контроллер будет обрабатывать все, что связано с клиентами, - добавление, удаление и отображение списка из них. Начните с определения класса:

Мы будем использовать функцию Laravel под названием RESTful контроллеры. Это упрощает создание маршрутов, потому что нам нужно только определить базовый URI, и Laravel будет обрабатывать все остальное за нас. Это требует, чтобы вы начинали свои имена методов с помощью соответствующего HTTP-глагола, а затем продолжаете имя маршрута (используя camelCase). Например, если бы у нас был метод с именем getNames и базовый URI был бы /customers, тогда метод будет доступен по адресу /customers/names.

Методы getIndex(), postIndex(), deleteIndex() и т.д. будут сопоставлены с маршрутом по умолчанию (в данном случае /customers).

Теперь давайте определим наш первый маршрут - получив клиента по его id:

Давайте получим идентификатор из параметров запроса (Laravel предоставляет хороший класс Input, чтобы справиться с этим, поэтому вам не нужно использовать $_GET, $ _POST или $ _FILES):

Ищите пользователя в базе данных, используя этот идентификатор:

Каждый метод контроллера должен возвращать значение, которое является строкой, или имеет метод __toString(). В этом случае возвращаемая модель Customer будет преобразована в JSON перед отправкой.

Теперь давайте вернем список всех пользователей (это будет доступно по маршруту  /customers/all):

Как вы можете видеть, мы можем получить всех клиентов используя метод all() у модели.

Теперь самая длинная часть, добавим нового клиента:

Сначала давайте проверим, была ли предоставлена вся необходимая информация. Мы можем сделать это, используя метод Input::has():

Поместим все поля ввода в переменную $input, чтобы избежать вызова Input::get() снова и снова. Это можно сделать с помощью Input::all():

Затем мы проверим, пуст ли какой-либо из параметров. Если это так, мы вернем ошибку HTTP 400 Bad Request с более подробным сообщением:

Поскольку мы хотели вернуть код статуса, отличный от 200, вместо того, чтобы просто возвращать сообщение в виде строки, мы использовали Response::make(), который принимает данные для отправки в качестве первого параметра, а код состояния - второго. Взгляните на документы, если вы хотите узнать больше об ответах.

Теперь мы, наконец, создаем новую модель Customer и наполняем ее с предоставленными данными:

После этого мы можем сохранить вновь созданную модель и ответить на запрос с ней:

Здесь мы обрабатываем случай, если не все данные были предоставлены:

Наконец, нам также нужна способность удалять клиентов. Это действительно короткий сценарий:

Мы начинаем с получения идентификатора клиента:

Затем мы ищем и удаляем клиента:

После этого мы отвечаем на запрос с предоставленным идентификатором:

Теперь, прежде чем маршруты будут доступны, мы должны их подключить. Откройте файл app/routes.php, удалите все, кроме комментария, и добавьте эту строку в конец файла:

Это позволит Laravel направлять все запросы к /customers нашему CustomerController. Теперь вы можете использовать CURL, чтобы поиграть с ним. Сначала запустите сервер с помощью php artisan serve, а затем вы можете, например, создать клиента:

Затем вы можете получить список всех клиентов:

TransactionController

Это, подобно модели, очень похоже на CustomerController. Сначала создайте класс:

Затем давайте определим метод для получения всех транзакций для пользователя:

Как вы можете видеть, мы используем отношения, определенные ранее для получения транзакций (теперь вспомните запрос, который вы должны были написать, чтобы достичь того же, используя простые PHP и SQL).

Следующим шагом будет создание транзакций:

Как и раньше, мы проверяем, предоставлена ли вся необходимая информация:

Если это так, назначьте ее переменной $input:

Проверьте, не пусто ли какое-либо из значений, и если да, возвращаем ошибку:

Теперь создайте транзакцию и наполните ее всей предоставленной информацией:

Теперь нам нужно добавить ее к соответствующему клиенту. Давайте найдем его по предоставленному id и добавим $transaction в список его транзакций:

Это делается с помощью метода transactions->save(), предоставленного Laravel. Теперь мы можем ответить с созданной транзакцией:

И обработать случай, когда ни один или не все данные были предоставлены:

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

Теперь просто добавьте маршрут, и вы можете протестировать контроллер с помощью CURL:

Вывод

Хорошо, это конец первой части - во второй части этого урока мы создадим front-end, используя AngularJS. Не стесняйтесь добавлять дополнительные функции в свое приложение (например, редактирование клиентов или сортировку), если вы не нашли нужную информацию, поищите в документации Laravel.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.