tohokuaikiのチラシの裏

技術的ネタとか。

LaravelでAdminlteをjeroennoten/Laravel-AdminLTE使ってちゃんと導入してみる

1年前のこれの続き tohokuaiki.hateblo.jp

LaravelプロジェクトをVueベースで管理画面まで

よくある感じで。

$ composer create-project laravel/laravel=6.* --prefer-dist junoe_app
$ composer require laravel/ui=1.*
$ ./artisan ui vue --auth
$ ./artisan migrate

で、LaravelプロジェクトをVueベースでAuth画面まで作る。

AdminlteのLaravelバンドルを導入する

こんな感じでAdminlteのLaravelバンドルを導入。

$ composer require jeroennoten/laravel-adminlte
$ ./artisan adminlte:status

+------------------+------------------------------------------+---------------+----------+
| Package Resource | Description                              | Status        | Required |
+------------------+------------------------------------------+---------------+----------+
| assets           | The AdminLTE required assets             | Not Installed | true     |
| config           | The default package configuration file   | Not Installed | true     |
| translations     | The default package translations files   | Not Installed | true     |
| main_views       | The default package main views           | Not Installed | false    |
| auth_views       | The default package authentication views | Mismatch      | false    |
| basic_views      | The default package basic views          | Mismatch      | false    |
| basic_routes     | The package routes                       | Not Installed | false    |
+------------------+------------------------------------------+---------------+----------+

Auth_viewsでMismatchと出ているのは、AdminlteのAuthと先ほど導入したLaravelのAuthが違っているので。 Basic ViewsでのMismatchはHome画面のテンプレートの違い。

Adminlteから必要な物をインストール(ファイルのコピー)を行う

で、必要な物だけadminlteからインストールする。

アセット

$ ./artisan adminlte:install --only=assets

で、以下のファイルがコピーされる。

add 'public/vendor/adminlte/dist/css/adminlte.css'
add 'public/vendor/adminlte/dist/css/adminlte.css.map'
add 'public/vendor/adminlte/dist/css/adminlte.min.css'
add 'public/vendor/adminlte/dist/css/adminlte.min.css.map'
add 'public/vendor/adminlte/dist/img/AdminLTELogo.png'
add 'public/vendor/adminlte/dist/js/adminlte.js'
add 'public/vendor/adminlte/dist/js/adminlte.js.map'
add 'public/vendor/adminlte/dist/js/adminlte.min.js'
add 'public/vendor/adminlte/dist/js/adminlte.min.js.map'
add 'public/vendor/bootstrap/js/bootstrap.bundle.js'
add 'public/vendor/bootstrap/js/bootstrap.bundle.js.map'
add 'public/vendor/bootstrap/js/bootstrap.bundle.min.js'
add 'public/vendor/bootstrap/js/bootstrap.bundle.min.js.map'
add 'public/vendor/bootstrap/js/bootstrap.js'
add 'public/vendor/bootstrap/js/bootstrap.js.map'
add 'public/vendor/bootstrap/js/bootstrap.min.js'
add 'public/vendor/bootstrap/js/bootstrap.min.js.map'
add 'public/vendor/fontawesome-free/css/all.css'
add 'public/vendor/fontawesome-free/css/all.min.css'
add 'public/vendor/fontawesome-free/css/brands.css'
add 'public/vendor/fontawesome-free/css/brands.min.css'
add 'public/vendor/fontawesome-free/css/fontawesome.css'
add 'public/vendor/fontawesome-free/css/fontawesome.min.css'
add 'public/vendor/fontawesome-free/css/regular.css'
add 'public/vendor/fontawesome-free/css/regular.min.css'
add 'public/vendor/fontawesome-free/css/solid.css'
add 'public/vendor/fontawesome-free/css/solid.min.css'
add 'public/vendor/fontawesome-free/css/svg-with-js.css'
add 'public/vendor/fontawesome-free/css/svg-with-js.min.css'
add 'public/vendor/fontawesome-free/css/v4-shims.css'
add 'public/vendor/fontawesome-free/css/v4-shims.min.css'
add 'public/vendor/fontawesome-free/webfonts/fa-brands-400.eot'
add 'public/vendor/fontawesome-free/webfonts/fa-brands-400.svg'
add 'public/vendor/fontawesome-free/webfonts/fa-brands-400.ttf'
add 'public/vendor/fontawesome-free/webfonts/fa-brands-400.woff'
add 'public/vendor/fontawesome-free/webfonts/fa-brands-400.woff2'
add 'public/vendor/fontawesome-free/webfonts/fa-regular-400.eot'
add 'public/vendor/fontawesome-free/webfonts/fa-regular-400.svg'
add 'public/vendor/fontawesome-free/webfonts/fa-regular-400.ttf'
add 'public/vendor/fontawesome-free/webfonts/fa-regular-400.woff'
add 'public/vendor/fontawesome-free/webfonts/fa-regular-400.woff2'
add 'public/vendor/fontawesome-free/webfonts/fa-solid-900.eot'
add 'public/vendor/fontawesome-free/webfonts/fa-solid-900.svg'
add 'public/vendor/fontawesome-free/webfonts/fa-solid-900.ttf'
add 'public/vendor/fontawesome-free/webfonts/fa-solid-900.woff'
add 'public/vendor/fontawesome-free/webfonts/fa-solid-900.woff2'
add 'public/vendor/jquery/jquery.js'
add 'public/vendor/jquery/jquery.min.js'
add 'public/vendor/jquery/jquery.min.map'
add 'public/vendor/overlayScrollbars/css/OverlayScrollbars.css'
add 'public/vendor/overlayScrollbars/css/OverlayScrollbars.min.css'
add 'public/vendor/overlayScrollbars/js/OverlayScrollbars.js'
add 'public/vendor/overlayScrollbars/js/OverlayScrollbars.min.js'
add 'public/vendor/overlayScrollbars/js/jquery.overlayScrollbars.js'
add 'public/vendor/overlayScrollbars/js/jquery.overlayScrollbars.min.js'
add 'public/vendor/popper/esm/popper-utils.js'
add 'public/vendor/popper/esm/popper-utils.js.map'
add 'public/vendor/popper/esm/popper-utils.min.js'
add 'public/vendor/popper/esm/popper-utils.min.js.map'
add 'public/vendor/popper/esm/popper.js'
add 'public/vendor/popper/esm/popper.js.map'
add 'public/vendor/popper/esm/popper.min.js'
add 'public/vendor/popper/esm/popper.min.js.map'
add 'public/vendor/popper/popper-utils.js'
add 'public/vendor/popper/popper-utils.js.map'
add 'public/vendor/popper/popper-utils.min.js'
add 'public/vendor/popper/popper-utils.min.js.map'
add 'public/vendor/popper/popper.js'
add 'public/vendor/popper/popper.js.map'
add 'public/vendor/popper/popper.min.js'
add 'public/vendor/popper/popper.min.js.map'
add 'public/vendor/popper/umd/popper-utils.js'
add 'public/vendor/popper/umd/popper-utils.js.map'
add 'public/vendor/popper/umd/popper-utils.min.js'
add 'public/vendor/popper/umd/popper-utils.min.js.map'
add 'public/vendor/popper/umd/popper.js'
add 'public/vendor/popper/umd/popper.js.flow'
add 'public/vendor/popper/umd/popper.js.map'
add 'public/vendor/popper/umd/popper.min.js'
add 'public/vendor/popper/umd/popper.min.js.map'

設定ファイル

$ ./artisan adminlte:install --only=config

config/adminlte.php

がコピー生成される。

翻訳ファイル

$ ./artisan adminlte:install --only=translations

で以下の言語ファイル

