مهدی مهدوی
2 سال پیش توسط مهدی مهدوی مطرح شد
3 پاسخ

نظر دوستان در مورد جدا سازی بخش های User و Admin در لاراول

سلام خدمت دوستان
نمیدونم قبلا این بحث مطرح شده یا خیر
ولی میخوام نظر دوستان رو بدونم که وقتی پروژه ای با لاراول میزنن که دو بخش User و Admin داره
با فرض اینکه ممکنه دیتای response و یا دیتای request متفاوت باشه
واسه هر کدام Controller های جدا میسازین ؟
اگر پاسخ بالا خیرِ ، متد ها را جدا سازی میکنین ؟ یا باز هم همه رو داخل یه متد مینویسین و با شرط چک می کنید که آیا کاربر ادمینه یا خیر ؟

من پروژه هایی که قبلا خودم زدم بخش ادمین و یوزر کاملا از هم جدا بود ، جدیدا یه پروژه ای هست که قبلا فرد دیگه ای توسعه داده و همه رو در هم نوشته

در کل روشی که خودم پیش میرفتم خیلی مرتب تر بود و دیباگش خیلی راحت ، فقط یه عیبی داشت که کدها گاها تکرار میشدن

مورد دوم از بس داخل متد ها و blade ها شرط گذاشته به سختی میشه درک کرد

میخواستم بدونم روش اصولی تر از نظر توسعه دهندگان لاراول کدومه ؟

همچنین این موارد برای blade هم سواله که دوباره اینا جدا از هم باشن یا یکی

@hesammousavi

تشکر


ثبت پرسش جدید
حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 2 سال پیش مطرح شد
0

سلام طبق گفته آقای موسوی اگه کاربران ادمین زیاد باشن خوبه که جداسازیشون کنین


نوب
تخصص : کدنویس نوب :)
@yk5742g 2 سال پیش مطرح شد
0

@mehdi.mahdavi97
بهترین روش به نظر من که خودمم باهاش کار میکنم اینه که میگم

من پروژه هایی زدم که ممکن بود 20 تا سطح کاربر متفاوت داشته باشه و همیشه هم تعداد سطوح متفاوت بود.

کدهامو میزارم استفاده کن خیلی خوب و راحته

این کد migration

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePermissionTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('permissions', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();
        });
        Schema::create('permission_user', function (Blueprint $table) {
            $table->unsignedBigInteger('permission_id');
            $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->primary(['permission_id', 'user_id']);
        });

        Schema::create('roles', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();
        });
        Schema::create('permission_role', function (Blueprint $table) {
            $table->unsignedBigInteger('permission_id');
            $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
            $table->unsignedBigInteger('role_id');
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->primary(['permission_id', 'role_id']);
        });

        Schema::create('role_user', function (Blueprint $table) {
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->unsignedBigInteger('role_id');
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->primary(['user_id', 'role_id']);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('permission_user');
        Schema::dropIfExists('role_user');
        Schema::dropIfExists('permission_role');
        Schema::dropIfExists('roles');
        Schema::dropIfExists('permission');
    }
}

این متد داخل app/AuthServiceProvider

    public function boot()
    {
        $this->registerPolicies();
        Gate::before(function ($user) {
            if ($user->role == 10) return true;
        });
        foreach (Permission::all() as $permission) {
            Gate::define($permission->name, function ($user) use ($permission) {
                return $user->hasPermission($permission);
            });
        }
    }

حالا خیلی راحت توی کنترلرهای توی متد سازنده یعنی __constract میتونی با کد زیر به متدها بگی هرکی فلان دسترسی را داشت بتونه کار کنه

        $this->middleware('can:ticket-edit')->only(['postComment']);

تو کد بالا ticket-edit اسم permission هست و توی بدنه only هم اسم متد داخل کنترلر
به همین سادگی و خوشمزگی
توی blade هم میتونی از @can و یا @cannot استفاده کنی

برو حال کن :)


مهدی مهدوی
تخصص : تازه وارد
@mehdi.mahdavi97 2 سال پیش مطرح شد
0

@yk5742g
اصلا بحث من سطح دسترسی نیست

ما صرفا دو نوع کاربر داریم که یا مدیر سیستم هستند (با سطح دسترسی متفاوت که اصلا ملاک نیست ) و یکسری کاربر عادی ، که این کاربران عادی در داده های دریافتی و همچنین داده های ارسالی متفاوت هستند
با فرض اینکه سیستم تیکت داریم که کاربر تیکت ثبت میکنه و user_id میشه آیدی کاربر فعلی ، در سطح مدیریت هم مدیر میتونه واسه بقیه کاربران تیکت ثبت کنه و user_id را از request میگیره ( حالا اینکه این ادمین به تیکت ها دسترسی داشته باشه یا خیر بحثش جداست)

سوال من اینه که بهتره دوتا کنترلر ( یا یک کنترل و دو متد ) داشته باشیم واسه این کار ، یا داخل یه متدبا شرط چک بشه اگه کاربر فعلی ادمین بود از user_id که از request ارسال شده استفاده کنه ، یا یکسری اطلاعات بیشتری کاربر ادمین ارسال کنه و بخوایم با این تیکت ذخیره کنیم

که خب اگر بحث validation هم بهش اضافه کنیم دو تا rules متفاوت داریم

ادبیاتتون هم خوب نیست، برو حال کن و ... چنین چیزی من از شما نخواستم


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام