Tom has worked in PHP for 25 years. Tom has worked in PHP and GraphQL for the past 6 years. His application template, ldog.apiskeletons.dev is a vehicle for his open source library, GraphQL Type Driver for Doctrine ORM
Tom is an open source contributor and a member of the Doctrine team for the Doctrine Project.
Tom has contributed to the Laravel and Laminas frameworks.
Tom is a leading expert with Skipper and has a specialty creating Entity Relationship Diagrams with this tool. Tom has worked done much work with the Skipper team to improve that software.
Tom's first PHP application is still running at
etreedb.org. This project is
his altruistic magnum opus. Through this site, and constant work
on this site, Tom is able to practice his trade and try new
ideas in a live environment. Tom is proud to have a way to give back
to the world in a way that doesn't benefit him directly. Expressing
altruism in his life is important and this flows nicely to his open
source work.
The continuation of this site is being built at
lcdb.org.
The Live Concert Database will continue the database created at
etreedb.org but with all the niceties of modern development tools.
This site is built in Next.js and uses a GraphQL schema written
in PHP.
This narrative preamble describes Tom's work through the lens of a single project spanning 26 years that demonstrates some breadth and variety of my experience as an autodidact: etreedb.org.
1998, etree.org pioneered the distribution of bit-perfect live concert recordings over the Internet. I built the database to keep track of every live concert in circulation, and to let site users add those recordings to personalized lists. I chose PHP 3 for scripting and MYSQL for storage. Having already been a professional database developer in FoxPro, PowerBuilder, Oracle, Sybase and MSSQL, good database design came naturally. PHP and MYSQL were new, especially because PHP lacked an IDE.
Multi-user support came in December 1999 thanks to PHPLIB. Site users can submit corrections and new data freely. By June 2000 I had created tools for users to administer this data with full auditing. We now have over 300 such volunteers.
The idea of community-generated content that anyone could improve, lightly moderated, was huge. It predicted and predated Wikipedia (started 1/15/01). etreedb.org gives every user a profile and allows them to curate the content listed there. The self-publication concept of putting your list online was a forerunner of MySpace, Facebook, and similar.
Quickly, I faced numerous complications due to the popularity of the site. Hits peaked at 20M per month. PHP frameworks were still in their infancy. I started using Smarty templates and wrote custom cache handling. I wrote one of the first public PHP bootstrap files, set_env.php. Then BitTorrent was created and the etree community was the first user. archive.org volunteered its resources to store etree collected recordings.
To help manage its growth, ibiblio volunteered to host the application, and etreedb.org remains the largest site hosted by this public library.
With site stability ensured, I wanted to create a way for anyone to query the site in any way they wanted. I tried many different approaches beginning in 2011 with the integration of Zend Framework 1.
Soon I was invited to join the Zend team building Doctrine integration for Apigility featuring Hypertext Application Language. I created api.etreedb.org: an attempt to redesign the database with Zend Framework 2. The API worked but could not run the website. It was the idea of an API-driven tool that anyone could access to query etreedb data that I was after.
I wrote api-skeletons/zf-doctrine-graphql and tried using that. I joined the Doctrine open-source team. I moved from Laminas to Laravel and wrote many open-source libraries for Laravel and Doctrine. I decided what I needed was a GraphQL database on top of etreedb.org's existing database without any changes to the database structure.
I metadated and aliased the whole database with Doctrine and now feature graphql.lcdb.org, which is built from my template application ldog.apiskeletons.dev. This site completes my dreams of a resource anyone can query for any doctrine supported database using the superior libraries of Laravel, Doctrine, and GraphQL in PHP.
It is called the LDOG Stack.
Since 2017 Tom has taken all his projects through Upwork. His profile there has a many items of note:
A 100% success rate. This is a calculated field based on many factors including the feedback he receives from clients.
Expert-vetted. In order to achieve this certification Tom had to pass tests through Upwork. This puts him in the top 1% of upwork contractors.
Feedback received:
All of these quotes are listed on Tom's profile at Upwork but here are
a few highlights:
Tom brought professionalism and competency beyond what I
expected. Often pointing out issues we didn't not even know
existed in our legacy ZF2/Doctrine/MySQL systems. We will most
definitely be moving on to future projects with Tom, to
modernize our legacy solutions, as his insights and knowledge
in our stack are formidable.
WOW! All I can say is wow. Tom is a professional's
professional. He is on his game and knows his game inside and
out. I tried desperately with two other developers to solve an
issue. After two months and much $$$ with no results I found
Tom. He solved the problem in less than 3 hours. WOW! Tom is
now my goto guy. If you are reading this I highly suggest you
make him your goto guy as well. You won't be disappointed."
I can't rate Tom highly enough. He is extremely honest,
trustworthy, helpful, and provides great informed guidance and
assistance with all the projects he works on.
API Skeletons
-
github
-
upwork
This is Tom's comany's organization. He has released many open-source
projects through this organization and contines to support them, when
appropriate. This organizaiton takes on clients through Upwork where
Tom has as 100% success rate.
etreedb.org
-
github
Tom started what is now etreedb.org
in 1999. Since then he has constantly maintained this website as the
"head head" of this database of live concerts. At one time the
site received 20M hits per month and boasted over 300 volunteers.
Because people have changed the way they collect music, etreedb.org
has become less popular but it is still the canonical resource for
live concert recording information.
Doctrine Project
- github
Tom was invited to become a member of this open-source organization
and serve the project maintaining Zend and
Laminas libraries.
PHP Meetup Groups
Tom regularly attends meetups in PHP and has talked at Utah Laravel Meetup,
UPHPU Meetup, and SFPHP Meetup.
Tom has worked in PHP since 1999. During the entirety of that time he have actively programmed in PHP. Today Tom works in Laravel and has contributed to the core libraries and documentation. Tom builds databases using Skipper entity relationship diagrams for Doctrine ORM and Eloquent.
Tom was part of the team that built Apigility in Zend Framework. Tom built the Doctrine in Apigility integration as well as contributions to many other parts of the project. His role ended before Laminas was created. During the time Tom was developing Apigility, he created a dozen open-source projects around Zend and Doctrine. Immediatly after his time with Apigility ended, Tom was invited to join the Doctrine core team. Tom's work with these developers has brought a new level of programmatic excellence to his work.
In 2011 Tom created Enhantsy which was a Javascript injection engine for Etsy. The application rewrote Etsy web pages as you downloaded them to add enhancements such as one-click add to cart. This application pre-dated Apigility and was an excellent example of an API centric application.
In 2010 Tom studied the Entity-Attribute-Value database schema and tried to write an application using it. He brought this application to his employeer's largest client in 2011 and they studied it for two months. In all Tom had spent 10 months working in that rabbit hole. The client came back with a decision that "this is not something [we] want to use, ever". This expereince is why Tom doesn't program in Wordpress.
In 2007 and ending in 2008 Tom created a custom analytics application for a customer who had a $2B USD sales program. He really enjoyed this work and that was a contributing factor for how he creates applications for clients on Upwork today through API Skeletons.
From 1999 through 2007 Tom worked professionally in PHP but the language was young and no proper frameworks existed. During this time Tom was a "developer" and not an engineer or architect.
Tom's first database was on the Commodore 128. Tom next worked with dBASE IV which he converted to MS Access. He then got his first programming job using Visual FoxPro. Tom's next career move brought experience with Oracle, MSSQL, Sybase, and SQL Anywhere.
In 1999 Tom started working with MySQL. Since then Tom has also worked with PostgreSQL, Firebase, MongoDB, MariaDB, and SQLite, and others.
When developing ORM applications in PHP his unit tests use SQLite for each unit test, recreating the database from the schema for each test.
Tom has written open source libraries for auditing of Doctrine ORM installations using a different database and triggers to create the audit data. His work in database auditing began in 2007 and he has studied it ever since.
Tom has studied many approaches to schema design and he is a leading expert on Skipper. Designing ERDs is something he's done since 1997. Today Tom teaches ORM design and how to create ERDs with Skipper.
This list of projects does not contain Tom's customer's projects. These are a selection of open source and public projects of his own.
Tom's Blog
This blog is about programming and specific issues he's found while
programming. There are some articles which are not strictly
technical but most of it is discussing a specific problem. He
really likes the article on
data fixtures
because it brings together years of experience and discusses
using them in other [non-zend] frameworks.
API-Skeletons/doctrine-orm-graphql
This project joins Doctrine ORM (a data-mapper pattern ORM) to GraphQL.
Express entities as types while extending types globally or per-use.
With events covering the lifecycle of generating a type, introspection
of the processes is supported. This is a very complex library that makes
implementing GraphQL in a Doctrine ORM project simple.
etreedb.org
This project was started in 1999 and is still running today.
Every live concert in circulation is listed on this website. Bands
who allow recording of their concerts, and those concerts which
circulate in the trading commmunity, their metadata is listed here.
Beginning with Walt Whitman recorded by Thomas Edison, this music
resource is the canonical resource for sources in circulation.
With over 300 volunteers, this site runs itself day-to-day.
Live Concert Database
This is the future of etreedb.org. Thanks to an
GraphQL api-centric approach, this
project will work for years into the future to keep the etreedb
project running for decades more. It uses the exact same database as
etreedb.org but remaps the old schema in code using Doctrine metadata.
Conference or Meetup | Date | Title | Slides | Audio/Video |
---|---|---|---|---|
Utah Laravel | 2024-10-17 | The LDOG Stack | Slides | |
Utah Laravel | 2021-09-09 | Entity Relationship Diagrams in Laravel | Slides | |
Utah Angular Meetup | 2019-09-24 | Angular Directory Structure | ||
UPHPU | 2019-08-15 | Entity Relationship Diagrams for Eloquent | Slides | |
UPHPU | 2018-10-18 | GraphQL Implemented for Doctrine | Slides | |
Nomad PHP | 2018-09-20 | Build of a Modern ORM Enabled API with Apigility | Slides | |
SF PHP Meetup | 2018-08-15 | GraphQL Implemented for Doctrine | Slides | |
Utah Angular Meetup | 2018-07-31 | GraphQL and Doctrine for the Javascript Developer | Slides | |
UPHPU | 2018-04-19 | Code Smells | Slides | |
Utah JS | 2018-04-17 | Consuming Modern REST APIs | Slides | |
UPHPU | 2017-10-19 | git in the real world | ||
Zendcon | 2016-10-19 | Doctrine in Apigility | Slides | |
UPHPU | 2016-09-18 | ORM and APIs | Slides | |
SDPHP | 2016-03-15 |
Doctrine in Apigility - Designing Entity Relationships |
Slides | |
UPHPU | 2015-05-15 | Doctrine in Apigility | Slides | |
SFPHP | 2014-02-11 | Roll'n API | Video | |
Zendcon | 2012-10-23 | Enhantsy |
Doctrine in Apigility - slides
An intermediate to advanced introduction to best
practice technologies for building an API based on Doctrine using ZF2, Apigility, Doctrine 2,
and Skipper.
Designing Entity Relationships - slides
A beginner to intermediate how-to for building
best of breed databases by using canonical naming end-to-end from entity fields to database
tables. Correct naming principles for all field types are explained as well as why
canonical naming in an application eases coding and overall maintenance and development of an
application.
Doctrine QueryBuilder - slides
On the importance of building queries right in
Doctrine. Even behind DQL poor programming can result in catastrophic data leaks.
Also discusses data collection and the importance of taking in what the user gives you
and filtering on the way out.
Consuming Modern REST APIs - slides
Written for a Javascript audience, this walks
through a history of APIs building up to an understanding of the Richardson Maturity Model and
examples of consuming a Level 3 API.
Code Smells - slides
How to use phpcs for correcting and finding code smells and how to create your own company
standard.
GraphQL and Doctrine for Javascript Developers - slides
An introduction to GraphQL and how to use
filters when they are provided such as GraphQL and Doctrine.
GraphQL Implemented for Doctrine - slides
Front and and backend development with GraphQL
and detailing the implementation of Doctrine in GraphQL.
Entity Relationship Diagrams for Eloquent
-
slides
Creating an ERD for Laravel's Eloquent in Skipper
Since building crosswords on an Epson, Tom been involved in computers. Tom attended Comdex for 7 years because he didn't know what he wanted to do but Tom knew that he loved computers. When PHP 3.0 came around in 1999, Tom knew that's how he wanted to spend his career.
Tom supports mhprompt.org and has an article on their site On Being a Bipolar Programmer .