سلام دوستان! دوستان من تو سایت خودم میخوام هر کاربر یک پروفایل داشته باشد و کد ها رو به صورت زیر نوشتم:
Route :
Route::get('/profile/{username}' , 'HomeController@UserProfile');
User Model :
public function path(){
$locale = app()->getLocale();
return "/$locale/profile/$this->slug";
}
HomeController:
public function UserProfile(User $user){
return view('User.profile.user' , compact('user'));
}
و در ویو به صورت:
{{$user->name}}
و هیچی برنمیگرده و dd گرفتم به صورت زیر:
#fillable: array:14 [▶]
#hidden: array:2 [▶]
#casts: array:2 [▶]
#connection: null
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: false
+wasRecentlyCreated: false
#attributes: []
#original: []
#changes: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#visible: []
#guarded: array:1 [▶]
#rememberTokenName: "remember_token"
می باشد. چیکار کنم؟
یه راه دیگه هم هست آن هم Explicit Binding که زیاد هم استاندارد نیست چون برای اینکه شما علاوه بر اینکه مثلا با slug روت رو بالا میاری با چیز دیگری هم بالا بیاری.(یعنی هر جا خواستی از یکی استفاده کنی ولی الان با شرایط شما ما فقط از یکیش استفاده میکنیم). تو دارکتوری Providers تو RouteServiceProvider.php توی متد boot این رو وارد میکنید زیر این متد parent که پایینیه
parent::boot();
متد پایینو رو زیر متد بالایی وارد کن
Route::bind('user', function ($value) {
return App\User::where('name', $value)->firstOrFail();
});
میتونی به جای 'user' از هر نوع فیلدی که تو دیتابیست هست و هم به جای 'name' میتونی از slug استفاده کنی پس برو تو روت و تو قسمت پارامتر هم اون رو وارد کن که تو این متدی که بهت گفتم و تو متد کنترولرت :
public function UserProfile(User $user){
return view('User.profile.user' , compact('user'));
}
روت هم :
Route::get('/profile/{user}' , 'HomeController@UserProfile');
\اگه کلا نشد دو تا احتمال داره
@juza66
ممنون که پاسخ دادید. دوست عزیز میخوام ی چیزی شبیه مال راکت باشه.میخوام وقتی بر روی کاربر کلیک شد پروفایلش رو نگاه کنه.
شاید پاسخ شما همینجا باشد
در قسمت Route تون پارامتر username رو به user یا اون متغیری که در ورودی متد UserProfile قرار دادید رو به username تغییر دهید (مهم اینه که هر دو اسم یکی داشته باشند)
Route::get('/profile/{user}' , 'HomeController@UserProfile');
public function UserProfile(User $user){
return view('User.profile.user' , compact('user'));
}
اینطوری هم میشه:
Route::get('/profile/{username}' , 'HomeController@UserProfile');
public function UserProfile(User $username){
return view('User.profile.user' , compact('username'));
}
وقتی میخواهید که مدل را برگردونه و دیتا به شما بده باید پارامتری که در Route تون قرار داره هم اسم با اون متغیر ورودی متدتون باشه، ولی بر اساس مستندات لاراول باید اون پارامتر و متغیر هم اسم مدل شما باشه
@hamidrezaramezani.hp
ممنون که پاسخ دادید. داداش در این صورت 404 میاره.
@faridaghili
ممنون که پاسخ دادید. منم از متد path استفاده کردم.
من در لینک پروفایل مشکل ندارم. فقط در قسمت برگشت نشدن اطلاعات user مشکل دارم.
@hamidrezaramezani.hp
اوکی:
مدل User :
<?php
namespace App;
use Carbon\Carbon;
use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Cache;
class User extends Authenticatable
{
use Notifiable;
use Sluggable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password' , 'viptime'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'last_seen' => 'datetime',
'email_verified_at' => 'datetime',
];
public function article(){
return $this->hasMany(Article::class);
}
public function course(){
return $this->hasMany(Course::class);
}
public function comments(){
return $this->hasMany(Comment::class);
}
public function payments(){
return $this->hasMany(Payment::class);
}
public function checkLearning($course){
return !! Learning::where('user_id' , $this->id)->where('course_id' , $course->id)->first();
}
public function WebsiteRequest(){
return $this->hasMany(ContactUs::class);
}
public function isActive(){
return $this->viptime > Carbon::now() ? true : false;
}
public function isAdmin(){
return $this->level == 'admin' ? true : false;
}
/**
* @inheritDoc
*/
public function sluggable(): array
{
return [
'slug' => [
'source' => 'name'
]
];
}
public function path(){
$locale = app()->getLocale();
return "/$locale/profile/$this->slug";
}
}
روت :
Route::get('/profile/{nameSlug}' , 'HomeController@UserProfile');
public function UserProfile(User $nameSlug){
dd($nameSlug);
return view('User.profile.user' , compact('nameSlug'));
}@hamidrezaramezani.hp
تست میکنم که برمیگرده یا نه!!
منظور من اینه که بازهم همون خروجی برمیگردونه
خوب نشد از route model binding استفاده نکنید و از این استفاده کنید
public function UserProfile($nameSlug){
$user = User::findOrFail($nameSlug);
return view('User.profile.user' , compact('user'));
}
public function UserProfile($nameSlug){
$user = User::where('slug' ,$nameSlug);
return view('User.profile.user' , compact('user'));
}
سلام @mohammad.ar یک سوال داشتم الان این تابعتون درست کار میکنه ؟
public function path(){
$locale = app()->getLocale();
return "/$locale/profile/$this->slug";
}
چون به نظرم درستش باید اینطوری باشه
public function path(){
$locale = app()->getLocale();
return "/{$locale}/profile/$this->slug";
}@mohsen.mehri6101
ممنون که پاسخ دادید ولی درسته کار میکنه . در بخش های دیگه از پروژه همین شکل نوشتم ولی کار میکنه.
@hamidrezaramezani.hp
دمت گرم! خودشه! ممنون!