درود دوستان...
می خوام برخی قابلیت ها از دید کاربران مهمان مخفی کنم...
مثلا کاربر شماره ۱ می توانند نوشته های خود را در نمایه خود ویرایش و حذف کند, ولی کاربر شماره ۲ نمی تواند نوشته های کاربر شماره ۱ ویرایش و حذف کند, این مشکل در نمایه حل شده ولی در ادامه نوشته ها (show.blade.php) این قابلیت ها نشون میده.
کد زیر را به کار بردم و خطا میده:
@if(Auth::user()->id == $endWorld->user_id)
@else
<div class="float-left" style="display:flex;">
<a href="{{ route('endWorld.edit', $endWorld->id) }}" class="btn btn-warning btn-sm">ویرایش</a>
<form action="{{ route('endWorld.destroy', $endWorld->id) }}" method="post">
@csrf
@method('DELETE')
<input type="submit" value="حذف" class="btn btn-danger btn-sm">
</form>
</div>
@endif
...
public function show($slug, User $user)
{
$endWorld= EndWorld::where('id', $slug, 'user_id', $user->id)->orWhere('slug', $slug)->firstOrFail()->get();
return view('endWorld.show', compact('endWorld', 'user'));
}
خطای زیر:
Illuminate\Database\QueryException
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax to use near '`slug` = ? limit 1' at line 1 (SQL: select * from `endWorldes` where `id` = tst-1 `slug` = tst-1 limit 1)
بهتره از قابلیت policy و دستور can استفاده کنید.
داخل policy اینکه چه کسی به چی دسترسی داره رو تعریف کنید و بعدش درون blade اون رو با can مدیریت کنید.
http://laravel-school.com/posts/an-introduction-to-laravel-policy-15
@hesammousavi
این در در نمایه استفاده شده و کار کرده .. می خوام در خود نوشته ها استفاده کنم کار نمی کنه:
کد زیر:
class ProfileController extends Controller
{
public function index(User $user)
{
$endWorld= EndWorld::where('user_id', $user->id)->get();
return view('profile.index', compact('user', 'endWorld'));
}
}
کد زیر که گفتی برای EndworldController هستش..
EndWorld::where('id', $slug, 'user_id', $user->id)
متد where سه حالت داره
یا سه تا متغییر میگیره که یکیش اخیاریه
یا ارایه میگیره(که باید از این روش استفاده کنین)
یا کلوژز همون تابع بدون نام
یعنی کد شما باید به صورت زیر در بیاد
EndWorld::where([['id', $slug], ['user_id', $user->id]])
ویا
EndWorld::where('id', $slug)->where('user_id', $user->id)
@tefo.ha27
روش اول و دوم متد where تست کردم, کار نکرد.
خطای زیر:
Property [title] does not exist on this collection instance.
Schema::create('endWorldes', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('title');
$table->integer('user_id');
$table->string('slug');
$table->text('description');
$table->string('image')->nullable();
$table->timestamps();
});
Collection {#558 ▼
#items: array:3 [▼
0 => EndWorld{#554 ▼
#connection: "mysql"
#table: "endWorldes"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:8 [▶]
#original: array:8 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
#guarded: array:1 [▼
0 => "*"
]
}
1 => EndWorld {#555 ▼
#connection: "mysql"
#table: "endWorldes"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:8 [▶]
#original: array:8 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
#guarded: array:1 [▼
0 => "*"
]
}
2 => EndWorld {#556 ▼
#connection: "mysql"
#table: "endWorldes"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:8 [▶]
#original: array:8 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
#guarded: array:1 [▼
0 => "*"
]
}
]
}
خب احتمالا درست باشه خودتون چک کنین attributes توش title وجود داره؟
ولی الان سوالم اینه title رو چجوری نوشتین که اررور میده
#attributes: array:8 [▼
"id" => 1
"title" => "تست ۱"
"user_id" => 1
"slug" => "tst-1"
"description" => "تست ۲"
"image" => "1565636317.jpg"
"created_at" => "2019-08-12 18:58:37"
"updated_at" => "2019-08-12 18:58:37"
]
...
{{ $endWorld->title }}
@tefo.ha27
حلقه رو گذاشتم, کل نوشته رو توی ادامه نوشته نشون داد...
اصلا نباید توی ادامه نوشته حلقه گذاشت...
باید بگم وقتی که سوالی میخواید بپرسید یک سری نکات رو باید رعایت کنید در غیر اینصورت ساعت ها اگه سوال خودتون رو مطرح کنید به پاسخ نمیرسید چون کسی متوجه نمیشه چیکار میخواید کنید و سر در نمیاره از کاراتون. اول اینکه یکسری نکات توی کد شما اصلا رعایت نشده
۱− نام مایگرشن ها و کلاس های مدل شما مفهومی نیست کلمه endWorldes یعنی چی؟ و به چه منظوری استفاده میشه؟
۲− دقیقا میخواید چیکار کنید؟ به سوال شما جواب داده شد و درست هم بود! اما یک سوال دیگه مطرح کردین در ادامه ی سوال قبلی! بهتر بود این سوال رو کلا مستقل ایجاد میکردید.
۳− قطعه کدی که میخواید تصحیح بشه به صورت کامل چیه؟ همشو باید کامل ارسال کنید. شاید مشکل کلا از یه قسمت دیگه ای باشه که شما در تشخیص اون اشتباه کردین.
@hesammousavi بهتر بود اقای موسوی برای تمام سوال هایی که قراره پرسیده بشه همون اول مثل گیت هاب یه template میذاشتن که کاربران با پر کردن اون سوال رو مطرح کنن. مثلا اینکه ورژن نرم افزاریشون چیه + سیستم عاملشون چیه (یه چیزی مثل تمپلیت issue توی گیت هاب)
خیلی از سوال هایی که مطرح میشه صرفا فقط مطرح شده و ارزش نداره بخواد ادم حتی نگاه کنه بهشون چه برسه بخواد پاسخ بده! طرف بدون هیچ جستجو و تحقیق و اصلا اطلاعات علمی کامپیوتر رو روشن کرده میخواد کدنویسی کنه و هر سوالی که براش پیش میاد یهو میاد میپرسه و وقت ده ها نفر دیگه رو میگیره اخرشم به نتیجه نمیرسه و دلیلش اینه که خودش نمیدونه داره چیکار میکنه و حتی بار فنی کافی نداره.
کد زدن اخرین مرحله ی انجام یک پروژه هست. قبلش باید حداقل یک هفته تحقیق بشه و به بار فنی کافی در مورد استفاده از ابزار ها و مفاهیم پروژه رسید. در اخر بشینیم و کدنویسی کنیم. خیلی افراد لاراول رو حتی بلد نیستن و یهو میخوان یه چیزی با لاراول بسازنن! خب عزیز من اول یه مطالعه کن چهارتا ویدیو اموزشو ببین و مستندات لاراول رو بخون بعد کدنویسی کن. نه وقت خودتو بگیر نه بقیه رو.
@khanzadimahdi
در مورد آخر بگم ... من کم و بیش به لاراول آشنایی دارم و ویدیو های لاراول تماشا می کنم ...
مشکلی که داره بخوام چیزی رو پیاده کنم که خود ویدیو آموزش نداده...
کدهایی که نوشتم سالمه , ولی اون بخشی که بخوام پیاده کنم در بخش های دیگر تداخل ایجاد می کنه و خطاهای که جستجو می کنم اصلا جوابی وجود نداره...
۱. اسم پایگاه داده است(اسم پایگاه داده discusses هستش ولی به دلخواه موقع ارسال پست نام کاربری خودم قرار دادم)
۲. می خوام قابلیتی برای کاربران مهمان و عضو شده مخفی کنم, یعنی کاربر اول عضو شده در نمایه خود قابلیت مثلا ویرایش و حذف پست خود دارد, ولی کاربر دوم نمی تواند در نمایه کاربر اول قابلیت ویرایش و حذف پست داشته باشد و برعکس ...این مورد توی نمایه حل شده...
حالا می خوام توی ادامه نوشته کاربران این قابلیت اجرا کنم دقیقا مثل قابلیت نمایه باشه..
۳.کدی که ارسال کردم کامله...
بهتره از قابلیت policy و دستور can استفاده کنید.
داخل policy اینکه چه کسی به چی دسترسی داره رو تعریف کنید و بعدش درون blade اون رو با can مدیریت کنید.
http://laravel-school.com/posts/an-introduction-to-laravel-policy-15
خط زیر رو به policy انتقال بدید و به جای if از can استفاده کنید. کد تمیز تر و کمتر میشه.
Auth::user()->id == $discuss->user_id
و اینکه درون کنترلر ها هم policy رو بنویسید. چک کردن سطوح دسترسی سمت فرانت صرفا باعث امنیت نمیشه! سمت فرانت طرف میتونه کلیک راست کنه دکمه ادیت اظافه کنه و بعد ادیت بزنه.
سمت سرور هم باید چک بشه که من توی کدهای شما ندیدم. در کل از policy توی این موارد استفاده کنید.
من توی موردی که مطرح کردم جسارت نکردم به سطح دانش شما. منظورم با اقای موسوی بود تا سایت بهتر بتونه فعالیت کنه.
@hesammousavi
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