Laravel - 调用未定义的方法TrainingFacade :: save()

时间:2014-11-07 09:01:23

标签: php laravel laravel-4 namespaces inversion-of-control

我正在构建一个Laravel 4.2应用程序,我正在使用Creolab的模块包。这是一个用于管理公司培训的应用程序,因此我的模块称为培训。一切顺利,除了保存新创建的培训。我提交“新建”表单时收到的错误是:

Call to undefined method Roche\Trainings\Facades\TrainingFacade::save()

enter image description here

这些是我的TrainingsControllerTraining ModelTrainingFacadeTrainings Service Providerroutes。我没有尝试似乎解决它。

1 个答案:

答案 0 :(得分:6)

您不需要在此更改外观别名,但此处还有其他错误。

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;,你会得到:

  

Class Roche \ Trainings \ Controllers \ Admin \ Training不存在

因为默认类是从当前命名空间加载的,而AdminTrainingsController位于Roche\Trainings\Controllers\Admin命名空间

我希望现在一切都很清楚,如果不是你也可以看How to use objects from other namespaces and how to import namespaces in PHP我在那里解释了更多关于名称空间的内容