resources/lang/vendor/adminlte/ca/adminlte.php
resources/lang/vendor/adminlte/es/adminlte.php
resources/lang/vendor/adminlte/es/menu.php
resources/lang/vendor/adminlte/tr/adminlte.php
resources/lang/vendor/adminlte/tr/menu.php
resources/lang/vendor/adminlte/vi/adminlte.php
resources/lang/vendor/adminlte/vi/menu.php
resources/lang/vendor/adminlte/id/adminlte.php
resources/lang/vendor/adminlte/id/menu.php
resources/lang/vendor/adminlte/it/adminlte.php
resources/lang/vendor/adminlte/de/adminlte.php
resources/lang/vendor/adminlte/de/menu.php
resources/lang/vendor/adminlte/hu/adminlte.php
resources/lang/vendor/adminlte/en/adminlte.php
resources/lang/vendor/adminlte/en/menu.php
resources/lang/vendor/adminlte/uk/adminlte.php
resources/lang/vendor/adminlte/uk/menu.php
resources/lang/vendor/adminlte/pl/adminlte.php
resources/lang/vendor/adminlte/pt-br/adminlte.php
resources/lang/vendor/adminlte/pt-br/menu.php
resources/lang/vendor/adminlte/zh-CN/adminlte.php
resources/lang/vendor/adminlte/zh-CN/menu.php
resources/lang/vendor/adminlte/ja/adminlte.php
resources/lang/vendor/adminlte/ja/menu.php
resources/lang/vendor/adminlte/ru/adminlte.php
resources/lang/vendor/adminlte/ru/menu.php
resources/lang/vendor/adminlte/fa/adminlte.php
resources/lang/vendor/adminlte/hr/adminlte.php
resources/lang/vendor/adminlte/ar/adminlte.php
resources/lang/vendor/adminlte/fr/adminlte.php
resources/lang/vendor/adminlte/nl/adminlte.php

Basic View

Homeテンプレートのコピー

 ./artisan adminlte:install --only=basic_views

で、

resources/views/home.blade.php

が変わる。diff取るとこんな感じ

diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php
index 05dfca9..91ff6a2 100644
--- a/resources/views/home.blade.php
+++ b/resources/views/home.blade.php
@@ -1,23 +1,19 @@
-@extends('layouts.app')
+@extends('adminlte::page')
+
+@section('title', 'AdminLTE')
+
+@section('content_header')
+    <h1 class="m-0 text-dark">Dashboard</h1>
+@stop

 @section('content')
-<div class="container">
-    <div class="row justify-content-center">
-        <div class="col-md-8">
+    <div class="row">
+        <div class="col-12">
             <div class="card">
-                <div class="card-header">Dashboard</div>
-
                 <div class="card-body">
-                    @if (session('status'))
-                        <div class="alert alert-success" role="alert">
-                            {{ session('status') }}
-                        </div>
-                    @endif
-
-                    You are logged in!
+                    <p class="mb-0">You are logged in!</p>
                 </div>
             </div>
         </div>
     </div>
-</div>
-@endsection
+@stop

認証系のテンプレート

ログインとかパスワードの再発行回り。

$ ./artisan adminlte:install --only=auth_views

resources/views/auth/login.blade.php
resources/views/auth/passwords/confirm.blade.php
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php
resources/views/auth/register.blade.php
resources/views/auth/verify.blade.php

が作成コピーされる。

basic_routesとmain_viewsのインストール

basic_routesはroutes/web.php

Auth::routes();

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

が入るだけなので、./artisan ui vue --authしてるので不要。

main_viewsは

