Blog / Tech / App Development

How to Build a RESTful API in PHP (with Laravel)

  • Rating — 5 (13 votes)
  • by Ksenija Kolomiiets
  • Updated on August 26, 2020
  • Read —
    4-5 minutes

PHP has long been one of the most popular programming languages ​​, as it makes it easy to maintain and build a rich web application. Most of the interactive and dynamic websites we see today need a set of tools to create and consume APIs.

Today, a useful API helps in content development and improves user experience and helps achieve business goals. This language is used by many developers and the software that has recently been the most successful in deploying web applications.

If you’ve ever experienced software development before, you will probably be familiar with RESTful APIs and how useful they can be. For more details, we suggest that you familiarize yourself with our article.

Let’s overview of the process of building a PHP RESTful API with Laravel.

Requirements

Here are technologies that we use to build API:

  • PHP. We have chosen PHP as the programming language for API development. There are several ways to work with PHP, but we’ll use Docker to run our services.
  • Composer. It is an application-level package manager for the PHP programming language that allows you to declare the libraries your project depends on and manage (install/update) them for you.
  • Laravel
  • Docker

Let’s download and install Composer. 

Install

Since the Composer installation is completed, we can install Laravel by running the first one command:

composer create-project laravel/laravel your-project-name 4.2.0

After this command, the Composer should download and install Laravel and the necessary dependencies, creating a project with which we will work in the future. You can read more about the installation here.

Once downloading and installing are finished, you can test the installation using the following command:

php artisan serve --port=8080

Docker

Docker is used to running services in a containerized environment. It takes over the functions of installing the necessary software so that you can focus on coding. The Docker container is useful for running APIs and testing locally on your machine. You can find out how to install Docker on your computer here.

Docker containers are present throughout the software development cycle, and their primary use is in deployment.

Since the Docker installation is complete, you can start building the PHP service.

The first place to start is creating a “Dockerfile.” Our actions will be as follows:
step #1  is to point which the docker container to build from

FROM php:7.0.28-apache

step #2 To install all the system dependencies and enable PHP modules

