update
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Http\Controllers\Api\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Modules\Menu\App\Http\Requests\StoreMenuRequest;
|
||||
use Modules\Menu\App\Http\Resources\MenuResource;
|
||||
use Modules\Menu\App\Models\Menu;
|
||||
|
||||
class MenuController extends Controller
|
||||
{
|
||||
public function index(): JsonResponse
|
||||
{
|
||||
$menus = Menu::query()->withCount('items')->orderBy('key')->get();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => MenuResource::collection($menus),
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(int $id): JsonResponse
|
||||
{
|
||||
$menu = Menu::withCount('items')->find($id);
|
||||
|
||||
if (! $menu) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Không tìm thấy menu',
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => MenuResource::make($menu),
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(StoreMenuRequest $request): JsonResponse
|
||||
{
|
||||
$menu = Menu::create($request->validated());
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Tạo menu thành công',
|
||||
'data' => MenuResource::make($menu),
|
||||
], 201);
|
||||
}
|
||||
|
||||
public function update(int $id, StoreMenuRequest $request): JsonResponse
|
||||
{
|
||||
$menu = Menu::find($id);
|
||||
|
||||
if (! $menu) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Không tìm thấy menu',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$menu->update($request->validated());
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Cập nhật menu thành công',
|
||||
'data' => MenuResource::make($menu),
|
||||
]);
|
||||
}
|
||||
|
||||
public function destroy(int $id): JsonResponse
|
||||
{
|
||||
$menu = Menu::find($id);
|
||||
|
||||
if (! $menu) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Không tìm thấy menu',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$menu->delete();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Xoá menu thành công',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Http\Controllers\Api\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Menu\App\Http\Requests\StoreMenuItemRequest;
|
||||
use Modules\Menu\App\Http\Resources\MenuItemResource;
|
||||
use Modules\Menu\App\Models\MenuItem;
|
||||
|
||||
class MenuItemController extends Controller
|
||||
{
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$items = MenuItem::query()
|
||||
->when($request->integer('menu_id'), fn ($q, $menuId) => $q->where('menu_id', $menuId))
|
||||
->orderBy('id')
|
||||
->get();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => MenuItemResource::collection($items),
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(int $id): JsonResponse
|
||||
{
|
||||
$item = MenuItem::find($id);
|
||||
|
||||
if (! $item) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Không tìm thấy menu item',
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => MenuItemResource::make($item),
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(StoreMenuItemRequest $request): JsonResponse
|
||||
{
|
||||
$item = MenuItem::create($request->validated());
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Tạo menu item thành công',
|
||||
'data' => MenuItemResource::make($item),
|
||||
], 201);
|
||||
}
|
||||
|
||||
public function update(int $id, StoreMenuItemRequest $request): JsonResponse
|
||||
{
|
||||
$item = MenuItem::find($id);
|
||||
|
||||
if (! $item) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Không tìm thấy menu item',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$item->update($request->validated());
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Cập nhật menu item thành công',
|
||||
'data' => MenuItemResource::make($item),
|
||||
]);
|
||||
}
|
||||
|
||||
public function destroy(int $id): JsonResponse
|
||||
{
|
||||
$item = MenuItem::find($id);
|
||||
|
||||
if (! $item) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Không tìm thấy menu item',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$item->delete();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Xoá menu item thành công',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class StoreMenuItemRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'menu_id' => ['required', 'integer', 'exists:nav_menus,id'],
|
||||
'label' => ['required', 'string', 'max:255'],
|
||||
'url' => ['required', 'string', 'max:255'],
|
||||
'icon' => ['nullable', 'string', 'max:255'],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class StoreMenuRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'key' => ['required', 'string', 'max:255', Rule::unique('nav_menus', 'key')->ignore($this->route('id'))],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MenuItemResource extends JsonResource
|
||||
{
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'menu_id' => $this->menu_id,
|
||||
'label' => $this->label,
|
||||
'url' => $this->url,
|
||||
'icon' => $this->icon,
|
||||
'created_at' => $this->created_at,
|
||||
'updated_at' => $this->updated_at,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MenuResource extends JsonResource
|
||||
{
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'key' => $this->key,
|
||||
'items_count' => $this->when(isset($this->items_count), fn () => (int) $this->items_count),
|
||||
'created_at' => $this->created_at,
|
||||
'updated_at' => $this->updated_at,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class Menu extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $table = 'nav_menus';
|
||||
|
||||
protected $fillable = ['key'];
|
||||
|
||||
public function items(): HasMany
|
||||
{
|
||||
return $this->hasMany(MenuItem::class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
class MenuItem extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $table = 'nav_menu_items';
|
||||
|
||||
protected $fillable = ['menu_id', 'label', 'url', 'icon'];
|
||||
|
||||
public function menu(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Menu::class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class MenuServiceProvider extends ServiceProvider
|
||||
{
|
||||
protected string $moduleName = 'Menu';
|
||||
|
||||
protected string $moduleNameLower = 'menu';
|
||||
|
||||
public function boot(): void
|
||||
{
|
||||
$this->registerConfig();
|
||||
$this->registerMigrations();
|
||||
$this->app->register(RouteServiceProvider::class);
|
||||
}
|
||||
|
||||
public function register(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
protected function registerConfig(): void
|
||||
{
|
||||
$this->mergeConfigFrom(
|
||||
module_path($this->moduleName, 'config/config.php'),
|
||||
$this->moduleNameLower
|
||||
);
|
||||
}
|
||||
|
||||
protected function registerMigrations(): void
|
||||
{
|
||||
$this->loadMigrationsFrom(module_path($this->moduleName, 'Database/migrations'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Menu\App\Providers;
|
||||
|
||||
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
class RouteServiceProvider extends ServiceProvider
|
||||
{
|
||||
protected string $moduleNamespace = 'Modules\Menu\App\Http\Controllers';
|
||||
|
||||
public function boot(): void
|
||||
{
|
||||
parent::boot();
|
||||
}
|
||||
|
||||
public function map(): void
|
||||
{
|
||||
$this->mapApiRoutes();
|
||||
}
|
||||
|
||||
protected function mapApiRoutes(): void
|
||||
{
|
||||
Route::prefix('api')
|
||||
->middleware('api')
|
||||
->namespace($this->moduleNamespace)
|
||||
->group(module_path('Menu', '/routes/api.php'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('nav_menus', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('key')->unique();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('nav_menus');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('nav_menu_items', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('menu_id')->constrained('nav_menus')->cascadeOnDelete();
|
||||
$table->string('label');
|
||||
$table->string('url');
|
||||
$table->string('icon')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('nav_menu_items');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "nwidart/menu",
|
||||
"description": "",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Widart",
|
||||
"email": "n.widart@gmail.com"
|
||||
}
|
||||
],
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [],
|
||||
"aliases": {
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Modules\\Menu\\": "",
|
||||
"Modules\\Menu\\App\\": "App/",
|
||||
"Modules\\Menu\\Database\\Factories\\": "Database/Factories/",
|
||||
"Modules\\Menu\\Database\\Seeders\\": "Database/Seeders/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Modules\\Menu\\Tests\\": "tests/"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'name' => 'Menu',
|
||||
];
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "Menu",
|
||||
"alias": "menu",
|
||||
"description": "Quan ly Menu va Menu Item",
|
||||
"keywords": [],
|
||||
"priority": 0,
|
||||
"providers": [
|
||||
"Modules\\Menu\\App\\Providers\\MenuServiceProvider"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Modules\Menu\App\Http\Controllers\Api\Admin\MenuController;
|
||||
use Modules\Menu\App\Http\Controllers\Api\Admin\MenuItemController;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Menu API Routes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Quản lý Menu và Menu Item (portal-admin)
|
||||
|
|
||||
*/
|
||||
|
||||
Route::prefix('v1')
|
||||
->group(function () {
|
||||
Route::prefix('administrator')
|
||||
->middleware('api.auth:admin')
|
||||
->group(function () {
|
||||
Route::prefix('menus')
|
||||
->controller(MenuController::class)
|
||||
->group(function () {
|
||||
Route::get('/', 'index')->middleware('perm:menu.view');
|
||||
Route::post('/', 'store')->middleware('perm:menu.create');
|
||||
Route::get('{id}', 'show')->middleware('perm:menu.view');
|
||||
Route::put('{id}', 'update')->middleware('perm:menu.edit');
|
||||
Route::delete('{id}', 'destroy')->middleware('perm:menu.destroy');
|
||||
});
|
||||
|
||||
Route::prefix('menu-items')
|
||||
->controller(MenuItemController::class)
|
||||
->group(function () {
|
||||
Route::get('/', 'index')->middleware('perm:menu.view');
|
||||
Route::post('/', 'store')->middleware('perm:menu.create');
|
||||
Route::get('{id}', 'show')->middleware('perm:menu.view');
|
||||
Route::put('{id}', 'update')->middleware('perm:menu.edit');
|
||||
Route::delete('{id}', 'destroy')->middleware('perm:menu.destroy');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user