resources/views/vendor/adminlte/auth/auth-page.blade.php
resources/views/vendor/adminlte/auth/login.blade.php
resources/views/vendor/adminlte/auth/passwords/confirm.blade.php
resources/views/vendor/adminlte/auth/passwords/email.blade.php
resources/views/vendor/adminlte/auth/passwords/reset.blade.php
resources/views/vendor/adminlte/auth/register.blade.php
resources/views/vendor/adminlte/auth/verify.blade.php
resources/views/vendor/adminlte/master.blade.php
resources/views/vendor/adminlte/page.blade.php
resources/views/vendor/adminlte/partials/common/brand-logo-xl.blade.php
resources/views/vendor/adminlte/partials/common/brand-logo-xs.blade.php
resources/views/vendor/adminlte/partials/footer/footer.blade.php
resources/views/vendor/adminlte/partials/navbar/dropdown-item-link.blade.php
resources/views/vendor/adminlte/partials/navbar/dropdown-item-submenu.blade.php
resources/views/vendor/adminlte/partials/navbar/dropdown-item.blade.php
resources/views/vendor/adminlte/partials/navbar/menu-item-dropdown-menu.blade.php
resources/views/vendor/adminlte/partials/navbar/menu-item-dropdown-user-menu.blade.php
resources/views/vendor/adminlte/partials/navbar/menu-item-left-sidebar-toggler.blade.php
resources/views/vendor/adminlte/partials/navbar/menu-item-link.blade.php
resources/views/vendor/adminlte/partials/navbar/menu-item-logout-link.blade.php
resources/views/vendor/adminlte/partials/navbar/menu-item-right-sidebar-toggler.blade.php
resources/views/vendor/adminlte/partials/navbar/menu-item-search-form.blade.php
resources/views/vendor/adminlte/partials/navbar/menu-item.blade.php
resources/views/vendor/adminlte/partials/navbar/navbar-layout-topnav.blade.php
resources/views/vendor/adminlte/partials/navbar/navbar.blade.php
resources/views/vendor/adminlte/partials/sidebar/left-sidebar.blade.php
resources/views/vendor/adminlte/partials/sidebar/menu-item-header.blade.php
resources/views/vendor/adminlte/partials/sidebar/menu-item-link.blade.php
resources/views/vendor/adminlte/partials/sidebar/menu-item-search-form.blade.php
resources/views/vendor/adminlte/partials/sidebar/menu-item-treeview-menu.blade.php
resources/views/vendor/adminlte/partials/sidebar/menu-item.blade.php
resources/views/vendor/adminlte/partials/sidebar/right-sidebar.blade.php
resources/views/vendor/adminlte/plugins.blade.php

が入るのだけど、これはこのファイルを変更しないのであれば不要だと思うのでやらない。

状況確認

$ ./artisan adminlte:status
Checking the resources installation ...
 7/7 [■■■■■■■■■■■■■■■■■■■■■■■■] 100%
All resources checked succesfully!

+------------------+------------------------------------------+---------------+----------+
| Package Resource | Description                              | Status        | Required |
+------------------+------------------------------------------+---------------+----------+
| assets           | The AdminLTE required assets             | Installed     | true     |
| config           | The default package configuration file   | Installed     | true     |
| translations     | The default package translations files   | Installed     | true     |
| main_views       | The default package main views           | Not Installed | false    |
| auth_views       | The default package authentication views | Installed     | false    |
| basic_views      | The default package basic views          | Installed     | false    |
| basic_routes     | The package routes                       | Not Installed | false    |
+------------------+------------------------------------------+---------------+----------+

ここまでやって、config/app.phpでlocaleをjaにするとログインとか登録の画面がAdminlteの日本語のものになる。

AdminLteのJavaScriptCSSの追加

CSS

resources/sass/admin.scss とか作って、

// Fonts
@import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic');
$fa-font-path: "/vendor/fontawesome-free/webfonts";
// @import '~@fortawesome/fontawesome-free/css/all.css';
@import '~@fortawesome/fontawesome-free/scss/fontawesome.scss';
@import '~@fortawesome/fontawesome-free/scss/brands.scss';
@import '~@fortawesome/fontawesome-free/scss/fontawesome.scss';
@import '~@fortawesome/fontawesome-free/scss/regular.scss';
@import '~@fortawesome/fontawesome-free/scss/solid.scss';
@import '~@fortawesome/fontawesome-free/scss/v4-shims.scss';

