راکت

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

3 پاسخ

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

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

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

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

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

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

@hesammousavi

تشکر

ثبت پرسش جدید

پاسخ‌ها

3
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

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

نوب
نوب
@yk5742g

تخصص: کدنویس نوب :)

@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

تخصص: تازه وارد

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

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

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

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

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

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

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