generathor-laravel

Use this to create Eloquent models and CRUDs


License
MIT
Install
npm install generathor-laravel@1.0.0

Documentation

Generathor Logo

NPM Version Downloads License

Generathor Laravel

Generathor Laravel allows you to automatically generate Eloquent models and CRUD operations based on your database structure.


Table of Contents

  1. Installation
  2. Generating Files
    1. Generating Eloquent Models
    2. Generating Eloquent Models and CRUDs
  3. Additional Settings
  4. Files
  5. TODO

Installation

To begin using Generathor Laravel, install the necessary dependencies:

$ npm i -D generathor generathor-db generathor-laravel mysql2

Then, create the generathor configuration file:

$ touch generathor.config.cjs

The content of the configuration file will depend on what you want to generate.

Add the following script to your package.json:

"scripts": {
  "generathor": "generathor -c generathor.config.cjs"
}

Generating Files

Whether you need to generate Eloquent models or CRUDs, you must install the PHP dependencies by running the following command:

$ composer require tucker-eric/eloquentfilter kyslik/column-sortable

Next, follow one of the steps below.


Generating Eloquent Models

Your generathor.config.cjs file should look like this:

const { Source } = require('generathor-db');
const { LaravelGenerator } = require('generathor-laravel');

const laravel = new LaravelGenerator({
  createEloquentModelsOnly: true
});
const dbSource = new Source({
  type: 'mysql',
  configuration: {
    host: 'localhost',
    port: '3306',
    user: 'my_user',
    password: 'my_password',
    database: 'my_database'
  },
  excludes: ['migrations']
}, [
  laravel.transformer.bind(laravel)
]);

module.exports = {
  sources: {
    db: dbSource,
  },
  generators: laravel.generators()
};

Then, run the following command:

$ npm run generathor

Generating Eloquent Models and CRUDs

Your generathor.config.cjs file should look like this:

const { Source } = require('generathor-db');
const { LaravelGenerator } = require('generathor-laravel');

const laravel = new LaravelGenerator();
const dbSource = new Source({
  type: 'mysql',
  configuration: {
    host: 'localhost',
    port: '3306',
    user: 'my_user',
    password: 'my_password',
    database: 'my_database'
  },
  excludes: ['migrations']
}, [
  laravel.transformer.bind(laravel)
]);

module.exports = {
  sources: {
    db: dbSource,
  },
  generators: laravel.generators()
};

Then, run the following command:

$ npm run generathor

To make everything work, it's necessary to set up other things in your project:

Installing frontend dependencies

You need to install TailwindCSS: https://tailwindcss.com/docs/guides/laravel

Also, you need to install the following packages:

  • alpinejs
  • @alpinejs/collapse
  • laravel-precognition-alpine
  • sweetalert2
  • @fortawesome/fontawesome-free
npm i -D alpinejs @alpinejs/collapse laravel-precognition-alpine sweetalert2 @fortawesome/fontawesome-free

File app.js must contain:

import Alpine from 'alpinejs';
import collapse from '@alpinejs/collapse'
import Precognition from 'laravel-precognition-alpine';
import Swal from 'sweetalert2';

window.Alpine = Alpine;
window.Swal = Swal;

Alpine.plugin(Precognition);
Alpine.plugin(collapse);
Alpine.start();

File app.css must contain:

@import "@fortawesome/fontawesome-free/css/all.css";

Expose the routes

Add generatehor routes to routes/web.php:

Route::prefix('manage')->group(function () {
    require __DIR__.'/generathor.php';
});

Set up your 'home' route

You neet to set up your home route. You can change the home route reference in the generathor.config.cjs file.

Route::get('/', function () {
    return view('welcome');
})->name('home');

Set up datepickers (optional)

Install the following package:

npm i -D flatpickr

Add the following code to app.js:

import flatpickr from 'flatpickr';

flatpickr('.input-datetime', {
  enableTime: true,
  enableSeconds: true,
  dateFormat: 'Y-m-d H:i:S',
});
flatpickr('.input-date', {
  dateFormat: 'Y-m-d',
});
flatpickr('.input-time', {
  noCalendar: true,
  enableTime: true,
  enableSeconds: true,
  dateFormat: 'H:i:S',
});

Add the following code to app.css:

@import "flatpickr/dist/flatpickr.css";

Set up loading spinner (optional)

Add the following code to app.js:

const loader = document.getElementById('generathor-loader');
window.showLoading = () => {
  if (loader) {
    loader.classList.remove('hidden');
    loader.classList.add('flex');
  }
};
window.hideLoading = () => {
  if (loader) {
    loader.classList.remove('flex');
    loader.classList.add('hidden');
  }
};

const forms = document.getElementsByTagName('form');
for (const form of forms) {
  form.addEventListener('submit', window.showLoading);
}

// Only for Livewire
if (typeof Livewire !== undefined) {
  Livewire.hook('commit', ({ succeed, fail }) => {
    succeed(() => {
      window.hideLoading();
    });
    fail(() => {
      window.hideLoading();
    });
  });
}

