Laravel 5.5に対応したCRUD Generator付きの管理画面(Admin)を試してみる

laravel-admin

AppzCoderさんがGithubで提供しているLaravelパッケージの1つに「Laravel Admin Panel」というものがあります。 GitHub – appzcoder/laravel-admin: Laravel Admin Panel一見、ロール(役割)付きの管理画面を提供しているのかと思ったら、同じくAppzCoderさんのLaravel 5以降に対応している「CRUD Generator」がArtisanコマンドでなく、GUIで操作できるようになっているではありませんか!
これは試してみるしかない!と思い、早速Cloud9に開発環境を構築。

Laravel Adminのインストール

READMEに書いてある通り、使い方はとても簡単です。
まずは、composerコマンドを使ってパッケージをダウンロードします。

composer require appzcoder/laravel-admin

次に、artisanコマンドでadminパッケージをインストールします。

php artisan laravel-admin:install

最後に、app/User.phpHasRolesを追加したら完了です。

class User extends Authenticatable
{
    use Notifiable, HasRoles;    ...

最初にすること

このままでも機能しますが、せっかくロールパーミッション(許可権限)設定機能があるので、ユーザーを作成しましょう。
まずロールを作成し、作成したロールに対してパーミッションを与え、ロールを持つユーザーを作成します。
作成したロールやパーミッションは以下のように利用することができます。

// Check role anywhere
if(Auth::check() && Auth::user()->hasRole('admin')) {
    // Do admin stuff here
} else {
    // Do nothing
}// Check role in route middleware
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => ['auth', 'roles'], 'roles' => 'admin'], function () {
   Route::get('/', ['uses' => 'AdminController@index']);
});

最後にチェック用のミドルウェアを反映させれば完了です。

// Add roles middleware in app/Http/Kernel.php
protected $routeMiddleware = [
    ...
    'roles' => \App\Http\Middleware\CheckRole::class,
];

注)現在は問題ありませんが、「Add New」ボタンを押すと新規登録画面が表示できないエラーが発生していました。Laravel 5.5.0~5.5.9まではroutes/web.phpRoute::resource('...');でエラーが発生するようなので、composer updateで最新の状態にしておきましょう。

CRUD Generatorを使ってみよう!

CRUD Generator(クラッド ジェネレーター)のCRUDとは…

CRUD(クラッド)とは、ほとんど全てのコンピュータソフトウェアが持つ永続性の4つの基本機能のイニシャルを並べた用語。その4つとは、Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)である。ユーザインタフェースが備えるべき機能(情報の参照/検索/更新)を指す用語としても使われる。
CRUD – Wikipedia

要は、アプリケーションに必要なCRUD機能付きのMVC(Model、View、Controller)とDBにテーブル自動で作成してくれるものです。では、左サイドバーのTools → Generatorをクリックしてみましょう。

CRUD Generator


入力項目に従って入力し、「Generate」ボタンを押すだけで完成です!CRUD Generatorで作成されるファイルは、

  • /app/Http/Controllers/<Crud Name>Controller.php
  • /app/<Crud Name>.php
  • /database/migrations/<日時>_create_<Crud Name>_table.php
  • /resources/views/<Crud Name>/create.blade.php
  • /resources/views/<Crud Name>/edit.blade.php
  • /resources/views/<Crud Name>/form.blade.php
  • /resources/views/<Crud Name>/index.blade.php
  • /resources/views/<Crud Name>/show.blade.php
  • /resources/views/<Crud Name>/create.blade.php
  • /resources/laravel-admin/menus.json(JSON形式のModules=>itemsに追加)

    {"menus":[{"section":"User Manager","items":[{"title":"Users","url":"\/admin\/users"},{"title":"Roles","url":"\/admin\/roles"},{"title":"Permissions","url":"\/admin\/permissions"},{"title":"Give Role Permissions","url":"\/admin\/give-role-permissions"}]},{"section":"Tools","items":[{"title":"Generator","url":"\/admin\/generator"}]},{"section":"Modules","items":[<Crud Name>]}]}
  • /routes/web.php(最後の行に)

    Route::resource('admin/<Crud Name>', 'Admin\\<Crud Name>Controller');

ちなみにmigrationsに作成されたファイルはphp artisan migrate済みです。

ロール別にアクセスを制御

初期状態のままでは、ログインしてもしなくても誰でも/admin以下にアクセスすることができます。
そこで、/routes/web.phpをカスタマイズしてアクセス制限を付け加えましょう。

Route::group(['middleware' => 'auth'], function () {
    Route::get('admin', 'Admin\AdminController@index');
    // Only System Manager
    Route::group(['middleware' => 'roles', 'roles' => 'system'], function () {
        Route::get('admin/give-role-permissions', 'Admin\AdminController@getGiveRolePermissions');
        Route::post('admin/give-role-permissions', 'Admin\AdminController@postGiveRolePermissions');
        Route::resource('admin/roles', 'Admin\RolesController');
        Route::resource('admin/permissions', 'Admin\PermissionsController');
        Route::resource('admin/users', 'Admin\UsersController');
        Route::get('admin/generator', ['uses' => '\Appzcoder\LaravelAdmin\Controllers\ProcessController@getGenerator']);
        Route::post('admin/generator', ['uses' => '\Appzcoder\LaravelAdmin\Controllers\ProcessController@postGenerator']);
    });
    // Administrator
    Route::group(['middleware' => 'roles', 'roles' => ['system', 'admin']], function () {
        // Add New Route
        Route::resource('admin/<Crud Name>', 'Admin\\<Crud Name>Controller');
    });
});

もちろん、namespaceprefixを使った指定方法も可能です。

Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => ['auth', 'roles'], 'roles' => 'system'], function () {
    Route::get('give-role-permissions', 'AdminController@getGiveRolePermissions');
    Route::post('give-role-permissions', 'AdminController@postGiveRolePermissions');
    Route::resource('roles', 'RolesController');
    Route::resource('permissions', 'PermissionsController');
    Route::resource('users', 'UsersController');
    Route::get('generator', ['uses' => '\Appzcoder\LaravelAdmin\Controllers\ProcessController@getGenerator']);
    Route::post('generator', ['uses' => '\Appzcoder\LaravelAdmin\Controllers\ProcessController@postGenerator']);
});
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => ['auth', 'roles'], 'roles' => ['system', 'admin']], function () {
    Route::get('/', 'AdminController@index');
    Route::resource('<Crud Name>', '\<Crud Name>Controller');
});

また、あまりrouteに書き過ぎると可読性が悪くなるので、ControllerMiddlewareを追加してもいいでしょう。注)CRUD Generator使用時に出力されるルート設定は最後の行に追加されますので、ルートグループを作成したら手動で中に入れる必要があります。crudコマンドには他にバリデーションリレーションのオプションも存在します。
次回は拡張する方法を紹介します。


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA