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。我尝试的任何方法似乎都无法解决它。

【问题讨论】:

你没有提供任何信息。请在此处粘贴您的代码并粘贴出错的部分;给我们请求遇到错误的代码。 你到底想用外观来完成什么?您可能希望在已修改的记录上调用 eloquents save() 方法。另外,我相信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(因为根命名空间中的 TrainingTrainingFacade 的别名)。

您需要为您的 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 - ORM - 调用未定义的方法

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()