我有Laravel 5.3网站。
我今天添加了一些api路由,但是没有被调用。
实际上,我在NewRouteController
下有一个Http/Api
文件
但是路由返回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
我看了routes.php,它是Laravel 5.2的保留对象,它仍然在我的文件夹结构中,我们有以下几行:
// 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',
];
想法?
谢谢, 布莱恩
答案 0 :(得分:0)
我怀疑发生了几件事,但总之请检查您的bootstrap / cache文件夹。我希望在其中找到一个名为routes.php的文件,并且它可能已提交到您的存储库中,现在您已经将其拉低,或者甚至在使用工匠命令时自己意外创建了它。
通常,您会使用php artisan route:clear
,但是如果您的命令行不起作用,那将不起作用,但是您应该可以删除它。
在这种情况下,它是使用php artisan route:cache
创建的,但是建议仅在生产服务器上使用它(建议将其作为deploymnet脚本的一部分,也可以作为git hook)。
理想情况下,缓存文件夹中将存在一个.gitignore(如果您使用git)文件,以避免这种情况在不同的开发人员之间传输。
(编辑-这仅适用于Laravel的更高版本,但不适用于5.3-OP的版本。如果其他人有相同的问题,我将其保留在此处。)也可能有人(如果您在工作)团队中)故意完成了所有这些操作,只是没有传达更改。如果是这样,他们也有可能使用环境变量“ APP_ROUTES_CACHE”专门为路由缓存设置了另一条路径,在这种情况下,您必须去那里查看。
抱歉,这是如此复杂-但由于laravel的灵活性,可能有许多不同的方式发生。不过,请尝试全部尝试-这几乎肯定是一个缓存问题。