RUN apt-get update && apt-get install -y
 libicu-dev
 libpq-dev
 libpng-dev
 libmcrypt-dev
 mysql-client
 git
 zip
 unzip
 && rm -r /var/lib/apt/lists/*
 && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd
 && docker-php-ext-install
 intl
 mbstring
 mcrypt
 pcntl
 pdo_mysql
 pdo_pgsql
 pgsql
 zip
 gd
 opcache

step #3 To install composer

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer

step #4 To set our application folder as an environment variable

ENV APP_HOME /var/www/html

step #5 Change uid and gid of apache to docker user uid/gid

RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

step #6 Enable apache module rewrite

RUN a2enmod rewrite
RUN a2enmod ssl
RUN a2enmod headers

step #7 Set up apache configs and document root

ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

step #8 Define the command: mod_rewrite for URL rewrite and mod_headers for .htaccess extra headers like Access-Control-Allow-Origin-

RUN a2enmod rewrite headers

step #9 Now we need to copy source files and run composer

COPY . $APP_HOME

step #10 Install all PHP dependencies

RUN composer install --no-interaction

step #11 Change ownership of our applications

RUN chown -R www-data:www-data $APP_HOME

We can configure our application services in a docker-compose.yml file and define the API and a database.

version: "3"
services:

  laravel:
    build: .
    ports:
      - "8080:80"
    env_file:
      - .env
    volumes:
      - .:/var/www/html:cached
    depends_on:
      - laravel-db

  laravel-db:
    image: mysql:5.6
    ports:
      - "3306:3306"
    env_file:
      - .env
    volumes:
      - laravel-db:/var/lib/mysql

volumes:
  laravel-db:

The docker-compose.yml file provides two services.

  • laravel – This will define our PHP Laravel service. It will contain a volume of our code, and ports to access an API through the browser.
  • laravel-db – This will define the MySQL service to store our data.

It references a .env file, which is used as an environment. Now we are going to create a .env file to store our environment variables.

WEBROOT=/var/www
WEBROOT_PUBLIC=/var/www/public

COMPOSER_DIRECTORY=/var/www
COMPOSER_UPDATE_ON_BUILD=0

LARAVEL_APP=0
RUN_LARAVEL_SCHEDULER=0
RUN_LARAVEL_MIGRATIONS_ON_BUILD=0
PRODUCTION=0
PHP_VERSION=7.2
ALPINE_VERSION=3.7

COMPOSER_HASH=544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061

NGINX_HTTP_PORT=80
NGINX_HTTPS_PORT=443
PHP_MEMORY_LIMIT=128M
PHP_POST_MAX_SIZE=50M
PHP_UPLOAD_MAX_FILESIZE=10M

MYSQL_HOST=laravel-db
MYSQL_ROOT_USER=root
MYSQL_ROOT_PASSWORD=laravel
MYSQL_DATABASE=laravel
MYSQL_USER=laravel
MYSQL_PASSWORD=laravel
MYSQL_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=laravel
DB_HOST=laravel-db

Docker Compose

Now it is possible to call the services locally for viewing API. Here are some docker-compose commands.

docker-compose up

If we made everything right, there would be possible to go to https://localhost:8080, where the Laravel home page will be shown.

Planning the API

We want to create feature-rich APIs to make our services demand.
Let’s take an example with the URL https://www.photoalbum.com, but you can name your domain whatever you want.
Our first step will be to define photo API:

  • GET https://www.photoalbum.com/photo/1 – to get the photo with an id 1
  • POST https://www.photoalbum.com/photo – to create the photo
  • PUT https://www.photoalbum.com/photo/1 – to update the photo with an id 1
  • DELETE https://www.photoalbum.com/photo/1 – to delete it

Every picture should have:

  • id
  • URL
  • name
  • created date
  • updated date

Laravel usage will allow us to define a resource controller.

A tool like Docker allows you to isolate a specific environment. And now, through the docker container, using Laravel commands, let’s create API functions:

docker-compose run --rm laravel /bin/bash

Then create a photos table with the command

php artisan migrate:make create_photos_table

With the second command, we made a database migration called Photos
Check the app / database / migrations section. During the migration, the PHP code will also run, and the database table will be created. Thus, our photos will be stored in the database and, if necessary, transferred to Laravel.

Now we need to add a photo URL and name to the migration.

increments('id');
      $table->string('url')->unique();
      $table->string('name');
      $table->timestamps();
    });
  }

  /**
   * Reverse the migrations.
   *
   * @return void
   */
  public function down()
  {
    Schema::drop('photos');
  }

}

To start the migration we will use the next command.

php artisan migrate

Laravel Controller

Let’s create a Laravel Controller to define all endpoints.

php artisan controller:make PhotoController

After this we have to add our routes to the app/routes.php file:

Route::resource('photo', 'PhotoController');

It’s time to define our PhotoController:

class Photo extends Eloquent {

/**
 * The database table used by the model.
 *
 * @var string
 */
 protected $table = 'photos';

/**
 * The attributes excluded from the model's JSON form.
 *
 * @var array
 */
 protected $hidden = array('');
 }

Make sure you add these techniques methods to the PhotoController class.

Getting a list of Photos

In the beginning, we need to define the index by doing this we get a list of photos.

/**
   * Display all photos.
   *
   * @return Response
   */
  public function index()
  {
    $photos = Photo::all();
    return $photos;
  }

Creating a photo

This will store our photo in the database and return in JSON our newly created id and photo record. We get user input by calling the Input::get method.

/**
   * Store a newly created photo.
   *
   * @return Response
   */
  public function store()
  {
    $photo = new Photo;
    $photo->url = Input::get('url');;
    $photo->name = Input::get('name');;
    $photo->save();
    return $photo;
  }

