سلام خدمت دوستان
نمیدونم قبلا این بحث مطرح شده یا خیر
ولی میخوام نظر دوستان رو بدونم که وقتی پروژه ای با لاراول میزنن که دو بخش User و Admin داره
با فرض اینکه ممکنه دیتای response و یا دیتای request متفاوت باشه
واسه هر کدام Controller های جدا میسازین ؟
اگر پاسخ بالا خیرِ ، متد ها را جدا سازی میکنین ؟ یا باز هم همه رو داخل یه متد مینویسین و با شرط چک می کنید که آیا کاربر ادمینه یا خیر ؟
من پروژه هایی که قبلا خودم زدم بخش ادمین و یوزر کاملا از هم جدا بود ، جدیدا یه پروژه ای هست که قبلا فرد دیگه ای توسعه داده و همه رو در هم نوشته
در کل روشی که خودم پیش میرفتم خیلی مرتب تر بود و دیباگش خیلی راحت ، فقط یه عیبی داشت که کدها گاها تکرار میشدن
مورد دوم از بس داخل متد ها و blade ها شرط گذاشته به سختی میشه درک کرد
میخواستم بدونم روش اصولی تر از نظر توسعه دهندگان لاراول کدومه ؟
همچنین این موارد برای blade هم سواله که دوباره اینا جدا از هم باشن یا یکی
تشکر
@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 استفاده کنی
برو حال کن :)
@yk5742g
اصلا بحث من سطح دسترسی نیست
ما صرفا دو نوع کاربر داریم که یا مدیر سیستم هستند (با سطح دسترسی متفاوت که اصلا ملاک نیست ) و یکسری کاربر عادی ، که این کاربران عادی در داده های دریافتی و همچنین داده های ارسالی متفاوت هستند
با فرض اینکه سیستم تیکت داریم که کاربر تیکت ثبت میکنه و user_id میشه آیدی کاربر فعلی ، در سطح مدیریت هم مدیر میتونه واسه بقیه کاربران تیکت ثبت کنه و user_id را از request میگیره ( حالا اینکه این ادمین به تیکت ها دسترسی داشته باشه یا خیر بحثش جداست)
سوال من اینه که بهتره دوتا کنترلر ( یا یک کنترل و دو متد ) داشته باشیم واسه این کار ، یا داخل یه متدبا شرط چک بشه اگه کاربر فعلی ادمین بود از user_id که از request ارسال شده استفاده کنه ، یا یکسری اطلاعات بیشتری کاربر ادمین ارسال کنه و بخوایم با این تیکت ذخیره کنیم
که خب اگر بحث validation هم بهش اضافه کنیم دو تا rules متفاوت داریم
ادبیاتتون هم خوب نیست، برو حال کن و ... چنین چیزی من از شما نخواستم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