Laravel modeling using a low-code approach and cloud-native technology

Oscar Nevarez
4 min readOct 27, 2021

--

Diving into the Laraboot Model buildpack

In the first draft of what eventually would be Laraboot I envisioned the idea of these code blocks acting just like lego blocks, interchangeable pieces that read, create or mutate the state of an application. A lot has changed in the codebase to support this idea but the fundamental idea remains the same. I went from shell scripts to high-level language tools back and forth until I eventually adopt cloud-native technology, and particularly Paketo buildpacks as the common ground for the Laraboot platform.

The Laraboot model buildpack is a fully configurable buildpack that scaffold PHP code for the Laravel framework using community packages and the Laraboot platform. In a nutshell, this block will read the model definition from a laraboot specification file laraboot.json and execute the necessary commands for a parametrized code generation.

Providers

I never thought I’d need to support more than one package aka provider for a specific buildpack. But now I realize it makes the most sense in the world.

Blueprint

In the beginning, I fell in love with the simplicity of the code generator Shift Blueprint so much that even created some GO helper tools to generate draft definitions.

Some of the features Shift Blueprint brings to the table are

  • Data model versioning using YML files?
  • CRUD routes and tests included?

Sign me in, right? Eventually, I noticed that although powerful this was a very much opinionated library and the coupling was increasing for the model buildpack codebase. If there were no changes it would have decided the course of the model buildpack as a whole. I decided to abstract my implementation and welcome others on board.

Larawiz

I don’t know exactly how I missed it during my initial research, maybe I wasn’t even looking. But when it came to me again I was completely fascinated. Larawiz is an easy project scaffolder for Laravel. It also uses the YAML file definition for the data model so the integration was as smooth as it could be.

Differences

Simplicity

  • Larawiz uses braindead easy syntax (quoting). No kidding! you can read the YAML file and completely understand what’s going on there.
  • The same is true for Shift Blueprint but as I mentioned before, Shift Blueprint not only generates Models but routes and controllers so the file can get a little bunky.
#blueprint
models:
Post:
title: string:400
content: longtext
published_at: nullable timestamp
author_id: id:user
#larawiz
models:
Author:
name: string
email: string
password: string
publications: hasMany
Publication:
title: string
body: longText
author: belongsTo

Usage

Using the buildpack couldn’t be easier.
Read more about it here.

1 — Install laraboot

npm i -g @laraboot-io/cli

2 — Create a laraboot application

laraboot new app --php-version=8.0.*
cd app

3 — Add buildpacks

laraboot task add @core/laravel-foundation-provider --format=file -vvv
laraboot task add @core/laravel-model-buildpack --format=file -vvv
laraboot build --pack-params default-process=task

4 — Define your data model

laraboot model add Record
√ Would you like to define your model now? (y/N) · true
√ Field name? · content
√ Field type? · varchar
√ Is this field unique? (y/N) · false
√ Is this field primary key? (y/N) · false
√ Would you like to add a new field? (y/N) · false
Model Record was added
laraboot model add Comment
√ Would you like to define your model now? (y/N) · true
√ Field name? · content
√ Field type? · varchar
√ Is this field unique? (y/N) · false
√ Is this field primary key? (y/N) · false
√ Would you like to add a new field? (y/N) · false
Model Comment was added

At this time the file laraboot.json was modified to include your data model. It will be something like this:

"models": [
{
"name": "Record",
"columns": [
{
"name": "log",
"type": "string"
}
]
},
{
"name": "Comment",
"columns": [
{
"name": "comment",
"type": "string"
}
]
}
]

You can modify the file directly if you forgot to add columns or want to make some modifications.

5 — Configure the buildpack

Now we need to tell the PHP buildpack how our app is configured. And also tell the model buildpack what provider we want to use during the build process.

Below is a minimal configuration.

#buildpack.yml
php:
# this allows you to specify a version constraint for the `php` dependency
# any valid semver constraint (e.g. 7.* and 7.4.*) are also acceptable
version: 8.0.x
# text user can specify to use PHP's built-in Web Server
# default: php-server
webserver: php-server
# directory where web app code is stored
# default: htdocs
webdirectory: public
# directory where library code is stored
# default: lib
libdirectory: lib
# Use default php script
script: index.php
# default: admin@localhost
serveradmin: admin@localhost
# default: redis-sessions
redis:
session_store_service_name: redis-sessions
# default: memcached-sessions
memcached:
session_store_service_name: memcached-sessions
### add the following
laravel-model:
# larawiz or blueprint
# provider: ~
directory: app
cleanup: true
git:
enabled: true
commit: true

Build and run

# It takes a while the first time, be patient
laraboot build && laraboot run --port=8080

Congratulations! You have bootstrapped a Laravel application, and it’s already containerized.

Conclusion

In this article, we saw how to generate PHP code for the Laravel framework using a low-code approach and cloud-native technology allowing us two choose from two different code-generator libraries. This opens the gates for future providers and makes the Laraboot platform the way to go to scaffold and maintain Laravel applications easily.

References

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Oscar Nevarez
Oscar Nevarez

Written by Oscar Nevarez

Dad, Polymath , Passionate about technology, AI Advocate, Human.

Responses (1)

Write a response