Updating a photo

Using the ID, we can find the photo in the database. Next, if necessary, change the URL and name entered by the user, and the record will be saved and returned to the user as a JSON object.

/**
   * Update the photo.
   *
   * @param  int  $id
   * @return Response
   */
  public function update($id)
  {
    $photo = Photo::find($id);
    $photo->url = Input::get('url');;
    $photo->name = Input::get('name');;
    $photo->save();
    return $photo;
  }

Deleting a photo

Using the ID also we can remove a photo from the database.

/**
   * Remove the photo
   *
   * @param  int  $id
   * @return Response
   */
  public function destroy($id)
  {
    $photo = Photo::find($id);
    $photo->delete();
  }

Conclusion

In this article, we learned how to install Composer, Laravel, Docker, and use containers to build our Laravel API. To create a Laravel application and databases, we used Docker Compose, which gives us the ability to store data in the database. And also, the Photo Controller was created, which allows you to create APIs in Laravel.

Use the Laravel Passport, it has a mechanism to generate access tokens to work with API https://laravel.com/docs/7.x/passport
You should use Laravel Resources: https://laravel.com/docs/7.x/eloquent-resources
Laravel supports ::paginate - method for all the records so you can simple output Photo::paginate(20) to get paginated list
Ksenija Kolomiiets Expert & Evangelist in business optimization tools like fintech, logistics, on-demand services apps who will help you to understand the core ideas of the outlined themes by my articles. I also have great expertise in social media and education platforms so let me know "in comments" if you want me to describe a theme you're interested in.

Leave a comment
Close

Leave a Reply

Related services

Categories

All articles Business Company News Marketing Tips Our Awards StartUp App Ideas Tech Tech News Review UI and Design
GBKSOFT Team
A-mazed to meet you!
We are GBKSOFT software company.
Thanks a lot for reading your blog
Since 2011 we create ambitious software projects from scratch.

You've got
a project in mind

What's next?

Send us a message with a brief description of your project.
Our expert team will review it and get back to you within one business day with free consultation and next steps.

Testimonials

Nothing can be better than getting a review from our happy clients
who recommend us and trust us their business.

Dave
GBKSOFT’s performance has been very strong. We've referred them twice, which says all anyone needs to know about them. A referral is the ultimate signal we can give that these guys are great. Strong
Andy
I think they do great work. I haven’t yet given them something that they were unable to do. Great
Garrett
They proved to be very good and they’re very reliable as well. They are quite conscientious. They will go the extra yard to make sure we're happy. Reliable
Devan
They write clean code, adhere to deadlines, and communicate extremely well. I strongly recommend anyone from the GBKSOFT agency and hope to work with them again myself. Clean Code
Tao
GBKSOFT did a good job to manage the project. They put in a good effort to communicate with us and make it easier for us to communicate with developers. Good Job
Raphael
My Project with GBKSOFT gave me the ability to develop my software while keeping a busy schedule. Ana, who was my project manager, was very professional and was always understanding of my vision and what I wanted. I would recommend GBKSOFT again to any other company or person who has a vision for their web application. Thank you GBKSOFT! Recommend
Gireesh, USA
One word...EXCELLENT.
Very well thought out and articulate communication. Clear milestones, deadlines and fast work.Patience. Infinite patience. No shortcuts. Even if the client is being careless (me). The best part...always solving problems with great original ideas, especially with this strange project where we are making up new words every day!
Excellent
Aaron
I’ve been using GBK Soft for the past 3 years and they have been great. Communication is unparalleled to other app development companies. I’ve continued to return to them to improve my iOS app countless times and I will continue to do so in the future. I highly recommend this company! Improve
Jonathan
More good work from team GBKSOFT. All well executed. The support within GBKSOFT is excellent. Communication is good too, spoken English as well as written. Support
19
spinner