// OverlayScrollbars
@import '~overlayscrollbars/css/OverlayScrollbars.css';
// iCheck
@import '~icheck-bootstrap/icheck-bootstrap.css';
// AdminLTE
@import '../../vendor/almasaeed2010/adminlte/dist/css/adminlte.css';

とすると、AdminlteのCSSができる。webpack.mix.jsでコンパイルに入れておく。

JavaScript

VueにAdminlteも入れておくこんな感じ。 resources/js/admin.js

require('./bootstrap');
require('overlayscrollbars');
require('../../vendor/almasaeed2010/adminlte/dist/js/adminlte');

window.Vue = require('vue');

const app = new Vue({
    el: '#app',
});

JavaScript/SASSの依存ライブラリ

まだAdminlteの依存ライブラリが無いのでnpm run prodするとエラーが出る。
以下のコマンドを実行。

$ npm i overlayscrollbars
$ npm i @fortawesome/fontawesome-free
$ npm i icheck-bootstrap

webpack.mix.js

ということで、自分のwebpack.mix.jsはこんな感じ。

const mix = require('laravel-mix');
const is_prod = mix.inProduction() ? true : false;
mix.webpackConfig({
  devtool: is_prod ? "" : "inline-source-map",
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': __dirname + '/resources/js'
    }
  },
}).options({
  processCssUrls: is_prod
})
.js('resources/js/app.js', 'public/js/dist/app.js')
.js('resources/js/admin.js', 'public/js/dist/admin.js')
.sass('resources/sass/app.scss', 'public/css')
.sass('resources/sass/admin.scss', 'public/css')
.sourceMaps(!is_prod)
.version()
;

管理画面を作る

ものっそい簡単なやつを作る。

Controllerの追加

$ ./artisan make:controller AdminController

app/Http/Controllers/AdminController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class AdminController extends Controller
{
    public function home()
    {
        return view('admin.home');
    }
}

Routeの追加

routes/web.php

<?php
Route::middleware(['auth'])->prefix('admin')->name('admin.')->group(function (){
    Route::get('/', 'AdminController@home')->name('home');
});

テンプレートの追加

resources/views/admin/home.blade.php

@extends('adminlte::page')

JavaScriptCSSを先ほどwebpack.mix.jsでコンパイルしたものにする

config/adminlte.phpの設定

vendor/jeroennoten/laravel-adminlte/resources/views/page.blade.php
をwrapしている
vendor/jeroennoten/laravel-adminlte/resources/views/master.blade.php
を見ると config('adminlte.enabled_laravel_mix') がtrueでないとコンパイル済みでなく個々のCSSJavaScriptを読んでしまう config/adminlte.php

<?php
    'enabled_laravel_mix' => true
    'laravel_mix_css_path' => 'css/admin.css',
    'laravel_mix_js_path' => 'js/admin.js',

としておく。

cssなんかは css/admin.cssに一括しているので vendor/fontawesome-free/css/fontawesome.css とかは要らない。なので、

$ ./artisan adminlte:install --only=assets

でインストールしたウチの

public/vendor/fontawesome-free/webfonts

配下のフォント以外は削除しても良いのかもしれない。あ、vendor/adminlte/dist/img/AdminLTELogo.png も必要といえば必要。

確認する

とりあえずこれで
http://my-laravel-app.local/login でログイン後に http://my-laravel-app.local/admin
にアクセスするとAdminlteのガワだけのページが表示される。

メニューの設定

config/adminlte.phpを編集する。

'menu'

権限ごとに出し分け

<?php
[
   'can' => 'create',
   'model' => App\User::class
]

で、bladeの@can('create', App\User::class) に相当する。