PHPackages                             jzpeepz/dynamo - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Admin Panels](/categories/admin)
4. /
5. jzpeepz/dynamo

ActiveLibrary[Admin Panels](/categories/admin)

jzpeepz/dynamo
==============

Quickly build admins for your existing Laravel application using real database tables

1.4.28(4y ago)11.7k[2 PRs](https://github.com/jzpeepz/dynamo/pulls)1MIT

Since Aug 29Compare

[ Source](https://github.com/jzpeepz/dynamo)[ Packagist](https://packagist.org/packages/jzpeepz/dynamo)[ RSS](/packages/jzpeepz-dynamo/feed)WikiDiscussions Synced today

READMEChangelogDependencies (3)Versions (156)Used By (1)

Installation
------------

[](#installation)

Install via Composer:

`composer require jzpeepz/dynamo`

Include the service provider in your `config/app.php`:

`Jzpeepz\Dynamo\DynamoServiceProvider::class`

Publish the Dynamo config file:

`php artisan vendor:publish --tag=dynamo`

NOTE: If using a local disk for uploading, be sure to symlink it to your public directory and provide the proper path in the config file.

Configuration
-------------

[](#configuration)

`storage_disk` Storage disk to use to store uploaded files. Default: 'local'

`upload_path` Path within the storage disk to store the uploaded files. This is also the directory within the public directory to which the storage directory is linked. Default: '/uploads/'

`route_prefix` Prefix to add to all Dynamo routes. Default: '' (empty string)

`layout` Layout to use with Dynamo views. Default: 'layouts.app'

`controller_namespace` Namespace for generated controllers. Default: 'App\\Http\\Controllers'

`controller_path` Path for storing generated controllers. Default: app\_path('/Http/Controllers')

`view_prefix` Prefix for overridden views. Default: 'dynamo'

`view_theme` Theme used for views. Default: 'bootstrap4'

`target_blade_section` The blade section in templates where views are rendered. Default: 'content'

`default_has_many_class` CSS class used by default on hasMany field types. Default: ''

`model_uses` This value contains an array of the classes that should be imported into the generated model class. Default: \[\]

`model_implements` This value contains an array of the interfaces that should be implemented by the generated model class. Default: \[\]

`model_traits` This value contains an array of the traits that should be used by the generated model class. Default: \[\]

Usage
-----

[](#usage)

### Generating your first admin

[](#generating-your-first-admin)

The following command will create a controller, model, migration, and route for your admin:

`php artisan make:dynamo Employee`

Need to opt out of some of the Dynamo magic?

`php artisan make:dynamo Employee --migration=no --model=no --controller=no --route=no`

### Customizing the admin

[](#customizing-the-admin)

Admin customization happens in your controller inside the `getDynamo()` function. This function returns a Dynamo instance which has lots of chainable methods that customize your Dynamo admin. Below are methods you can chain.

Customizing the index
---------------------

[](#customizing-the-index)

By default, Dynamo will add all fields from the database table to the index. Removing the call to `auto()` in the `getDynamo()` method in the generated controller, will stop all fields from getting added to the index AND the form.

### Adding index columns

[](#adding-index-columns)

**addIndex($key, $label = null, $formatCallable = null)**

This method allows you to add or update an index column.

**Parameters:**

`$key` This is the column name in your database table if you are hoping to populate it with table data. Otherwise, it could be any unique name.

`$label` (optional) This is pretty name you want folks to see.

`$formatCallable` (optional) This is a closure that allows you to completely customize how the index column renders. This closure will receive one parameter of the Eloquent instance for that row. The closure should return what you would like to render in the index column.

### Removing index columns

[](#removing-index-columns)

**removeIndex($key)**

This method allow you to remove a column from the index.

**Parameters:**

`$key` This is the key used to create the index. It is typical the column name in the database table.

### Removing all index columns

[](#removing-all-index-columns)

**clearIndexes()**

This method removes all index columns. This can be used to clear indexes create by `auto()` while leaving the form fields in place.

### Sorting index rows

[](#sorting-index-rows)

**indexOrderBy($column, $sort = 'asc')**

This method allows you to order the rows returned from the database.

### Paginate the index rows

[](#paginate-the-index-rows)

**paginate($limit)**

This method allows you to set the number of rows to display on each page of the index.

### Create tabs on the index

[](#create-tabs-on-the-index)

### Add search to the index

[](#add-search-to-the-index)

### Add filters to the index

[](#add-filters-to-the-index)

### Hide the delete button on each row

[](#hide-the-delete-button-on-each-row)

### Hide the add button

[](#hide-the-add-button)

### Add buttons to the index

[](#add-buttons-to-the-index)

### Add action buttons to the index

[](#add-action-buttons-to-the-index)

Customizing the form
--------------------

[](#customizing-the-form)

### Add a form field

[](#add-a-form-field)

### Remove a form field

[](#remove-a-form-field)

### Creating form groups

[](#creating-form-groups)

```
return Dynamo::make(\App\Employee::class)
		->group(FieldGroup::make('groupName')
		    ->text('fieldName')
			->text('fieldName');
		});

```

### Creating form tabs

[](#creating-form-tabs)

### Add a custom handler for a field

[](#add-a-custom-handler-for-a-field)

Extending Dynamo
----------------

[](#extending-dynamo)

### Creating custom fields

[](#creating-custom-fields)

### Creating handlers to custom fields

[](#creating-handlers-to-custom-fields)

Advanced Dynamo
---------------

[](#advanced-dynamo)

### Creating many to many relationships between dynamo models

[](#creating-many-to-many-relationships-between-dynamo-models)

**Step 1: Generate the two models you will be using.**

```
php artisan make:dynamo Faq
php artisan make:dynamo Category

```

**Step 2: Complete the needed migrations.**

Example Faq migration:

```
Schema::create('faqs', function (Blueprint $table) {
	$table->increments('id');
	$table->string('question', 255);
	$table->mediumText('answer');
	$table->timestamps();
});

```

Example Category migration:

```
Schema::create('categories', function (Blueprint $table) {
	$table->increments('id');
	$table->string('name');
	$table->timestamps();
});

```

Example pivot table migration:

```
Schema::create('category_faq', function(Blueprint $table)
{
	$table->integer('faq_id')->unsigned()->nullable();
	$table->foreign('faq_id')->references('id')->on('faqs');

	$table->integer('category_id')->unsigned()->nullable();
	$table->foreign('category_id')->references('id')->on('categories');
});

```

Run `php artisan migrate`.

**Step 3: Add the proper belongsToMany Eloquent function to each model.**

For the Category model:

```
public function faqs()
{
	return $this->belongsToMany('App\Faq');
}

```

For the Faq Model:

```
public function categories()
{
	return $this->belongsToMany('App\Category');
}

```

**Step 4: Chain the `hasMany()` method onto your Dynamo instance in both controllers. Make sure your key is the name of the Eloquent function from you model.**

```
return Dynamo::make(\App\Employee::class)
			->hasMany('categories', ['options' => [$categories]]);

```

Check out our more detailed Documentation
-----------------------------------------

[](#check-out-our-more-detailed-documentation)

License
-------

[](#license)

Dynamo is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT).

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity17

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity81

Battle-tested with a long release history

 Bus Factor1

Top contributor holds 53.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~13 days

Recently: every ~91 days

Total

148

Last Release

1662d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/14534?v=4)[Jonathan Peoples](/maintainers/jzpeepz)[@jzpeepz](https://github.com/jzpeepz)

---

Top Contributors

[![clwilliams8](https://avatars.githubusercontent.com/u/18493381?v=4)](https://github.com/clwilliams8 "clwilliams8 (86 commits)")[![jzpeepz](https://avatars.githubusercontent.com/u/14534?v=4)](https://github.com/jzpeepz "jzpeepz (75 commits)")

### Embed Badge

![Health badge](/badges/jzpeepz-dynamo/health.svg)

```
[![Health](https://phpackages.com/badges/jzpeepz-dynamo/health.svg)](https://phpackages.com/packages/jzpeepz-dynamo)
```

###  Alternatives

[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k17.5M378](/packages/easycorp-easyadmin-bundle)[backpack/crud

Quickly build admin interfaces using Laravel, Bootstrap and JavaScript.

3.4k3.6M217](/packages/backpack-crud)[venturedrake/laravel-crm

A free open source CRM built as a package for laravel projects

42010.0k](/packages/venturedrake-laravel-crm)[2lenet/crudit-bundle

The easy like Crud'it Bundle.

1615.6k12](/packages/2lenet-crudit-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
