yuwdsacasoicsd
4 سال پیش توسط yuwdsacasoicsd مطرح شد
18 پاسخ

مشکل پروفایل کاربر

سلام دوستان! دوستان من تو سایت خودم میخوام هر کاربر یک پروفایل داشته باشد و کد ها رو به صورت زیر نوشتم:
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"

می باشد. چیکار کنم؟


ثبت پرسش جدید
حمید رضا رمضانی
تخصص : توسعه دهنده سرور(Back-End Deve...
@DevHP 4 سال پیش آپدیت شد
1

یه راه دیگه هم هست آن هم 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');

\اگه کلا نشد دو تا احتمال داره

  1. اون فیلدی یا پارامتری رو که برای روت درنظر گرفتی تو فیلد دیتابیست نیست که فکر نکنم :)
    2.اون کاربر وجود نداره
    \
    اگه خواستی پروژتو برام بفرست
    09356401828
    خواستی هم بفرستی تو همین دیسکاس منو تگ کن تا بدونم که میفرستی موفق باشی
    @mohammad.ar

سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 4 سال پیش مطرح شد
1

اگر کاربر لاگین باشه میتونی از هلپرفاکشن زیر استفاده کنید

auth()->user()->name

yuwdsacasoicsd
تخصص : برنامه نویس
@wenom 4 سال پیش مطرح شد
0

@juza66
ممنون که پاسخ دادید. دوست عزیز میخوام ی چیزی شبیه مال راکت باشه.میخوام وقتی بر روی کاربر کلیک شد پروفایلش رو نگاه کنه.


فرید عقیلی
تخصص : طراح و توسعه دهنده وب
@faridaghili 4 سال پیش مطرح شد
1

به مدل User یه متد جدید مثلا با نام getProfileUrl اضافه کنید
از اون متد لینک پروفایل کاربر رو برگردونید
در ویو هم با استفاده از دستوری auth()->user()->getProfileUrl() لینک پروفایل کاربر رو بگیرید و در یک تگ a قرار بدید


حمید رضا رمضانی
تخصص : توسعه دهنده سرور(Back-End Deve...
@DevHP 4 سال پیش مطرح شد
1

در قسمت 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 تون قرار داره هم اسم با اون متغیر ورودی متدتون باشه، ولی بر اساس مستندات لاراول باید اون پارامتر و متغیر هم اسم مدل شما باشه

@abdorrhmanimohammad


yuwdsacasoicsd
تخصص : برنامه نویس
@wenom 4 سال پیش مطرح شد
0

@hamidrezaramezani.hp
ممنون که پاسخ دادید. داداش در این صورت 404 میاره.


yuwdsacasoicsd
تخصص : برنامه نویس
@wenom 4 سال پیش مطرح شد
0

@faridaghili
ممنون که پاسخ دادید. منم از متد path استفاده کردم.
من در لینک پروفایل مشکل ندارم. فقط در قسمت برگشت نشدن اطلاعات user مشکل دارم.


حمید رضا رمضانی
تخصص : توسعه دهنده سرور(Back-End Deve...
@DevHP 4 سال پیش مطرح شد
0

یادتان باشه هر دو باید یک نام داشته باشند اگه از اون دو راه هم نشد ربط به دیتا داره که اصلا همچین دیتایی وجود نداره تو table یوزرتون بی زحمت کل UserController تون رو بزارید همرا با مدل user و route هم بزارید تا بنده ببینم و مشکلشو بهتون بگم

@mohammad.ar


yuwdsacasoicsd
تخصص : برنامه نویس
@wenom 4 سال پیش مطرح شد
0

@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'));
    }

حمید رضا رمضانی
تخصص : توسعه دهنده سرور(Back-End Deve...
@DevHP 4 سال پیش مطرح شد
0

خوب تو خروجی dd چی نشون میده

@mohammad.ar


yuwdsacasoicsd
تخصص : برنامه نویس
@wenom 4 سال پیش مطرح شد
0

@hamidrezaramezani.hp
تست میکنم که برمیگرده یا نه!!


حمید رضا رمضانی
تخصص : توسعه دهنده سرور(Back-End Deve...
@DevHP 4 سال پیش مطرح شد
0

منظور من اینه که بازهم همون خروجی برمیگردونه

خوب نشد از 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


yuwdsacasoicsd
تخصص : برنامه نویس
@wenom 4 سال پیش مطرح شد
0

در این روش هم مثل قبل بود 404 برگشت داد:(

@hamidrezaramezani.hp


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 4 سال پیش مطرح شد
1

این دوستمون تمام راه ها رو بهت گفت حالا خودت باس بگردی ببین مشکل چیه!


حمید رضا رمضانی
تخصص : توسعه دهنده سرور(Back-End Deve...
@DevHP 4 سال پیش آپدیت شد
1

یه راه دیگه هم هست آن هم 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');

\اگه کلا نشد دو تا احتمال داره

  1. اون فیلدی یا پارامتری رو که برای روت درنظر گرفتی تو فیلد دیتابیست نیست که فکر نکنم :)
    2.اون کاربر وجود نداره
    \
    اگه خواستی پروژتو برام بفرست
    09356401828
    خواستی هم بفرستی تو همین دیسکاس منو تگ کن تا بدونم که میفرستی موفق باشی
    @mohammad.ar

محسن مهری
تخصص : برنامه نویس back-end با زبان...
@mohsen.mehri6101 4 سال پیش آپدیت شد
1

سلام @mohammad.ar یک سوال داشتم الان این تابعتون درست کار میکنه ؟


public function path(){
        $locale = app()->getLocale();
        return "/$locale/profile/$this->slug";
    }

چون به نظرم درستش باید اینطوری باشه

public function path(){
        $locale = app()->getLocale();
        return "/{$locale}/profile/$this->slug";
    }

حمید رضا رمضانی
تخصص : توسعه دهنده سرور(Back-End Deve...
@DevHP 4 سال پیش مطرح شد
0

جالبه آقای محمد من هم الان به همین مشکل خوردم تو پروژه ام اگه هیچکدومش انجام نشده تو متد UserProfile که تو کنترولته dd کن متغیر ورودیتو ببین چی میشه؟


yuwdsacasoicsd
تخصص : برنامه نویس
@wenom 4 سال پیش مطرح شد
0

@mohsen.mehri6101
ممنون که پاسخ دادید ولی درسته کار میکنه . در بخش های دیگه از پروژه همین شکل نوشتم ولی کار میکنه.


yuwdsacasoicsd
تخصص : برنامه نویس
@wenom 4 سال پیش مطرح شد
0

@hamidrezaramezani.hp
دمت گرم! خودشه! ممنون!


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام