سلام من یه سوالی داشتم
ببینید من یه مشکلی دارم که مثلا کاربر میخواد برای پستی کامنتی بذاره
خوب من post_id داخل input هیدن میذارم و میفرستم
ولی توی inspect هیدن نیست و میشه تغییرش داد
مثلا کاربر میتونه بره post_id=88 رو بکنه post_id=70 و کامنت اون برای پست 70 ارسال میشه
داخل همین انجمن راکت
من میتونم توی textarea با استفاده از inspect شناسه سوال رو دربیارم و برم توی یک سوال دیگه شناسه رو جایگزین کنم و جواب رو بدم
و جواب برای سولی که شناسه اش رو دستی وارد کردم ارسال میشه
چطوری میشه جلوی این کار رو گرفت و نگذاشت که کاربر اصلا id رو ببینه که بتونه تغییرش بده
با تشکر
با استفاده از Route-Model Binding نمونه ی مدلی که میخواهیم عملیاتی بر روی اون انجام دهیم به عنوان پارامتر به route افزوده میشه. برای مثال به جای افزودن ID پست، میتونید نمونه ایجاد شده از مدل پست را به کنترلر بفرستید.
به زبان کد اگر بخواهیم بگیم:
Route زیر رو در نظر بگیرید
Route::get('post/{post}', 'PostController@show');
کد در کنترلر بدون Route-Model Binding :
<?php
namespace App\Http\Controllers;
use App\Post;
class PostController extends Controller
{
public function show($id) {
$post = Post::find($id);
return $post
}
}
کد در کنترلر با Route-Model Binding :
<?php
namespace App\Http\Controllers;
use App\Post;
class PostController extends Controller
{
public function show(Post $post) {
return $post
}
}
بجای استفاده از <Input> هیدن برای مقدار post_id میشه از ریلیشنشیپ های بین مدلها استفاده کرد
$post->comment()->save([
'comment_body' => 'foo bar',
'user_id' => auth()->user()->id
]);
در این حالت مقدار post_id بصورت اتوماتیک مقداردهی میشه.
@tabeshr
سلام
ببییند این کار آسیبی به سایت نمیزنه
فرض کنید post_id رو تغییر بده . چه اتفاقی میافته ؟
ولی یک کاری میتونید بکنید که خیلی نمیپنسدم
اونم اینکه که فرض کنید آدرس پست شما این باشه : site.com/post/laravel-controllers
(مثلا این laravel-controllers آدرس یا همون slug شما هست)
توی فرمی که کامنت رو سابمیت میکنه به action مقدار ندین که رد نتیجه فرم سابمیت میشه به همون آدرس site.com/post/laravel-controllers ، (یا حتی میتونید مقدار action رو همین site.com/post/laravel-controllers بدین)
حالا میتونید یک route با متد post بسازین که با slug کار کنه و دیگه id ندین
مثلا
Route::get('post/slug','HomeController@show_post');
Route::post('post/slug','HomeController@store_comment');
از نظر امنیتی مشکلی وجود نداره ولی اگر بخوای جلوش رو بگیری بهترین کار اینه که id رو با یه کلید خاص رمز گذاری کنی بفرستی داخل input hidden و موقع گرفتن درخواست مقدار رمزگذاری شده رو با کلید خاص دوباره به id برگردونی .
سلام
یه راه دیگه این هست که وقتی شما وارد اون پُست خاص میشید، آی دی اون پُست رو توی session ذخیره کنید
و در کلاس مورد نظرتون که عملیات درج رو انجام میدید، از اون Session بخونید
البته من این کار رو برای پروژه هایی که از معماری خاصی استفاده نمیکنن انجام میدم، نمیدونم برای لاراول منطقی هست یا نه و از قوانین mvc پیروی میکنه یا خیر
با استفاده از Route-Model Binding نمونه ی مدلی که میخواهیم عملیاتی بر روی اون انجام دهیم به عنوان پارامتر به route افزوده میشه. برای مثال به جای افزودن ID پست، میتونید نمونه ایجاد شده از مدل پست را به کنترلر بفرستید.
به زبان کد اگر بخواهیم بگیم:
Route زیر رو در نظر بگیرید
Route::get('post/{post}', 'PostController@show');
کد در کنترلر بدون Route-Model Binding :
<?php
namespace App\Http\Controllers;
use App\Post;
class PostController extends Controller
{
public function show($id) {
$post = Post::find($id);
return $post
}
}
کد در کنترلر با Route-Model Binding :
<?php
namespace App\Http\Controllers;
use App\Post;
class PostController extends Controller
{
public function show(Post $post) {
return $post
}
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