Artisan::call('route:cache') 来自 Laravel 应用程序,崩溃
Artisan::call('route:cache') from within Laravel app, crashes
快速总结: 我需要以编程方式清除路由缓存(除非有其他方法使用 RouteServiceProvider?)但是 Artisan::call('route:cache');
抛出错误。
我有一些路由绑定到我们从数据库中提取的 slug 数组。这一切都很好,除了在我们的 CMS 端,如果我们添加一个新条目,应用程序会在新的 URL 上给我们一个 404,因为路由都已经缓存了。每次有人进行编辑时,我都无法通过 ssh 进入 运行ning php artisan route:cache
。
我试图向相关模型添加一个观察者,只要 slug 发生变化或添加新条目,运行s route:cache
,但会引发异常。我无法在我的本地设置中复制它,因为我的路由没有在本地缓存!
以下是一些正在发生的事情的片段:
我的 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',为了隐私起见,我在这里更改了它。此外,每当 name
更改时,slug
也会更改,所以我只是检查一下。
但这会出错。这是我的日志的屏幕截图:
同样有趣的是,在 php artisan tinker
中,我在尝试 运行 Artisan::call('route:cache')
时遇到了已弃用的错误,我发现了一些与此相关的 GitHub 问题,但是无法解决我这边的问题。
首先,我会使用一种不同的方法,您只需使用 1 个路由和 1 个控制器。
$router->get('location/{slug}', 'LocationController@show');
然后在您的显示方法中,您可以尝试从数据库中获取位置,如果 none 被该 slug 找到,则 return 返回 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
)
快速总结: 我需要以编程方式清除路由缓存(除非有其他方法使用 RouteServiceProvider?)但是 Artisan::call('route:cache');
抛出错误。
我有一些路由绑定到我们从数据库中提取的 slug 数组。这一切都很好,除了在我们的 CMS 端,如果我们添加一个新条目,应用程序会在新的 URL 上给我们一个 404,因为路由都已经缓存了。每次有人进行编辑时,我都无法通过 ssh 进入 运行ning php artisan route:cache
。
我试图向相关模型添加一个观察者,只要 slug 发生变化或添加新条目,运行s route:cache
,但会引发异常。我无法在我的本地设置中复制它,因为我的路由没有在本地缓存!
以下是一些正在发生的事情的片段:
我的 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',为了隐私起见,我在这里更改了它。此外,每当 name
更改时,slug
也会更改,所以我只是检查一下。
但这会出错。这是我的日志的屏幕截图:
同样有趣的是,在 php artisan tinker
中,我在尝试 运行 Artisan::call('route:cache')
时遇到了已弃用的错误,我发现了一些与此相关的 GitHub 问题,但是无法解决我这边的问题。
首先,我会使用一种不同的方法,您只需使用 1 个路由和 1 个控制器。
$router->get('location/{slug}', 'LocationController@show');
然后在您的显示方法中,您可以尝试从数据库中获取位置,如果 none 被该 slug 找到,则 return 返回 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
)