Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Route Trans Caching is broken with Livewire 3 #880

Open
relaypilot opened this issue Aug 10, 2023 · 17 comments
Open

Route Trans Caching is broken with Livewire 3 #880

relaypilot opened this issue Aug 10, 2023 · 17 comments

Comments

@relaypilot
Copy link

Describe the bug
When using Livewire 3, it is not possible to cache the localized routes with php artisan route:trans:cache.
Livewire 2 automatically preserved the URL prefix when making component updates via https://example.com/en/livewire/update
Livewire 3 has stopped supporting this behavior automatically.
See official Livewire documentation mentioning Laravel Localization: https://livewire.laravel.com/docs/upgrading#localization

To Reproduce
Steps to reproduce the behavior:

  1. Require Livewire 3 and update the Livewire update route (as recommended in the official Livewire documentation)
  2. Cache localized routes using: php artisan route:trans:cache
  3. Browse your website using a Laravel Localization locale (EN in my example)
  4. Open the browser console and click on a Livewire button (or any Livewire action)
  5. Console logs a call to /livewire/update instead of /en/livewire/update and returns a 404

Expected behavior
When browing the FR locale (or any other locales), you would expect Livewire to call /en/livewire/update instead of the non-localized route /livewire/update
This only fails when php artisan route:trans:cache has been run previously.
If you run php artisan route:trans:clear, it works correctly.
So something is broken in caching the route.

More info:

  • Version of Laravel: 10
  • Version of the Laravel-localization package: 1.8
  • Which middleware is used in Route::groups: setLocale
@ArtMin96
Copy link

Having the same issue

@greggh
Copy link

greggh commented Aug 29, 2023

I am having this issue without the route:trans:cache. I can clear it and still get the error. It is posting to /livewire/update instead of /en/livewire/update

@dennisvandalen
Copy link

Same here. Cache is broken.

I does work without caching while adding the new setUpdateRoute method to the route group.

Route::group(['prefix' => LaravelLocalization::setLocale()], function ()
{
    // Your other localized routes...
 
    Livewire::setUpdateRoute(function ($handle) {
        return Route::post('/livewire/update', $handle);
    });
});

@mperezsc
Copy link

mperezsc commented Sep 3, 2023

Experiencing the same. In my case it works after clearing cache, but once cached, it fails.

@core45
Copy link

core45 commented Sep 6, 2023

In my case no Livewire 3 component placed on localized route works properly when it comes to update.
Routes cached or not.

The solution mentioned by dennisvandalen helped though.
Still it should be mentioned in the documentation at least, or better, dealt with

@dennisvandalen
Copy link

I guess someone needs to review the caching meganism of this package. But I’m not sure how actively maintained it is, looking at the PRs that haven’t been merged or commented on.

@mcamara are you still actively maintaining this package?

@RikoDEV
Copy link

RikoDEV commented Sep 7, 2023

It looks like a livewire problem, when I manually edited the https://github.com/livewire/livewire/blob/daa88b5a6203c0e60f0a9bf8a8b5ac1394708ddc/src/Mechanisms/HandleRequests/HandleRequests.php#L29C12-L29C12 line by adding before $this->updateRoute->uri the current language the update request was executed correctly.

LaravelLocalization correctly registers the route with the prefix, but livewire tries to send the request to the route without prefix.

Working code inside HandleRequests:

    function getUpdateUri()
    {
        return (string) str(app()->getLocale() . "/{$this->updateRoute->uri}")->start('/');
    }

or more universal:

    function getUpdateUri()
    {
        return (string) str(route('livewire.update', null, false))->start('/');
    }

@core45
Copy link

core45 commented Sep 7, 2023

Whatever the culprit is both Livewire 3 and LaravelLocalization are quite popular packages. But I'd say it's easier to fix LaravelLocalization. Or at least put the info in the docs how fix it for now.

@poldixd
Copy link
Contributor

poldixd commented Sep 26, 2023

Did anybody found a workaround?

@ArtMin96
Copy link

Did anybody found a workaround?

#880 (comment)

@core45
Copy link

core45 commented Sep 26, 2023

The workaround is on the top of this thread.

Route::group(['prefix' => LaravelLocalization::setLocale()], function ()
{
// Your other localized routes...

Livewire::setUpdateRoute(function ($handle) {
    return Route::post('/livewire/update', $handle);
});

});

What is needed is a permanent solution and a bit of attention by the package owner.

@poldixd
Copy link
Contributor

poldixd commented Sep 27, 2023

Maybe I found a solution inspired by this file.

Remove this block from the web.php

Livewire::setUpdateRoute(function ($handle) {
    return Route::post('/livewire/update', $handle);
});

… and put it in the RouteServiceProvider.php. Don't forget the middleware() and prefix() method.

use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Livewire\Livewire;

// ...

/**
 * Define your route model bindings, pattern filters, and other route configuration.
 *
 * @return void
 */
public function boot()
{
    Livewire::setUpdateRoute(function ($handle) {
        return Route::post('/livewire/update', $handle)
            ->middleware('web')
            ->prefix(LaravelLocalization::setLocale());
    });

    // ...
}

Now Livewire::setUpdateRoute will not be cached if you run php artisan route:trans:cache.

@dennisvandalen
Copy link

Maybe I found a solution inspired by this file.

Remove this block from the web.php

Livewire::setUpdateRoute(function ($handle) {
    return Route::post('/livewire/update', $handle);
});

… and put it in the RouteServiceProvider.php. Don't forget the middleware() and prefix() method.

use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Livewire\Livewire;

// ...

/**
 * Define your route model bindings, pattern filters, and other route configuration.
 *
 * @return void
 */
public function boot()
{
    Livewire::setUpdateRoute(function ($handle) {
        return Route::post('/livewire/update', $handle)
            ->middleware('web')
            ->prefix(LaravelLocalization::setLocale());
    });

    // ...
}

Now Livewire::setUpdateRoute will not be cached if you run php artisan route:trans:cache.

Awesome, this works perfectly!

@mperezsc
Copy link

mperezsc commented Oct 8, 2023

Maybe I found a solution inspired by this file.

Remove this block from the web.php

Livewire::setUpdateRoute(function ($handle) {
    return Route::post('/livewire/update', $handle);
});

… and put it in the RouteServiceProvider.php. Don't forget the middleware() and prefix() method.

use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Livewire\Livewire;

// ...

/**
 * Define your route model bindings, pattern filters, and other route configuration.
 *
 * @return void
 */
public function boot()
{
    Livewire::setUpdateRoute(function ($handle) {
        return Route::post('/livewire/update', $handle)
            ->middleware('web')
            ->prefix(LaravelLocalization::setLocale());
    });

    // ...
}

Now Livewire::setUpdateRoute will not be cached if you run php artisan route:trans:cache.

Do you consider this a defenitive solution, or should this be temporary until either livewire or this package updates something?
Thanks a lot, I really appreciate it.

@BarionTechnology
Copy link

BarionTechnology commented Dec 27, 2023

Maybe I found a solution inspired by this file.
Remove this block from the web.php

Livewire::setUpdateRoute(function ($handle) {
    return Route::post('/livewire/update', $handle);
});

… and put it in the RouteServiceProvider.php. Don't forget the middleware() and prefix() method.

use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Livewire\Livewire;

// ...

/**
 * Define your route model bindings, pattern filters, and other route configuration.
 *
 * @return void
 */
public function boot()
{
    Livewire::setUpdateRoute(function ($handle) {
        return Route::post('/livewire/update', $handle)
            ->middleware('web')
            ->prefix(LaravelLocalization::setLocale());
    });

    // ...
}

Now Livewire::setUpdateRoute will not be cached if you run php artisan route:trans:cache.

Awesome, this works perfectly!

This works perfect to me, I have a different error on my website. When I make a searching by wire:model.live, my website redirects to my login. But this solved my issue

@kevinaswind
Copy link

Thank you so much! You saved my day!

@inalto
Copy link

inalto commented Apr 22, 2024

genius, thankyou it saves to put the hands in livewire.

//Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::getRouteFromRequest($request) 

$route = app('router')->getRoutes()->match($request);

the getRoutes function was failing to find the route in livewire even if i put livewire/update in the ignore list.

your solution is simple and elegant (after you know how :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests