Laravel似乎在缓存API路由,尽管我试图澄清这些想法?
我有拉威尔5.3网站 我今天添加了一些api路由,但没有调用它们 实际上,我在Http/Api下有一个Laravel似乎在缓存API路由,尽管我试图澄清这些想法?,laravel,Laravel,我有拉威尔5.3网站 我今天添加了一些api路由,但没有调用它们 实际上,我在Http/Api下有一个NewRouteController文件 但是路由返回404错误。永远无法到达控制器 在api.php中还有其他一些路由可以正常工作(例如,调用其中一个api/workingroute)。但是如果我在api.php中注释掉它们的路径,它们仍然可以工作 以下是api.php文件: Route::group(['prefix' => 'api'], function () { Route::r
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
// Api
Route::group(['middleware' => ['api', 'auth', 'admin']], function () {
Route::group(array('prefix' => 'api'), function() {
RegisterResourceRoute('item', 'Item');
我查看了routes.php,它是Laravel 5.2的遗留版本,它仍然在我的文件夹结构中,我们有以下几行:
GET|HEAD | api/item/{item} | lesson.show | App\Http\Controllers\Api\ItemController@show | web,auth,admin
// 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',
];
想法
谢谢,
Brian我怀疑发生了几件事,但简而言之,检查一下您的引导/缓存文件夹。我希望您能在其中找到一个名为routes.php的文件,该文件可能已经提交到您的repo中,现在您已经将其取下,或者您甚至在使用artisan命令时意外地创建了它 通常您会使用
php-artisan-route:clear
,但是如果您的命令行不起作用,那就不起作用了,但是您应该可以删除它
如果是这种情况,它是使用php artisan-route:cache
创建的,但建议只在生产服务器上使用它(可能作为部署脚本的一部分,也可能作为git钩子使用)
理想情况下,缓存文件夹中应该有一个.gitignore(如果您使用的是git)文件,以避免在不同的开发人员之间传输此类内容
(编辑-这仅适用于Laravel的更高版本,而不是5.3-OP的版本。我将此保留在这里,以防其他人有相同的问题。)也可能有人(如果您在团队中工作)故意做了所有这些,只是没有传达更改。如果是这样,也可能是他们使用环境变量“APP_ROUTES_CACHE”专门为路由缓存设置了另一个路径,在这种情况下,您必须查看该路径
抱歉,这太复杂了,但由于拉雷维尔的灵活性,有许多不同的方式可以实现这一点。尽管如此,请尝试所有方法-这几乎肯定是一个缓存问题。使用
php artisan route:list
查看注册的路由和url路径。里面没有显示吗?尝试运行php artisan optimize
并重新运行route list命令,查看是否显示。route list的问题是它使用php CLI,而在我的MAC上,CLI是php 5.6,route:list生成语法错误。将升级CLI,但正试图触及问题的核心。我只是通过编辑api.php和创建controller来创建路由,而不是使用artisan命令,所以这可能会改变Laravel处理此类手动创建路由的方式。可能是存储文件夹中的某个内容,但那里没有routes.php。如果存在,您可以尝试手动清除或重命名/移动bootstrap/cache
文件夹。您可以发布整个api.php
route文件吗?您好,是的,api路由文件只有帖子中显示的行。我编辑并添加了控制器文件。您好,BrianHi,我的bootstrap/cache文件夹只有一个services.phpHi,所以我查看了cache.php并在我的帖子中发布。还发布了路线:有趣的列表的结果。。。事情似乎渐渐明朗了,只是不知道如何收拾残局!路线:顺便说一下,清除没有任何效果。也许我需要删除应用程序存储文件夹中的所有内容?另外,我现在所做的是在localhost中。不在生产服务器上。但是我通过复制我的生产文件来设置localhost,所以也许我需要在localhost上使用cache.php做一些不同的事情?虽然我认为我的答案对于大多数会找到此页面的人仍然相关,但我不确定它在这一点上是否会帮助您!我不再认为这是一个缓存问题,在你的情况下-这听起来更像是你有两个路由文件,几乎可以肯定,因为从5.2到5.3的变化。这也解释了路由中额外的“api/”——它们是以某种方式自动添加的。我对5.3知之甚少,在你的应用程序上运行一个文本搜索,查找工作路线名称,看看它是否超出了你的预期。另外请注意:此时,我只是想让Laravel忘记所有这些api/api路由(在我的api.php中,我将删除api前缀),因此我试图找出供应商文件夹中用于显示路由的文件的位置。在routes.php中,如果我添加了一个die语句或其他没有调用的语句,那么routes.php似乎被忽略了,而Laravel则被忽略了