یلدا ادامه داره... ❤️ ۴۰ درصد تخفیف همه دورهها
استفاده از تخفیفهاسلام خدمت دوستان
نمیدونم قبلا این بحث مطرح شده یا خیر
ولی میخوام نظر دوستان رو بدونم که وقتی پروژه ای با لاراول میزنن که دو بخش 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 متفاوت داریم
ادبیاتتون هم خوب نیست، برو حال کن و ... چنین چیزی من از شما نخواستم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