【问题标题】:Laravel seems to be caching API routes despite my attempts to clear - ideas?尽管我试图清除 - Laravel 似乎正在缓存 API 路由 - 想法?
【发布时间】:2019-09-12 17:42:14
【问题描述】:

我有 Laravel 5.3 网站。

我今天添加了一些api路由,但它们没有被调用。

确实,我在Http/Api 下有一个NewRouteController 文件

但是路由返回 404 错误。永远无法到达控制器。

api.php 中还有其他可以正常工作的路由(例如,调用其中一个路由api/workingroute)。但是如果我在api.php 中注释掉他们的路线,他们仍然可以工作!

这里是 api.php 文件:

Route::group(['prefix' => 'api'], function () { Route::resource('workingroute', 'Api\WorkingRouteController'); });
Route::group(['prefix' => 'api'], function () { Route::resource('newroute', 'Api\NewRouteController'); });

我认为问题是route:list揭示的

GET|HEAD  | api/api/newitems                      | newitems.index   | App\Http\Controllers\Api\New RouteController@index                | api            |
|        | POST      | api/api/newitems                      | newitems.store   | App\Http\Controllers\Api\New Route@store                | api            |
|        | GET|HEAD  | api/api/newitems/create               | newitems.create  | App\Http\Controllers\Api\New Route@create               | api            |
|        | GET|HEAD  | api/api/newitems/{newitem}      | newitems.show    | App\Http\Controllers\Api\New Route@show                 | api            |
|        | DELETE    | api/api/newitems/{newitem}      | newitems.destroy | App\Http\Controllers\Api\New Route@destroy              | api            |
|        | PUT|PATCH | api/api/newitems/{newitem}      | newitems.update  | App\Http\Controllers\Api\New Route@update               | api            |
|        | GET|HEAD  | api/api/newitems/{newitem}/edit | newitems.edit    | App\Http\Controllers\Api\New Route@edit                 | api  

不知道为什么我们有 api/api,因为我看不到任何地方我会以这种方式指示路线,特别是因为我只是重复所有存在于工作 api 路线的东西。或者我想因为我使用的是 api.php,所以前缀已经添加了。

另外,奇怪的是,对于我的工作路线,我有一堆 api/route 形式的条目,但它们也有 api/api/route 形式的重复条目

对于 api/api/item 形式的路由,我们有这些行

api/api/item/{item} | item.show | App\Http\Controllers\Api\ItemController@show | api

对于 api/item 形式的路由,这些行:

 GET|HEAD  | api/item/{item}                         | lesson.show            | App\Http\Controllers\Api\ItemController@show                         | web,auth,admin 

我查看了仍然在我的文件夹结构中的 Laravel 5.2 保留的 routes.php,我们有这些行:

// Api
Route::group(['middleware' => ['api', 'auth', 'admin']], function () {
    Route::group(array('prefix' => 'api'), function() {
        RegisterResourceRoute('item', 'Item');

我想也许是我从 5.2 升级到 5.3 时弄坏了一些东西。奇怪的是,这个 routes.php 定义的路由是 api/item 形式的路由,它们可以工作。现在的问题是如何使路由恢复正常,以便所有 api 路由的形式为 api/item 并且都具有web,auth,admin

另外,对于它的价值(不确定缓存是否会以某种方式影响我的问题),在 bootstrap/cache 文件夹以及所有存储文件夹中有 .gitignore

这里是cache.php:

return [

    /*
    |--------------------------------------------------------------------------
    | Default Cache Store
    |--------------------------------------------------------------------------
    |
    | This option controls the default cache connection that gets used while
    | using this caching library. This connection is used when another is
    | not explicitly specified when executing a given caching function.
    |
    */

    'default' => env('CACHE_DRIVER', 'file'),

    /*
    |--------------------------------------------------------------------------
    | Cache Stores
    |--------------------------------------------------------------------------
    |
    | Here you may define all of the cache "stores" for your application as
    | well as their drivers. You may even define multiple stores for the
    | same cache driver to group types of items stored in your caches.
    |
    */

    'stores' => [

        'apc' => [
            'driver' => 'apc',
        ],

        'array' => [
            'driver' => 'array',
        ],

        'database' => [
            'driver' => 'database',
            'table'  => 'cache',
            'connection' => null,
        ],

        'file' => [
            'driver' => 'file',
            'path'   => storage_path('framework/cache'),
        ],

        'memcached' => [
            'driver'  => 'memcached',
            'servers' => [
                [
                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
                    'port' => env('MEMCACHED_PORT', 11211),
                    'weight' => 100,
                ],
            ],
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
        ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Cache Key Prefix
    |--------------------------------------------------------------------------
    |
    | When utilizing a RAM based store such as APC or Memcached, there might
    | be other applications utilizing the same cache. So, we'll specify a
    | value to get prefixed to all our keys so we can avoid collisions.
    |
    */

    'prefix' => 'laravel',

];

想法?

谢谢, 布赖恩

【问题讨论】:

  • 使用php artisan route:list查看注册的路由和url路径是什么。里面没有显示吗?尝试运行php artisan optimize 并重新运行路由列表命令,看看它是否出现。
  • 路由列表的问题是它使用 PHP CLI,在我的 MAC 上,CLI 是 PHP 5.6,并且 route:list 正在生成语法错误。将升级 CLI,但试图解决问题的核心。我只是通过编辑 api.php 和创建控制器来创建路由,而不是使用工匠命令,所以这可能会改变 Laravel 处理此类手动创建的路由的方式。也许存储文件夹中有东西,但那里没有 routes.php。
  • 您可以尝试手动清除或重命名/移动bootstrap/cache 文件夹(如果存在)
  • 你能把整个api.php路由文件贴出来吗?
  • 嗨,是的,api 路由文件只有帖子中显示的那种行。我编辑并添加了控制器文件。问候,布赖恩

标签: laravel


【解决方案1】:

我怀疑发生了几件事,但简而言之,请检查您的引导程序/缓存文件夹。我希望你会在其中找到一个名为 routes.php 的文件,它可能已经提交到你的 repo 中,现在你已经把它拉下来了,或者你甚至可能在使用 artisan 命令时不小心自己创建了它。

通常你会使用php artisan route:clear,但如果你的命令行不工作,那也不会工作,但是你应该可以删除它。

如果是这种情况,它是使用 php artisan route:cache 创建的,但建议仅在生产服务器上使用它(可能作为 deploymnet 脚本的一部分或作为 git 挂钩。)

理想情况下,缓存文件夹中应该有一个 .gitignore(如果您使用 git)文件,以避免在不同开发人员之间传输此类事情。

(编辑 - 这仅适用于 Laravel 的更高版本,但不适用于 5.3 - OP 的版本。我把它留在这里以防其他人有同样的问题。)也可能有人(如果你正在工作在一个团队中)故意完成了所有这些,只是没有传达这些变化。如果是这样,他们也可能使用环境变量“APP_ROUTES_CACHE”专门设置了另一个路径缓存路径,在这种情况下,您必须查看那里。

抱歉,这太复杂了 - 但由于 laravel 的灵活性,这可能会以多种不同的方式发生。不过,请务必尝试所有这些 - 这几乎肯定是一个缓存问题。

【讨论】:

  • 嗨,我的 bootstrap/cache 文件夹只有一个 services.php
  • 嗨,好的,所以我查看了 cache.php 并发布在我的帖子中。还发布了有趣的 route:list 结果... 似乎事情正在逐渐清晰,只是不知道如何收拾烂摊子!顺便说一句, route:clear 没有任何效果。也许我需要删除应用存储文件夹中的所有内容?另外,我现在正在做的是在本地主机中。不在生产服务器上。但是我通过复制我的生产文件来设置本地主机,所以也许我需要对本地主机上的 cache.php 做一些不同的事情?
  • 虽然我认为我的回答对于大多数会找到此页面的人来说仍然是相关的,但我不确定它是否会对您有所帮助!我不再认为您的情况是缓存问题-听起来更像是您有两个路由文件,几乎可以肯定是因为从 5.2 到 5.3 的更改。这也可以解释你的路线中额外的“api/”——它们是被自动添加的,不知何故。我对 5.3 知之甚少 在您的应用程序上运行文本搜索以获取有效的路线名称,并查看它是否与您期望的不同。另请查看:mattstauffer.com/blog/routing-changes-in-laravel-5-3
  • 此时我只是想让 Laravel 忘记所有这些 api/api 路由(在我的 api.php 中,我将删除 api 前缀),所以我试图找出在哪里在供应商文件夹中是用于显示路线的文件。在 routes.php 中,如果我添加了一个 die 语句或者它没有被调用的东西,所以似乎 routes.php 被忽略了,但是 Laravel 看到了 routes.php 中指定的路由......
猜你喜欢
  • 2015-11-23
  • 2015-07-27
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2016-10-19
  • 1970-01-01
  • 2016-11-26
相关资源
最近更新 更多