【发布时间】: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 问题,但无法解决我这边的问题。
【问题讨论】: