😆1.2 Hoàn thành 1 project nhỏ Crud dựa trên bài viết gốc (ok)

https://acquaintsoft.com/blog/laravel-permission-demo

https://c-i-ph-n-m-m-tr-n-ubuntu-c-n-thi.gitbook.io/learn-lavarel/bai-viet-goc

1MB
lva1.zip
archive

Tạo một bảng Product để áp dụng Roles, Permissions 😎😎

C:\xampp82\htdocs\lva1\app\Http\Controllers\Admin\PermissionController.php

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Permission;
use Illuminate\Http\Request;
class PermissionController extends Controller
{
  public function __construct()
  {
    $this->middleware('can:permission list', ['only' => ['index', 'show']]);
    $this->middleware('can:permission create', ['only' => ['create', 'store']]);
    $this->middleware('can:permission edit', ['only' => ['edit', 'update']]);
    $this->middleware('can:permission delete', ['only' => ['destroy']]);
  }
  /**
   * Display a listing of the resource.
   */
  public function index()
  {
    $permissions = Permission::latest()->paginate(5);
    return view('admin.permission.index', compact('permissions'))->with('i', (request()->input('page', 1) - 1) * 5);
  }
  /**
   * Show the form for creating a new resource.
   */
  public function create()
  {
    return view('admin.permission.create');
  }
  /**
   * Store a newly created resource in storage.
   */
  public function store(Request $request)
  {
    $request->validate(['name' => 'required|string|max:255|unique:' . config('permission.table_names.permissions', 'permissions') . ',name']);
    Permission::create(['name' => $request->name, 'guard_name' => 'web']);
    return redirect()->route('permission.index')->with('message', 'Permission created successfully.');
  }
  /**
   * Display the specified resource.
   */
  public function show(Permission $permission)
  {
    //
  }
  /**
   * Show the form for editing the specified resource.
   */
  public function edit(Permission $permission)
  {
    return view('admin.permission.edit', compact('permission'));
  }
  /**
   * Update the specified resource in storage.
   */
  public function update(Request $request, Permission $permission)
  {
    $request->validate(['name' => 'required|string|max:255|unique:' . config('permission.table_names.permissions', 'permissions') . ',name,' . $permission->id,]);
    $permission->update(['name' => $request->name, 'guard_name' => 'web']);
    return redirect()->route('permission.index')->with('message', 'Permission updated successfully.');
  }
  /**
   * Remove the specified resource from storage.
   */
  public function destroy(Permission $permission)
  {
    $permission->delete();
    return redirect()->route('permission.index')->with('message', 'Permission deleted successfully');
  }
}

C:\xampp82\htdocs\lva1\routes\web.php

<?php
use App\Http\Controllers\Admin\PermissionController;
use App\Http\Controllers\Admin\RoleController;
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\ProductController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/
Route::get('/', function () {
  return view('welcome');
});
Auth::routes();
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/dashboard', function () {
  return view('dashboard');
})->middleware(['auth'])->name('dashboard');
Route::prefix('admin')->namespace('App\Http\Controllers\Admin')->middleware(['auth'])->group(function () {
  Route::resource('permission', PermissionController::class);
  Route::resource('role', RoleController::class);
  Route::resource('user', UserController::class);
  Route::get('edit-account-info', [UserController::class, 'profileInformation'])->name('admin.profile.info');
  Route::post('edit-account-info', [UserController::class, 'profileInformationStore'])->name('admin.profile.info.store');
  Route::post('change-password', [UserController::class, 'changePasswordStore'])->name('admin.profile.password.store');
  Route::resource('product', ProductController::class);
});

C:\xampp82\htdocs\lva1\resources\views\products\index.blade.php

<x-app-layout>
  <x-slot name="header">
    <h2 class="font-semibold text-xl text-gray-800 leading-tight">
      {{ __('Products') }}
    </h2>
  </x-slot>
  <div class="py-12">
    <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
      <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
        <div class="p-6 bg-white border-b border-gray-200">
          <div class="flex flex-col mt-8">
            @can('product create')
            <div class="d-print-none with-border mb-8">
              <a href="{{ route('product.create') }}"
                class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center mr-2 mb-2 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">{{
                __('Add Product') }}</a>
            </div>
            @endcan
            <div class="py-2">
              @if(session()->has('message'))
              <div class="mb-8 text-green-400 font-bold">
                {{ session()->get('message') }}
              </div>
              @endif
              <div class="min-w-full border-b border-gray-200 shadow">
                <form method="GET" action="{{ route('product.index') }}">
                  <div class="py-2 flex">
                    <div class="overflow-hidden flex pl-4">
                      <input type="search" name="search" value="{{ request()->input('search') }}"
                        class="rounded-md shadow-sm border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"
                        placeholder="Search">
                      <button type='submit'
                        class='ml-4 inline-flex items-center px-4 py-2 bg-gray-800 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-gray-700 active:bg-gray-900 focus:outline-none focus:border-gray-900 focus:ring ring-gray-300 disabled:opacity-25 transition ease-in-out duration-150'>
                        {{ __('Search') }}
                      </button>
                    </div>
                  </div>
                </form>
                <table class="border-collapse table-auto w-full text-sm">
                  <thead>
                    <tr>
                      <th
                        class="py-4 px-6 bg-grey-lightest font-bold uppercase text-sm text-grey-dark border-b border-grey-light text-left">
                      </th>
                      @canany(['product edit', 'product delete'])
                      <th
                        class="py-4 px-6 bg-grey-lightest font-bold uppercase text-sm text-grey-dark border-b border-grey-light text-left">
                        {{ __('Actions') }}
                      </th>
                      @endcanany
                    </tr>
                  </thead>
                  <tbody class="bg-white dark:bg-slate-800">
                    @foreach($products as $product)
                    <tr>
                      <td
                        class="border-b border-slate-100 dark:border-slate-700 p-4 pl-8 text-slate-500 dark:text-slate-400">
                        <div class="text-sm text-gray-900">
                          <a href="{{route('product.show', $product->id)}}"
                            class="no-underline hover:underline text-cyan-600 dark:text-cyan-400">{{ $product->title
                            }}</a>
                        </div>
                      </td>
                      @canany(['product edit', 'product delete'])
                      <td
                        class="border-b border-slate-100 dark:border-slate-700 p-4 pl-8 text-slate-500 dark:text-slate-400">
                        <form action="{{ route('product.destroy', $product->id) }}" method="POST">
                          @can('product edit')
                          <a href="{{route('product.edit', $product->id)}}"
                            class="px-4 py-2 text-white mr-4 bg-blue-600">
                            {{ __('Edit') }}
                          </a>
                          @endcan
                          @can('product delete')
                          @csrf
                          @method('DELETE')
                          <button class="px-4 py-2 text-white bg-red-600">
                            {{ __('Delete') }}
                          </button>
                          @endcan
                        </form>
                      </td>
                      @endcanany
                    </tr>
                    @endforeach
                  </tbody>
                </table>
              </div>
              <div class="py-8">
                {{ $products->appends(request()->query())->links() }}
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</x-app-layout>

Test

1MB
lva1-2.zip
archive

Last updated