Laravel - 调用未定义的方法 TrainingFacade::save()
Posted
技术标签:
【中文标题】Laravel - 调用未定义的方法 TrainingFacade::save()【英文标题】:Laravel - Call to undefined method TrainingFacade::save() 【发布时间】:2015-01-04 00:39:29 【问题描述】:我正在构建一个 Laravel 4.2 应用程序,并且正在使用 Creolab 的 Modules 包。这是一个管理公司培训的应用程序,所以我的模块称为培训。除了保存新创建的培训之外,一切都很好。我在提交 Create New 表单时收到的错误是:
Call to undefined method Roche\Trainings\Facades\TrainingFacade::save()
这些是我的TrainingsController、Training Model、TrainingFacade、Trainings Service Provider 和 routes。我尝试的任何方法似乎都无法解决它。
【问题讨论】:
你没有提供任何信息。请在此处粘贴您的代码并粘贴出错的部分;给我们请求遇到错误的代码。 你到底想用外观来完成什么?您可能希望在已修改的记录上调用 eloquentssave()
方法。另外,我相信getFacadeAccessor()
应该将类名作为字符串返回,而不是实例。
@MostafaTalebi 你能告诉我你还需要什么信息吗?我提供了我的控制器、模型、外观、服务提供者和路由。 Controller 的 postCreate 方法中的if($this->training->save())
行返回错误。
@Supericy 我只是想将表单中的数据保存在数据库中。当我创建新培训时,我认为我不明白我在修改什么记录。关于getFacadeAccessor()
我这里只使用了这个例子中显示的代码:github.com/bstrahija/laravel-modules-example/blob/master/app/…
但是为什么你需要一个自定义的 Facade 呢?直接使用 Model 类应该没问题。
【参考方案1】:
您无需在此处更改外观别名,但此处还有其他错误。
在您的AdminTrainingsController
中,您想使用Training
模型,因此您可以在类定义之前以这种方式导入Training
:
use Training;
但模型Training
不在根命名空间中,在根命名空间中有TrainingFacade
,因为您可能以这种方式在app.php
文件中定义它:
'Training' => 'Roche\Trainings\Facades\TrainingFacade',
没关系,您不需要更改此外观别名。
所以现在,Laravel 注入到您的构造函数中的不是 Training
模型,而是 TrainingFacade
(因为根命名空间中的 Training
是 TrainingFacade
的别名)。
您需要为您的 Training
模型导入正确的命名空间。
当我们查看您的 Training
模型类时,我们看到代码是:
<?php namespace Roche\Trainings\Models;
class Training extends \Eloquent
protected $guarded = array('id');
所以它位于Roche\Trainings\Models
命名空间中。
因此,要使其在 AdminTrainingsController
中工作,您需要进行更改:
use Training;
进入:
use Roche\Trainings\Models\Training;
现在 Laravel 将注入构造函数 Training
模型(而不是像以前那样注入 TrainingFacade
)。
编辑
您还可以进行一些测试,例如将您的app.php
更改为您的TrainingFacade
别名,例如:
'TrainingFacade' => 'Roche\Trainings\Facades\TrainingFacade',
但如果你有use Training
,你会得到以下错误:
类培训不存在
因为现在全局命名空间中将没有 Training
类(您更改了外观的别名)。
如果你完全删除use Training;
,你会得到:
类 Roche\Trainings\Controllers\Admin\Training 不存在
因为默认类是从当前命名空间加载的,而您的 AdminTrainingsController
位于 Roche\Trainings\Controllers\Admin
命名空间中
我希望现在一切都清楚了,如果不是,您还可以查看How to use objects from other namespaces and how to import namespaces in PHP,我在其中解释了有关命名空间的更多信息
【讨论】:
Marcin 非常感谢您的详尽解释。我现在有两个问题: 1. 为什么我只在创建新培训时收到此错误,而不是在更新现有培训时?两种方法中的代码几乎相同。 2.你能看看我的TrainingFacade
,告诉我那里的代码是否OK? @Supericy 提到外观应该返回一个字符串而不是一个实例。这是正确的,还是我的代码可以?谢谢。
@ТомицаКораћ 你在哪里有更新方法?我只看到创建方法
抱歉,我删除它是为了让我的问题更加集中在这个方法上。这实际上是我的整个控制器:laravel.io/bin/eDG9k。如果您发现任何异常情况请告诉我,我们将不胜感激。
@ТомицаКораћ 这是不同的情况,因为对于其他操作,您在路由中使用路由模型绑定。你在那里有Route::model('training', 'Roche\Trainings\Models\Training');
- 你也看到了完整的命名空间。关于外墙——是的,你在这里返回字符串,你可以看看***.com/questions/25978931/…
啊啊,我明白了!这真的让我很困惑。直到现在我才意识到为什么只有postCreate()
不起作用。马辛你是明星!非常感谢你有这么大的耐心。我的问题是,除了我是初学者之外,我将github.com/bstrahija/laravel-modules-example 和github.com/andrewelkins/Laravel-4-Bootstrap-Starter-Site 结合在一起,这些差异让我感到困惑。你的链接对我有很大帮助。再次感谢哥们!以上是关于Laravel - 调用未定义的方法 TrainingFacade::save()的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5:调用未定义的方法 Illuminate\Database\Eloquent\Collection::exists()
调用未定义的方法 App\Models\Car::setCreatedAt() - Laravel - 5.8.16
调用未定义的方法 Gallery::newQuery() Laravel
Laravel - 调用未定义的方法 TrainingFacade::save()
Laravel 5.2 - 调用未定义的方法 Illuminate\Support\Facades\Request::session()