• 28-03-2024, 09:23:17
    #1
    Tek bir formdan add ve update işlemi yapmaya çalışıyorum. Post istediği sorunsuz çalışıyor ancak update fonksiyonu çalışmıyor. Put isteği için 405 (Method Not Allowed) hatası alıyorum.


    <form @submit.prevent="saveEvent">

    saveEvent() {
                    if (!this.params.start || !this.params.end) {
                        this.showMessage('Başlangıç ve Bitiş tarihleri zorunludur.', 'error');
                        return;
                    }
                    let formData = new FormData();
                    formData.append('title', this.params.title);
                    formData.append('start', new Date(this.params.start).toISOString());
                    formData.append('end', new Date(this.params.end).toISOString());
                    formData.append('description', this.params.description);
    
                    const routeUrl = "{{ url('/api/events') }}";
                    const csrfToken = "{{ csrf_token() }}";
                    let url = this.params.id ? `${routeUrl}/${this.params.id}` : routeUrl;
                    let method = this.params.id ? 'PUT' : 'POST';
                    fetch(url, {
                        method: method,
                        body: formData,
                        headers: {
                            'X-CSRF-TOKEN': csrfToken
                        },
                    })
                    .then(response => {
                        if (!response.ok) {
                            throw new Error('Network response was not ok');
                        }
                        return response.json();
                    })
                    .then(data => {
                        if (this.params.id) {
                        // Update event in the calendar
                        let eventIndex = this.events.findIndex(event => event.id === this.params.id);
                        if (eventIndex !== -1) {
                            this.events[eventIndex].title = data.title;
                            this.events[eventIndex].start = data.start;
                            this.events[eventIndex].end = data.end;
                            this.events[eventIndex].description = data.description;
                        }
                    } else {
                        // Add new event to the calendar
                        this.events.push({
                            id: data.id,
                            title: data.title,
                            start: data.start,
                            end: data.end,
                            description: data.description,
                        });
                    }
                        this.calendar.refetchEvents();
                        this.showMessage('Events başarıyla ' + (this.params.id ? 'güncellendi' : 'eklendi') + '.', 'success');
                        this.isAddEventModal = false;
                    })
                    .catch(error => {
                        this.showMessage('Events  ' + (this.params.id ? 'güncellenirken' : 'eklenirken') + ' bir hata oluştu. Lütfen tekrar deneyin.', 'error');
                        console.error('There was a problem with the fetch operation:', error);
                    });
                },
  • 28-03-2024, 10:05:05
    #2
    web.php de uçnoktanı put olarak tanımlamanız lazım.

    kodunuzu burası da patlatıyor olabilir. çünkü sabit bir uç noktaya id değeri varsa put yoksa post yap diyorsunuz.

    let method = this.params.id ? 'PUT' : 'POST';
  • 28-03-2024, 10:24:52
    #3
    Markut adlı üyeden alıntı: mesajı görüntüle
    web.php de uçnoktanı put olarak tanımlamanız lazım.

    kodunuzu burası da patlatıyor olabilir. çünkü sabit bir uç noktaya id değeri varsa put yoksa post yap diyorsunuz.

    let method = this.params.id ? 'PUT' : 'POST';
    Yorumun için teşekkür ediyorum. Ancak web.php de update zaten put olarak tanımlı. Aslında farklı bir note.app'de put işlemi sorunsuz çalışıyor. Ancak bu calendar.js ile bi türlü çalıştıramadım.


    Api.php: 
    
    
    Route::prefix('events ')->group(function () {
        Route::get('/get', [EventController ::class, 'getEvents']);
        Route::get('/view', [EventController::class, 'eventsView']);
        Route::post('/store', [EventController ::class, 'store']);
        Route::put('/update/{id}', [EventController ::class, 'update']);
    });
    Web.php:
    
    
        Route::get('/api/events/get', [EventController  ::class, 'getEvents'])->name('api.events.list');
        Route::get('/api/events /view', [EventController  ::class, 'eventsView'])->name('api.events.view');
        Route::post('/api/events /store', [EventController  ::class, 'store']);
        Route::put('/api/events /update/{id}', [EventController  ::class, 'update']);
  • 03-04-2024, 08:41:17
    #4
    www.pixkare.com
    formunuzda csrf olup olmadığını kontrol edin.
  • 03-04-2024, 21:01:41
    #5
    const routeUrl = "{{ url('/api/events') }}";
    const csrfToken = "{{ csrf_token() }}";
    let url = this.params.id ? `${routeUrl}/${this.params.id}` : routeUrl;
    Rotanız burada /api/events/ID şeklinde oluyor

    Rotalarınız ise /api/events/update/ID şeklinde tanımlı
  • 03-04-2024, 22:19:51
    #6
    Öncelikle ilgilenip cevaplar yazdığınız için teşekkürler.
    • İşlemleri api ile yaptığımız için RouteServiceProvider.php sayfasında yer alan kod yapısında prefix değerlerimiz api 'dir. Bu yapı sabittir. api buradan geliyor yani
    • Son olarak sorunu çözdüm. Verileri gönderim şekli ile alakalı bir sorun vardı.

    $this->routes(function () {
                Route::middleware('api')
                    ->prefix('api')
                    ->group(base_path('routes/api.php'));
                Route::middleware('web')
                    ->group(base_path('routes/web.php'));
            });
    Randevu formundan görsel de gönderdiğimiz için sorun olduğunu düşünüyorum. Çalışan kod yapısı aşağıdaki gibidir. Benzer sorun yaşayanlar için çözüm olur umarım.

    
    const fileInput = document.getElementById('img');
    const file = fileInput.files[0];
    
    
    fetch(url.replace(':id', this.params.id), {
                            method: 'POST',
                            body: formData,
                            headers: {
                                'X-HTTP-Method-Override': method,
                                'X-CSRF-TOKEN': csrfToken,
                                'Accept': 'application/json'
                            },
                        })
    Genki adlı üyeden alıntı: mesajı görüntüle
    const routeUrl = "{{ url('/api/events') }}";
    const csrfToken = "{{ csrf_token() }}";
    let url = this.params.id ? `${routeUrl}/${this.params.id}` : routeUrl;
    Rotanız burada /api/events/ID şeklinde oluyor

    Rotalarınız ise /api/events/update/ID şeklinde tanımlı