generathor-laravel
v1.0.5
Published
Use this to create Eloquent models and CRUDs
Readme
Generathor Laravel
Generathor Laravel allows you to automatically generate Eloquent models and CRUD operations based on your database structure.
Table of Contents
Installation
To begin using Generathor Laravel, install the necessary dependencies:
$ npm i -D generathor generathor-db generathor-laravel mysql2Then, create the generathor configuration file:
$ touch generathor.config.cjsThe 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-sortableNext, 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 generathorGenerating 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()
};You can optionally use the preconfigured generator with the following "shortcuts".
const { Laravel11 } = require('generathor-laravel');
const laravel = Laravel11.jetstreamEloquentModels();const { Laravel11 } = require('generathor-laravel');
const laravel = Laravel11.eloquentModels();const { Laravel11 } = require('generathor-laravel');
const laravel = Laravel11.jetstreamCrud();const { Laravel12 } = require('generathor-laravel');
const laravel = Laravel12.starterKitEloquentModels();const { Laravel12 } = require('generathor-laravel');
const laravel = Laravel12.eloquentModels();const { Laravel12 } = require('generathor-laravel');
const laravel = Laravel12.starterKitCrud();Then, run the following command:
$ npm run generathorTo 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
- @alpinejs/mask
- laravel-precognition-alpine
- sweetalert2
- @fortawesome/fontawesome-free
- axios
npm i -D alpinejs @alpinejs/collapse @alpinejs/mask laravel-precognition-alpine sweetalert2 @fortawesome/fontawesome-free axiosFile app.js must contain:
import Alpine from 'alpinejs';
import collapse from '@alpinejs/collapse';
import mask from '@alpinejs/mask';
import Precognition from 'laravel-precognition-alpine';
import Swal from 'sweetalert2';
import axios from 'axios';// Laravel 11 import this by default in bootstrap.js
window.axios = axios;
window.Alpine = Alpine;
window.Swal = Swal;
Alpine.plugin(Precognition);
Alpine.plugin(collapse);
Alpine.plugin(mask);
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 need 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 flatpickrAdd 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:
<!-- LARAVEL 11 -->
<x-generathor.loader />
<x-banner /><!-- You can use this with laravel 11 + jetstream -->
<!-- LARAVEL 12 -->
<x-generathor.loader />
<x-generathor.banner /><!-- Only needed with laravel 12 -->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>
@endifAdditional 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. |
| laravelVersion | No | 11 or 12 | 12 | Laravel application version. |
| createLaravel11UserModel | No | boolean | false | Check if a custom laravel 11 user model is required. |
| createLaravel12UserModel | No | boolean | false | Check if a custom laravel 12 user model is required. |
| 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.phproutes/generathor.phpapp/Http/Controllers/Generathor/Controller.phpapp/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.phpresources/views/components/generathor/record-input.blade.phpresources/views/components/generathor/breadcrumbs.blade.phpresources/views/components/generathor/tabs.blade.phpresources/views/components/generathor/modal.blade.phpresources/views/components/generathor/loader.blade.phpresources/views/components/generathor/icon-check-circle.blade.phpresources/views/components/generathor/icon-chevron-right.blade.phpresources/views/components/generathor/icon-computer.blade.phpresources/views/components/generathor/icon-eye.blade.phpresources/views/components/generathor/icon-funnel.blade.phpresources/views/components/generathor/icon-home.blade.phpresources/views/components/generathor/icon-pencil.blade.phpresources/views/components/generathor/icon-plus.blade.phpresources/views/components/generathor/icon-trash.blade.phpresources/views/components/generathor/icon-x-circle.blade.phpresources/views/components/generathor/icon-x.blade.phpresources/views/components/generathor/icon-chevron-down.blade.phpresources/views/components/generathor/icon-list-bullet.blade.phpresources/views/components/generathor/icon-link.blade.phpresources/views/components/generathor/icon-unlink.blade.php
TODO
- [ ] Separate inputs into components.
- [ ] Customize inputs based on prefix or specific logic.
- [ ] TBD