Add the following code in layout.blade.php or in your layout:

<x-generathor.loader />

Set up header (optional)

You can define a header in your layout. For example, in layout.blade.php or in your layout:

@if(isset($header))
<div>
    {{$header}}
</div>
@endif

Additional settings

You can modify settings in the generathor.config.cjs file.

Variable Required Type Default Description
createChildModel No boolean true Prevents overwriting the child class of a model, so you retain your custom changes.
createEloquentModelsOnly No boolean false Creates only Eloquent models, skipping the generation of other files.
reference No string 'laravel-generathor' Reference name used in templates.
source No string 'db' Reference to the Generathor source for database structure.
directory No string '.' Directory path for the Laravel project.
homeRoute No string 'home' Initial base route, used for redirection to the home page.
layout No string 'layout' Main layout of your project.
eloquent No object Object for defining parent classes for models.
eloquent.parent No string 'Illuminate\Database\Eloquent\Model' General parent class for models.
eloquent.customParents No Record<string, string> {} Parent class by table, allowing custom parent classes for specific tables.

Example

const { Source } = require('generathor-db');
const { LaravelGenerator }= require('generathor-laravel-testing');

const laravel = new LaravelGenerator({
  ccreateChildModel: true,
  createEloquentModelsOnly: false,
  reference: 'laravel',
  source: 'db2',
  directory: './project',
  homeRoute: 'index',
  layout: 'app',
  eloquent: {
    parent: 'App\\Models\\Model',
    customParents: {
      users: 'App\\Models\\Jetstream\\User as Model',
    }
  }
});
const dbSource = new Source({
  type: 'mysql',
  configuration: {
    host: 'localhost',
    port: '3306',
    user: 'my_user',
    password: 'my_password',
    database: 'my_database'
  },
  excludes: ['migrations']
}, [
  laravel.transformer.bind(laravel)
]);

module.exports = {
  sources: {
    db: dbSource,
  },
  generators: laravel.generators()
};

Files

  • app/Models/Generathor/[model].php (for each table)
  • app/Models/[model].php (for each table)
  • app/ModelFilters/[filter].php (for each table)
  • app/Http/Requests/Generathor/[create-request].php (for each table)
  • app/Http/Requests/Generathor/[update-request].php (for each table)
  • app/Http/Requests/Generathor/[filter-request].php (for each table)
  • app/Http/Requests/Generathor/[attach-request].php (for each 'has-many' relationship in each table)
  • resources/views/generathor/menu.blade.php
  • routes/generathor.php
  • app/Http/Controllers/Generathor/Controller.php
  • app/Http/Controllers/Generathor/[controller].php (for each table)
  • resources/views/generathor/[table-context]/index.blade.php (for each table)
  • resources/views/generathor/[table-context]/edit.blade.php (for each table)
  • resources/views/generathor/[table-context]/show.blade.php (for each table)
  • resources/views/generathor/[table-context]/[relation].blade.php (for each relationship in each table)
  • resources/views/components/generathor/[table-context]/create-form.blade.php (for each table)
  • resources/views/components/generathor/[table-context]/filter-form.blade.php (for each table)
  • resources/views/components/generathor/[table-context]/update-form.blade.php (for each table)
  • resources/views/components/generathor/[table-context]/[attach-form].blade.php (for each 'has-many' relationship in each table)
  • resources/views/components/generathor/[table-context]/[create-form].blade.php (for each relationship in each table)
  • resources/views/components/generathor/[table-context]/[filter-form].blade.php (for each 'has-many' relationship in each table)
  • app/Models/Generathor/GenerathorKey.php
  • resources/views/components/generathor/record-input.blade.php
  • resources/views/components/generathor/breadcrumbs.blade.php
  • resources/views/components/generathor/tabs.blade.php
  • resources/views/components/generathor/modal.blade.php
  • resources/views/components/generathor/loader.blade.php
  • resources/views/components/generathor/icon-check-circle.blade.php
  • resources/views/components/generathor/icon-chevron-right.blade.php
  • resources/views/components/generathor/icon-computer.blade.php
  • resources/views/components/generathor/icon-eye.blade.php
  • resources/views/components/generathor/icon-funnel.blade.php
  • resources/views/components/generathor/icon-home.blade.php
  • resources/views/components/generathor/icon-pencil.blade.php
  • resources/views/components/generathor/icon-plus.blade.php
  • resources/views/components/generathor/icon-trash.blade.php
  • resources/views/components/generathor/icon-x-circle.blade.php
  • resources/views/components/generathor/icon-x.blade.php
  • resources/views/components/generathor/icon-chevron-down.blade.php
  • resources/views/components/generathor/icon-list-bullet.blade.php
  • resources/views/components/generathor/icon-link.blade.php
  • resources/views/components/generathor/icon-unlink.blade.php

TODO

  • Separate inputs into components.
  • Customize inputs based on prefix or specific logic.
  • TBD