This package provides an easy way to quickly set up AdminLTE with Laravel 5 and 6. It has no requirements and dependencies besides Laravel, so you can start building your admin panel immediately. The package just provides a Blade template that you can extend and advanced menu configuration possibilities. A replacement for the make:auth
Artisan command that uses AdminLTE styled views instead of the default Laravel ones is also included.
- Requirements
- Installation
- Updating
- Usage
- The
make:adminlte
artisan command - Configuration
- Translations
- Customize views
- Issues, Questions and Pull Requests
- Laravel 5.5.x to 6.0.x
- PHP >= 7.0
-
Require the package using composer:
composer require jeroennoten/laravel-adminlte
-
Add the service provider to the
providers
inconfig/app.php
:Laravel 5.5 uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider
JeroenNoten\LaravelAdminLte\ServiceProvider::class,
-
Publish the public assets:
php artisan vendor:publish --provider="JeroenNoten\LaravelAdminLte\ServiceProvider" --tag=assets
-
To update this package, first update the composer package:
composer update jeroennoten/laravel-adminlte
-
Then, publish the public assets with the
--force
flag to overwrite existing filesphp artisan vendor:publish --provider="JeroenNoten\LaravelAdminLte\ServiceProvider" --tag=assets --force
- Version 1.25.1 to 1.26 and up:
- Plugins configuration was modified, check the new usage here: Plugins
- Version 1.26 to 1.2x and up:
- iCheck plugin was replaced with icheck-bootstrap. If you use the iCheck assets, make sure to check/modify the asset location.
To use the template, create a blade file and extend the layout with @extends('adminlte::page')
.
This template yields the following sections:
title
: for in the<title>
tagcontent_header
: title of the page, above the contentcontent
: all of the page's contentcss
: extra stylesheets (located in<head>
)js
: extra javascript (just before</body>
)
All sections are in fact optional. Your blade template could look like the following.
{{-- resources/views/admin/dashboard.blade.php --}}
@extends('adminlte::page')
@section('title', 'Dashboard')
@section('content_header')
<h1>Dashboard</h1>
@stop
@section('content')
<p>Welcome to this beautiful admin panel.</p>
@stop
@section('css')
<link rel="stylesheet" href="/css/admin_custom.css">
@stop
@section('js')
<script> console.log('Hi!'); </script>
@stop
Note that in Laravel 5.2 or higher you can also use @stack
directive for css
and javascript
:
{{-- resources/views/admin/dashboard.blade.php --}}
@push('css')
@push('js')
You now just return this view from your controller, as usual. Check out AdminLTE to find out how to build beautiful content for your admin panel.
Note: only for Laravel 5.2 and higher
This package ships with a make:adminlte
command that behaves exactly like make:auth
(introduced in Laravel 5.2) but replaces the authentication views with AdminLTE style views.
php artisan make:adminlte
This command should be used on fresh applications, just like the make:auth
command
If you want to use the included authentication related views manually, you can create the following files and only add one line to each file:
resources/views/auth/login.blade.php
:
@extends('adminlte::login')
resources/views/auth/register.blade.php
@extends('adminlte::register')
resources/views/auth/passwords/email.blade.php
@extends('adminlte::passwords.email')
resources/views/auth/passwords/reset.blade.php
@extends('adminlte::passwords.reset')
By default, the login form contains a link to the registration form.
If you don't want a registration form, set the register_url
setting to null
and the link will not be displayed.
First, publish the configuration file:
php artisan vendor:publish --provider="JeroenNoten\LaravelAdminLte\ServiceProvider" --tag=config
Now, edit config/adminlte.php
to configure the title, skin, menu, URLs etc. All configuration options are explained in the comments. However, I want to shed some light on the menu
configuration.
You can configure your menu as follows:
'menu' => [
'MAIN NAVIGATION',
[
'text' => 'Blog',
'url' => 'admin/blog',
],
[
'text' => 'Pages',
'url' => 'admin/pages',
'icon' => 'fas fa-fw fa-file'
],
[
'text' => 'Show my website',
'url' => '/',
'target' => '_blank'
],
'ACCOUNT SETTINGS',
[
'text' => 'Profile',
'route' => 'admin.profile',
'icon' => 'fas fa-fw fa-user'
],
[
'text' => 'Change Password',
'route' => 'admin.password',
'icon' => 'fas fa-fw fa-lock'
],
],
With a single string, you specify a menu header item to separate the items.
With an array, you specify a menu item. text
and url
or route
are required attributes.
The icon
is optional, you get an open circle if you leave it out.
The available icons that you can use are those from Font Awesome.
Just specify the name of the icon and it will appear in front of your menu item.
Use the can
option if you want conditionally show the menu item. This integrates with Laravel's Gate
functionality. If you need to conditionally show headers as well, you need to wrap it in an array like other menu items, using the header
option:
[
[
'header' => 'BLOG',
'can' => 'manage-blog'
],
[
'text' => 'Add new post',
'url' => 'admin/blog/new',
'can' => 'add-blog-post'
],
]
It's possible to add a search input in your menu, using a menu item with the following configuration:
[
'search' => true,
'href' => 'test', //form action
'method' => 'POST', //form method
'input_name' => 'menu-search-input', //input name
'text' => 'Search', //input placeholder
],
If you need custom filters, you can easily add your own menu filters to this package. This can be useful when you are using a third-party package for authorization (instead of Laravel's Gate
functionality).
For example with Laratrust:
<?php
namespace MyApp;
use JeroenNoten\LaravelAdminLte\Menu\Builder;
use JeroenNoten\LaravelAdminLte\Menu\Filters\FilterInterface;
use Laratrust;
class MyMenuFilter implements FilterInterface
{
public function transform($item, Builder $builder)
{
if (isset($item['permission']) && ! Laratrust::can($item['permission'])) {
return false;
}
return $item;
}
}
And then add to config/adminlte.php
:
'filters' => [
JeroenNoten\LaravelAdminLte\Menu\Filters\ActiveFilter::class,
JeroenNoten\LaravelAdminLte\Menu\Filters\HrefFilter::class,
JeroenNoten\LaravelAdminLte\Menu\Filters\SubmenuFilter::class,
JeroenNoten\LaravelAdminLte\Menu\Filters\ClassesFilter::class,
//JeroenNoten\LaravelAdminLte\Menu\Filters\GateFilter::class, Comment this line out
MyApp\MyMenuFilter::class,
]
It is also possible to configure the menu at runtime, e.g. in the boot of any service provider. Use this if your menu is not static, for example when it depends on your database or the locale. It is also possible to combine both approaches. The menus will simply be concatenated and the order of service providers determines the order in the menu.
To configure the menu at runtime, register a handler or callback for the MenuBuilding
event, for example in the boot()
method of a service provider:
use Illuminate\Contracts\Events\Dispatcher;
use JeroenNoten\LaravelAdminLte\Events\BuildingMenu;
class AppServiceProvider extends ServiceProvider
{
public function boot(Dispatcher $events)
{
$events->listen(BuildingMenu::class, function (BuildingMenu $event) {
$event->menu->add('MAIN NAVIGATION');
$event->menu->add([
'text' => 'Blog',
'url' => 'admin/blog',
]);
});
}
}
The configuration options are the same as in the static configuration files.
A more practical example that actually uses translations and the database:
public function boot(Dispatcher $events)
{
$events->listen(BuildingMenu::class, function (BuildingMenu $event) {
$event->menu->add(trans('menu.pages'));
$items = Page::all()->map(function (Page $page) {
return [
'text' => $page['title'],
'url' => route('admin.pages.edit', $page)
];
});
$event->menu->add(...$items);
});
}
This event-based approach is used to make sure that your code that builds the menu runs only when the admin panel is actually displayed and not on every request.
By default, a menu item is considered active if any of the following holds:
- The current path matches the
url
parameter - The current path is a sub-path of the
url
parameter - If it has a submenu containing an active menu item
To override this behavior, you can specify an active
parameter with an array of active URLs, asterisks and regular expressions are supported.
To utilize regex, simply prefix your pattern with regex:
and it will get evaluated automatically. The pattern will attempt to match the path of the URL, returned by request()->path()
, which returns the current URL without the domain name. Example:
[
'text' => 'Pages',
'url' => 'pages',
'active' => ['pages', 'content', 'content/*', 'regex:@^content/[0-9]+$@']
]
By default the DataTables, Select2, ChartJS, Pace and SweetAlert2 plugins are supported and active, automatically injecting their CDN files.
You can also add and configure new plugins, modifying the plugin variable using the example structure below:
'plugins' => [
[
'name' => 'Plugin Name',
'active' => true,
'files' => [
[
'type' => 'js',
'asset' => false,
'location' => '//cdn.plugin.net/plugin.min.js',
],
[
'type' => 'css',
'asset' => true,
'location' => 'css/plugin.min.css',
],
],
],
]
With the name string you specify the plugin name, and the active value will enable/disable the plugin injection.
Each plugin have a files array, with contain arrays with file type (js
or css
), and location
.
If the asset value is true
, the injection will use the asset() function.
You can change the Pace plugin appearence, when using the CDN injection modifying the css file location.
'location' => '//cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/themes/{{color}}/pace-theme-{{theme}}.min.css',
Color values: black, blue (default), green, orange, pink, purple, red, silver, white & yellow
Theme values: barber-shop, big-counter, bounce, center-atom, center-circle, center-radar (default), center-simple, corner-indicator, fill-left, flash, flat-top, loading-bar, mac-osx, minimal
At the moment, English, German, French, Dutch, Portuguese and Spanish translations are available out of the box.
Just specifiy the language in config/app.php
.
If you need to modify the texts or add other languages, you can publish the language files:
php artisan vendor:publish --provider="JeroenNoten\LaravelAdminLte\ServiceProvider" --tag=translations
Now, you can edit translations or add languages in resources/lang/vendor/adminlte
.
This resource allow you to use lang files, and is active by default.
First, configure the menu using the key text
as translation string.
This is an example of configuration:
[
'header' => 'account_settings'
],
[
'text' => 'profile',
'url' => 'admin/settings',
'icon' => 'user',
],
All the translation strings must be added in the menu.php
file of each language needed.
The translations files are located at resources/lang/vendor/adminlte/
This is an example of the menu.php
lang file:
return [
'account_settings' => 'ACCOUNT SETTINGS',
'profile' => 'Profile',
];
To translate the menu headers, just use the header
param. Example:
[
'header' => 'account_settings'
],
[
'text' => 'profile',
'url' => 'admin/settings',
'icon' => 'user',
],
If you need full control over the provided views, you can publish them:
php artisan vendor:publish --provider="JeroenNoten\LaravelAdminLte\ServiceProvider" --tag=views
Now, you can edit the views in resources/views/vendor/adminlte
.
You can report issues and ask questions in the issues section. Please start your issue with ISSUE:
and your question with QUESTION:
If you have a question, check the closed issues first. Over time, I've been able to answer quite a few.
To submit a Pull Request, please fork this repository, create a new branch and commit your new/updated code in there. Then open a Pull Request from your new branch. Refer to this guide for more info.