راکت

مشکل ویرایش پروفایل در laravel

این فرم رو برای کار بر قرار دادم تا بتونه ویرایش کنه اطلاعاتش رو

اسم فرم index.blade.php که در مسیر veiw /userPanel قرار داره

@extends('layouts.master')

@section('title', 'UserPanel')

@section('content')

<div class="Profile" dir="rtl">
    <div class="row container">

        <aside class="sidebarWrap sidebar-group col-sm-12 col-md-4 col-lg-3 col-xl-3 ">
            @include('userPanel.sidebar')
        </aside>

        <div id="main" class="col-sm-12 col-md-8 col-lg-9 col-xl-9">
            <div class="personal_information">
                <p class="bold" id="blue_icon" class="">اطلاعات شخصی</p>
            </div>
            <div class="row container personal_information">
                <div class="col-sm-12 col-md-12 col-lg-12 col-xl-12">
                    <div class="tab-content">
                        <div class="tab-pane active" id="home">
                            <form class="form row" action="{{ route('userPanel.update', $user->id) }}" method="POST" id="registrationForm"
                                style="margin-bottom: 0px;padding-right: 0.75rem;font-size: 18px;font-weight: bold;">
                                @csrf
                                @method('PATCH')
                                <div class=" col-sm-12 col-md-12 col-lg-6 col-xl-6">
                                    <div class="form-group">
                                        <div class="col-xs-6">
                                            <label for="first_name">
                                                <p>نام و نام خانوادگی:</p>
                                            </label>
                                            <input type="text" class="form-info" name="first_name" id="first_name"
                                                value="{{ $user->name }}" placeholder="نام و نام خانوادگی"
                                                title="enter your first name if any.">
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <div class="col-xs-6">
                                            <label for="nationalCode">
                                                <p>کد ملی:</p>
                                            </label>
                                            <input dir="ltr" type="text" class="form-info" name="nationalCode"
                                                id="nationalCode" placeholder="" title="enter your nationalCode.">
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <div class="col-xs-6">
                                            <label for="dateOfBirth">
                                                <p>تولد:</p>
                                            </label>
                                            <input dir="ltr" type="text" class="form-info" name="dateOfBirth"
                                                id="dateOfBirth" placeholder="" title="enter your nationalCode.">
                                        </div>
                                    </div>
                                </div>
                                <div class="col-sm-12 col-md-12 col-lg-6 col-xl-6 ">
                                    <div class="form-group">
                                        <div class="col-xs-6">
                                            <label for="mobile">
                                                <p>شماره موبایل:</p>
                                            </label>
                                            <input dir="ltr" type="text" name="phone" id="phone" class="form-info"
                                                value="{{ $user->phone }}"
                                                placeholder="شماره موبایل">
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <div class="col-xs-6">
                                            <label for="email">
                                                <p>ایمیل:</p>
                                            </label>
                                            <input dir="ltr" type="email" class="form-info" name="email" id="email"
                                                value="{{ $user->email }}" placeholder="you@email.com"
                                                title="enter your email.">
                                        </div>
                                    </div>
                                    <div class="form-group">

                                        <div class="col-xs-6">
                                            <label for="email">
                                                <p>شماره کارت شخصی:</p>
                                            </label>
                                            <input dir="ltr" type="email" class="form-info" id="location" placeholder=""
                                                title="enter a location">
                                        </div>
                                    </div>
                                </div>
                                <button class="btn btn-submit " type="submit">ویرایش</button>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

</div>

@endsection

این کنترلر رو هم براش ایجاد کردم اسمش userInfoController

<?php

