【问题标题】:Artisan::call('route:cache') from within Laravel app, crashesLaravel 应用程序中的 Artisan::call('route:cache') 崩溃
【发布时间】:2020-02-27 08:27:11
【问题描述】:

快速总结:我需要以编程方式清除路由缓存(除非有其他方法使用 RouteServiceProvider?)但Artisan::call('route:cache'); 抛出错误。

我有绑定到我们从数据库中提取的 slug 数组的路由。这一切都很好,除了在我们的 CMS 方面,如果我们添加一个新条目,应用程序会在该新 URL 上给我们一个 404,因为这些路由都已经被缓存了。每次有人进行编辑时,我都无法通过 ssh 登录并运行 php artisan route:cache

我尝试将观察者添加到运行 route:cache 的相关模型中,只要对 slug 进行更改或添加新条目,就会引发异常。我无法在本地设置中复制它,因为我的路由没有在本地缓存!

这里有一些关于正在发生的事情的 sn-ps:

我的 RouteServiceProvider 设置如下(服务于路线{location})。在这里我可以做些不同的事情吗?

    // this does not seem to update the routes every time the app boots
    public function boot()
    {
        $locations = implode('|', Location::get()->pluck('slug')->toArray());
        Route::pattern('location', '(' . $locations . ')');
        parent::boot();
    }

所以,重申一下,如果我添加一个新的 Location 或修改一个现有的,我会得到一个 404,直到运行 php artisan route:cache。但是,我不想手动清除路由缓存,所以我设置了一个这样的观察者:

use Illuminate\Support\Facades\Artisan;
use myApp\Models\App\Location;

// this model observer is hardly a glowing example of DRY credo 
class LocationObserver
{
    public function created(Location $location)
    {
        Artisan::call('route:cache');
    }

    public function updated(Location $location)
    {
        if($location->isDirty('name')) {
            Artisan::call('route:cache');
        }
    }

我的应用并没有真正称为“MyApp”,为了隐私起见,我在这里更改了它。此外,slug 会随着 name 的变化而变化,所以我只是在检查。

但这给出了一个错误。这是我的日志中的屏幕截图:

另外有趣的是,在 php artisan tinker 中,我在尝试运行 Artisan::call('route:cache') 时遇到了一个已弃用的错误,我发现了一些与此相关的 GitHub 问题,但无法解决我这边的问题。

【问题讨论】:

    标签: php laravel laravel-6


    【解决方案1】:

    首先,我会使用不同的方法,您只需拥有 1 个路由和 1 个控制器。

    $router->get('location/{slug}', 'LocationController@show');
    

    然后在您的 show 方法中,您可以尝试从数据库中获取位置,如果该 slug 没有找到,则返回 404。我就是这样做的。

    public function show(string $slug) {
        $location = Location::where('slug', '=', $slug)->first;
    
        if (!$location) {
            throw new LocationNotFoundException()
        }
    
        // rest of the code
    } 
    

    如果你走你的路线,你的错误表明是一些filesystem 权限错误。 请使用ls -la验证文件bootstrap/cache/routes.php的所有者,并确保它与运行您的php进程的用户相同(ps aux | grep php

    【讨论】:

    • 我喜欢你的建议,只是尝试获取蛞蝓!简单得多。认为我们必须对其进行修改。我会检查权限 - 感谢您的提示。
    • 我就是这样做的,你的方法似乎很复杂:D。如果有帮助,请记住接受答案
    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2019-06-05
    • 2011-03-31
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多