سلام دوستان! دوستان من تو سایت خودم میخوام هر کاربر یک پروفایل داشته باشد و کد ها رو به صورت زیر نوشتم:
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
ممنون که پاسخ دادید. دوست عزیز میخوام ی چیزی شبیه مال راکت باشه.میخوام وقتی بر روی کاربر کلیک شد پروفایلش رو نگاه کنه.
به مدل User یه متد جدید مثلا با نام getProfileUrl اضافه کنید
از اون متد لینک پروفایل کاربر رو برگردونید
در ویو هم با استفاده از دستوری auth()->user()->getProfileUrl()
لینک پروفایل کاربر رو بگیرید و در یک تگ a قرار بدید
در قسمت 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 تون قرار داره هم اسم با اون متغیر ورودی متدتون باشه، ولی بر اساس مستندات لاراول باید اون پارامتر و متغیر هم اسم مدل شما باشه
@faridaghili
ممنون که پاسخ دادید. منم از متد path استفاده کردم.
من در لینک پروفایل مشکل ندارم. فقط در قسمت برگشت نشدن اطلاعات user مشکل دارم.
یادتان باشه هر دو باید یک نام داشته باشند اگه از اون دو راه هم نشد ربط به دیتا داره که اصلا همچین دیتایی وجود نداره تو table یوزرتون بی زحمت کل UserController تون رو بزارید همرا با مدل user و route هم بزارید تا بنده ببینم و مشکلشو بهتون بگم
@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'));
}
منظور من اینه که بازهم همون خروجی برمیگردونه
خوب نشد از 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'));
}
یه راه دیگه هم هست آن هم 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');
\اگه کلا نشد دو تا احتمال داره
سلام @mohammad.ar یک سوال داشتم الان این تابعتون درست کار میکنه ؟
public function path(){
$locale = app()->getLocale();
return "/$locale/profile/$this->slug";
}
چون به نظرم درستش باید اینطوری باشه
public function path(){
$locale = app()->getLocale();
return "/{$locale}/profile/$this->slug";
}
جالبه آقای محمد من هم الان به همین مشکل خوردم تو پروژه ام اگه هیچکدومش انجام نشده تو متد UserProfile که تو کنترولته dd کن متغیر ورودیتو ببین چی میشه؟
@mohsen.mehri6101
ممنون که پاسخ دادید ولی درسته کار میکنه . در بخش های دیگه از پروژه همین شکل نوشتم ولی کار میکنه.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