namespace App\Http\Controllers\Profile;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Validation\Rule;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class userInfoController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $user = Auth::user();
        return view('userPanel.index', compact('user'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit(User $user)
    {
        return view('userPanel.index', compact('user'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, User $user)
    {
        $data = $request->validate([
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],
        ]);

        $user->update($data);

    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

این هم قسمت روتش هست

Route::namespace('Profile')->middleware(['auth','verified'])->group(function(){
    Route::resource('/userPanel', 'userInfoController');

اطلاعات رو نمایش میده به درستی ولی وقتی تغییر میدم نام یا ایمیل رو و روی دکمه ویرایش میزنم صفحه refresh میشه و اطلاعات تغییری نمی کنه مشکل چیه؟

این قسمت هم از $request که dd گرفتم مشخصات کاربری رو که لاگین کرده بود رو برگردوند

 public function update(Request $request, User $user)
    {
        dd($request);
        $data = $request->validate([
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],
        ]);

اینجا هم از $data که dd میگیرم چیزی برنمیگردونه

 public function update(Request $request, User $user)
    {
        $data = $request->validate([
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],
        ]);
        dd($data);

        $user->update($data);

    }

ثبت پرسش جدید
مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi5 سال پیشمطرح شد
2

نه خود $user رو
احتمالا مقدار id يوزر رو داره
اگر اينطور بود

$user = User::find($user)

بايد مشكلو حل كنه يا اينكه از خود

        $user = Auth::user();

استفاده كنيد.


مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi5 سال پیشمطرح شد
1

شما تو فرمي كه نوشتيدي چيزي به اسم

name="name"

بر نميگردونيد، به همين دليل فكر ميكنم validation اون pass نميشه


محمدهادی باقریان
محمدهادی باقریان
تخصص :web developer
@mohammadhadi5 سال پیشمطرح شد
0

@mehranmarandi90 بله درست شد اون قسمتش ممنون name رو برای input اشتباه تعریف کرده بودم
یه مشکل دیگه ای که هست اینه که وقتی اسم رو ویرایش میکنم
این خطا میاد The email has already been taken. در صورتی که اینجا براش تعریف کردم که اگه ایمیل خود کا بر بود خطا نگیره از dd($user->id); گرفتم ایدی یوزر رو null بر میگردونه مشکلش چیه؟

'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],

این قسمت dd گرفتم اطلاعات فیلد ها رو نمایش داد تا اینجا اوکیه ولی

public function update(Request $request, User $user)
    {
        $data = $request->validate([
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],
        ]);
        dd($data);

        $user->update($data);
        return redirect(route('userPanel.index'));
    }

و یه مشکل دیگه ین که من ایمیل رو عوض میکنم و رو دکمه ویرایش میزنم اطلاعات ویرایش نمیشه باز


مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi5 سال پیشمطرح شد
1

به جاي

Rule::unique('users')->ignore($user->id)

از اين استفاده كنيد

Rule::unique('users')->ignore($user)

محمدهادی باقریان
محمدهادی باقریان
تخصص :web developer
@mohammadhadi5 سال پیشمطرح شد
0

@mehranmarandi90 ممنون این مشکل هم حل شد ولی هنوز اطلاعات ثب نمیشه تو دیتابیس باید چیار کنم؟


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

چك كنيد name و email در $fillable مدل user وجود داشته باشن


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

درود...
User.php
کد زیر:

protected $fillable = [
        'name',
        'email',
        'password',
    ];

سبحان دادخواه
سبحان دادخواه
تخصص :دانشجوی برنامه نویسی :)
@SobhanDadkhah5 سال پیشمطرح شد
2

با سلام. مواردی که دوستان گفتند چک کنید اما من فکر میکنم email بصورت دیفالت یک fillable column هست وقتی شما اپ لاراولی رو نصب میکنید.
این مورد رو هم چک کنید که متغیر یوزرتون آبجکت یوزر فعلی برمیگردونه یا خیر ؟ چون اگر کاربر لاگین باشه ( که قطعا موقع ویرایش اطلاعات لاگین هست) و همه پارامتر ها درست به Route مربوط به اپدیتتون فرستاده بشه باید متغیر $user در کنترلر یک ابجکت از یوزر فعلی باشه. اونجایی که گفتین user->id$ نال هست قاعدتا نباید نال باشه. همونطوری که گفتم زمانی که $user یک ابجکت باشه میتونید متد update رو روش صدا بزنید.


محمدهادی باقریان
محمدهادی باقریان
تخصص :web developer
@mohammadhadi5 سال پیشمطرح شد
مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi5 سال پیشمطرح شد
1

پس همونطور كه دوستمون گفتن چك كنيد متغيير $user يك آبجكت باشه


محمدهادی باقریان
محمدهادی باقریان
تخصص :web developer
@mohammadhadi5 سال پیشمطرح شد
1

@mehranmarandi90 @SobhanDadkhah به چه صورتی باید بنویسمش رهنمایی میکنید

این قسمتی هست که $user رو مقدار دهی کردم توی اینجا dd($user->id); ایدی یوزر رو بر میگردونه
ولی توی متد update مقدارش رو null برمیگردونه

public function index()
    {
        $user = Auth::user();
        return view('userPanel.index', compact('user'));
    }

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

لطفا تو متد update خودتون dd كنيد و ببينيد $user چه مقداري داره


محمدهادی باقریان
محمدهادی باقریان
تخصص :web developer
@mohammadhadi5 سال پیشمطرح شد
مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi5 سال پیشمطرح شد
2

نه خود $user رو
احتمالا مقدار id يوزر رو داره
اگر اينطور بود

$user = User::find($user)

بايد مشكلو حل كنه يا اينكه از خود

        $user = Auth::user();

استفاده كنيد.


محمدهادی باقریان
محمدهادی باقریان
تخصص :web developer
@mohammadhadi5 سال پیشمطرح شد
2

@mehranmarandi90 از این داخل متد update ستفده کردم درست شد خیلی ممنون لطف کردید❤️

$user = Auth::user();

سبحان دادخواه
سبحان دادخواه
تخصص :دانشجوی برنامه نویسی :)
@SobhanDadkhah5 سال پیشمطرح شد
2

خوشحالم که مشکلتون حل شده - نکته ای که هست اگر دوست دارید خودتون رو به چالش بکشید روشی که اول استفاده کردین بهش Route Model Binding گفته میشه . یعنی به عنوان پارامتر روت مربوط به ویرایش کاربر ، یوزر کاربر ارسال میشه و سپس در کنترلر با تایپ هینت کردن مدل User لاراول اتوماتیک اون یوزر رو واکشی میکنه.

 // => User $user ---> route model binding
public function update(Request $request, User $user) 
    {

    }

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


محمدهادی باقریان
محمدهادی باقریان
تخصص :web developer
@mohammadhadi5 سال پیشمطرح شد
1

@SobhanDadkhah
به این صورت که نوشتم درست شد

public function update(Request $request, User $userPanel)
    {
        $data = $request->validate([
            'name' => ['required', 'string', 'min:3', 'max:25'],
            'email' => ['required', 'string', 'email', 'min:11', 'max:40', Rule::unique('users')->ignore($userPanel->id)],
            'phone' => ['numeric', 'min:11','regex:/^([0-9\s\-\+\(\)]*)$/', Rule::unique('users')->ignore($userPanel->id)],
        ]);
        $userPanel->update($data);

        return redirect(route('userPanel.index'));
    }

این رو هم توی action فروم نوشتم

action="{{ route('userPanel.update', ['userPanel' => $user->id]) }}"

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

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