Memo

メモ > 技術 > フレームワーク: Laravel12 > 管理画面のレイアウトを変更

管理画面のレイアウトを変更
左にサイドバーを設けたレイアウトにしてみる。 ■resources/views/layouts/app.blade.php
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="csrf-token" content="{{ csrf_token() }}"> <title>{{ config('app.name', 'Laravel') }}</title> <!-- Fonts --> <link rel="preconnect" href="https://fonts.bunny.net"> <link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" /> <!-- Scripts --> @vite(['resources/css/app.css', 'resources/js/app.js']) </head> <body class="font-sans antialiased bg-gray-100"> <div class="min-h-screen flex flex-col sm:flex-row"> <!-- Sidebar --> <aside class="bg-white w-full sm:w-64 border-b sm:border-b-0 sm:border-r border-gray-200"> <!-- Logo --> <div class="h-16 flex items-center justify-between px-4 border-b border-gray-200"> <a href="{{ route('dashboard') }}" class="flex items-center space-x-2"> <x-application-logo class="block h-8 w-auto fill-current text-gray-800" /> <span class="font-semibold text-lg">{{ config('app.name', 'Laravel') }}</span> </a> </div> <!-- Menu --> @include('layouts.menu') </aside> <!-- Main Content --> <div class="flex-1 flex flex-col"> <!-- Navigation --> @include('layouts.navigation') <!-- Page Content --> <main> {{ $slot }} </main> </div> </div> </body> </html>
■resources/views/layouts/menu.blade.php (新規作成)
<nav class="px-4 py-4 space-y-2 hidden sm:block"> <x-nav-link :href="route('dashboard')" :active="request()->routeIs('dashboard')" class="block w-full"> {{ __('Dashboard') }} </x-nav-link> <x-nav-link :href="route('entry.index')" :active="request()->routeIs('entry.index')" class="block w-full"> 記事 </x-nav-link> <x-nav-link :href="route('category.index')" :active="request()->routeIs('category.index')" class="block w-full"> 分類 </x-nav-link> <x-nav-link :href="route('profile.edit')" :active="request()->routeIs('profile.edit')" class="block w-full"> {{ __('Profile') }} </x-nav-link> </nav>
■resources/views/layouts/navigation.blade.php
<nav x-data="{ open: false }" class="bg-white border-b border-gray-100"> <!-- Primary Navigation Menu --> <div class="mx-auto px-4 sm:px-6 lg:px-8 shadow"> <div class="flex justify-between h-16"> <div class="flex"> <!-- Logo --> <div class="shrink-0 flex items-center"> {{ $header }} </div> </div> <!-- Settings Dropdown --> <div class="hidden sm:flex sm:items-center sm:ms-6"> <x-dropdown align="right" width="48"> <x-slot name="trigger"> <button class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-none transition ease-in-out duration-150"> <div>{{ Auth::user()->name }}</div> <div class="ms-1"> <svg class="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" /> </svg> </div> </button> </x-slot> <x-slot name="content"> <x-dropdown-link :href="route('profile.edit')"> {{ __('Profile') }} </x-dropdown-link> <!-- Authentication --> <form method="POST" action="{{ route('logout') }}"> @csrf <x-dropdown-link :href="route('logout')" onclick="event.preventDefault(); this.closest('form').submit();"> {{ __('Log Out') }} </x-dropdown-link> </form> </x-slot> </x-dropdown> </div> <!-- Hamburger --> <div class="-me-2 flex items-center sm:hidden"> <button @click="open = ! open" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out"> <svg class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24"> <path :class="{'hidden': open, 'inline-flex': ! open }" class="inline-flex" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> <path :class="{'hidden': ! open, 'inline-flex': open }" class="hidden" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> </svg> </button> </div> </div> </div> <!-- Responsive Navigation Menu --> <div :class="{'block': open, 'hidden': ! open}" class="hidden sm:hidden"> <!-- Responsive Settings Options --> <div class="pt-4 pb-1 border-t border-gray-200"> <div class="px-4"> <div class="font-medium text-base text-gray-800">{{ Auth::user()->name }}</div> <div class="font-medium text-sm text-gray-500">{{ Auth::user()->email }}</div> </div> <div class="mt-3 space-y-1"> <x-responsive-nav-link :href="route('profile.edit')"> {{ __('Profile') }} </x-responsive-nav-link> <!-- Authentication --> <form method="POST" action="{{ route('logout') }}"> @csrf <x-responsive-nav-link :href="route('logout')" onclick="event.preventDefault(); this.closest('form').submit();"> {{ __('Log Out') }} </x-responsive-nav-link> </form> </div> </div> </div> </nav>
■resources/views/components/nav-link.blade.php
@props(['active']) @php $classes = ($active ?? false) ? 'inline-flex items-center px-1 pt-1 font-medium leading-5 text-gray-900 focus:outline-none transition duration-150 ease-in-out' : 'inline-flex items-center px-1 pt-1 font-medium leading-5 text-gray-500 hover:text-gray-700 focus:text-gray-700 transition duration-150 ease-in-out'; @endphp <a {{ $attributes->merge(['class' => $classes]) }}> {{ $slot }} </a>
■その他 必要に応じて各ページで、コンテンツ用のdivを以下のように調整する。
<div class="py-12"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6"> ↓ <div class="py-8"> <div class="mx-auto sm:px-6 lg:px-8 space-y-6">

Advertisement