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.php
にHasRoles
を追加したら完了です。
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.php
のRoute::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をクリックしてみましょう。
入力項目に従って入力し、「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');
});
});
もちろん、namespace
やprefix
を使った指定方法も可能です。
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
に書き過ぎると可読性が悪くなるので、Controller
にMiddleware
を追加してもいいでしょう。注)CRUD Generator使用時に出力されるルート設定は最後の行に追加されますので、ルートグループを作成したら手動で中に入れる必要があります。crudコマンドには他にバリデーションやリレーションのオプションも存在します。
次回は拡張する方法を紹介します。
- Original:https://minory.org/laravel-admin.html
- Source:Minory
- Author:管理者