Laravel 4 - 一些但不是所有路线在生产中失败
Laravel 4 - some but not all routes failing on production
我有一个应用程序已经 运行 在生产服务器和我的开发机器上成功运行了一年多(运行 IIS 都没有任何漂亮的 URLs)。昨天我将一系列(直到现在成功的)更新从开发转移到生产,从那时起,许多路由在生产服务器上一直失败,即使它们在开发上运行良好。我已经验证了两台机器上存在完全相同的应用程序和路由文件,我已经确认 php artisan routes
在两台机器上产生相同的输出,我已经确认它们的 autoload_classmap.php 文件是相同的,并且我已验证两台服务器都是 运行 Laravel 4.1.23 .
经过一些测试后发现,例如 URL https://localhost/EPHY/index.php/child/3958/edit
,它触发了 dev 上的 ChildController::edit()
RESTful 方法,触发了 ChildController::create()
在生产中,然后崩溃,因为它找不到它期望的 familyId 参数。这是两台服务器上 routes.php 中适用的行:
Route::resource( 'child', 'ChildController', array(
'create' => 'child.create',
'store' => 'child.store',
'show' => 'child.show',
'edit' => 'child.edit',
'update' => 'child.update',
'destroy' => 'child.destroy'
));
我应该注意到,另一个 RESTful 资源 Family 在两台服务器上都能成功运行,但其他服务器则不能。在做了更多测试之后,实际上似乎所有与 Family 有 Eloquent 关系的模型相关的路由都失败了,而其他所有路由都工作正常。太奇怪了...
任何人都可以提出可能导致此问题的原因,或者至少我可以在哪里查看?我很乐意 post 补充信息。
更新: 我继续研究这个问题,而且越来越明显,这绝对只影响与家庭有 Eloquent 关系的模型相关的路线模型;应用程序中的所有其他路由似乎都正常工作。
好的,我想通了,但它很蹩脚。正如我上面提到的,这只影响与 Family
有 Eloquent 关系的模型。这实际上意味着关联 Controllers
的所有 ::create()
方法都需要 Family::id
值。所以,这是我正在检查的代码,以确定我是否需要来自 Input::get()
或 Input::old()
的值:
$familyId = ( 空 ( Input::old() ) )? Input::get('familyId') : Input::old('family_id');
有人看到问题了吗? empty()
不能将函数调用作为参数。我将代码更改为:
后一切正常
$familyId = ( Input::old() )? Input::old('family_id') : Input::get('familyId') ;
现在,我是怎么想出来的?好吧,假设我知道 "Can't use function return value in write context" 是什么意思,花了一天半之后,我终于检查了 GOOGLE 上该死的错误消息! 让这成为一个教训新手和老手的提醒,永远不要假设你在没有与集体思维仔细检查的情况下理解错误的含义......
我很惭愧...
我有一个应用程序已经 运行 在生产服务器和我的开发机器上成功运行了一年多(运行 IIS 都没有任何漂亮的 URLs)。昨天我将一系列(直到现在成功的)更新从开发转移到生产,从那时起,许多路由在生产服务器上一直失败,即使它们在开发上运行良好。我已经验证了两台机器上存在完全相同的应用程序和路由文件,我已经确认 php artisan routes
在两台机器上产生相同的输出,我已经确认它们的 autoload_classmap.php 文件是相同的,并且我已验证两台服务器都是 运行 Laravel 4.1.23 .
经过一些测试后发现,例如 URL https://localhost/EPHY/index.php/child/3958/edit
,它触发了 dev 上的 ChildController::edit()
RESTful 方法,触发了 ChildController::create()
在生产中,然后崩溃,因为它找不到它期望的 familyId 参数。这是两台服务器上 routes.php 中适用的行:
Route::resource( 'child', 'ChildController', array(
'create' => 'child.create',
'store' => 'child.store',
'show' => 'child.show',
'edit' => 'child.edit',
'update' => 'child.update',
'destroy' => 'child.destroy'
));
我应该注意到,另一个 RESTful 资源 Family 在两台服务器上都能成功运行,但其他服务器则不能。在做了更多测试之后,实际上似乎所有与 Family 有 Eloquent 关系的模型相关的路由都失败了,而其他所有路由都工作正常。太奇怪了...
任何人都可以提出可能导致此问题的原因,或者至少我可以在哪里查看?我很乐意 post 补充信息。
更新: 我继续研究这个问题,而且越来越明显,这绝对只影响与家庭有 Eloquent 关系的模型相关的路线模型;应用程序中的所有其他路由似乎都正常工作。
好的,我想通了,但它很蹩脚。正如我上面提到的,这只影响与 Family
有 Eloquent 关系的模型。这实际上意味着关联 Controllers
的所有 ::create()
方法都需要 Family::id
值。所以,这是我正在检查的代码,以确定我是否需要来自 Input::get()
或 Input::old()
的值:
$familyId = ( 空 ( Input::old() ) )? Input::get('familyId') : Input::old('family_id');
有人看到问题了吗? empty()
不能将函数调用作为参数。我将代码更改为:
$familyId = ( Input::old() )? Input::old('family_id') : Input::get('familyId') ;
现在,我是怎么想出来的?好吧,假设我知道 "Can't use function return value in write context" 是什么意思,花了一天半之后,我终于检查了 GOOGLE 上该死的错误消息! 让这成为一个教训新手和老手的提醒,永远不要假设你在没有与集体思维仔细检查的情况下理解错误的含义......
我很惭愧...