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

Том*_*раћ 5 php namespaces inversion-of-control laravel laravel-4

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

Call to undefined method Roche\Trainings\Facades\TrainingFacade::save()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这些是我的TrainingsController,Training Model,TrainingFacade,Trainings Service Provider路线.我没有尝试似乎解决它.

Mar*_*łek 7

您无需在此处更改外观别名,但此处还有其他错误.

AdminTrainingsController你想要使用Training模型的过程中,这样就可以Training通过这种方式在类定义之前导入:

use Training;
Run Code Online (Sandbox Code Playgroud)

但是模型Training不在根命名空间中,在根命名空间中,TrainingFacade因为您可能以app.php这种方式在文件中定义它:

'Training' => 'Roche\Trainings\Facades\TrainingFacade',
Run Code Online (Sandbox Code Playgroud)

没关系,你不需要改变这个外观别名.

所以现在,Laravel注入你的构造函数而不是Training模型,但是TrainingFacade (因为Training在root命名空间中是别名TrainingFacade).

您需要的是为您的Training模型导入正确的命名空间.

当我们查看您的Training模型类时,我们看到代码是:

<?php namespace Roche\Trainings\Models;

class Training extends \Eloquent {

protected $guarded = array('id');

}
Run Code Online (Sandbox Code Playgroud)

所以它在Roche\Trainings\Models命名空间中.

因此,要使其工作,AdminTrainingsController您需要更改:

use Training;
Run Code Online (Sandbox Code Playgroud)

成:

use Roche\Trainings\Models\Training;
Run Code Online (Sandbox Code Playgroud)

现在Laravel将注入构造函数Training模型(而不是TrainingFacade它正在做的事情).

编辑

您也可以进行一些测试,例如更改您app.phpTrainingFacade别名,例如:

    'TrainingFacade' => 'Roche\Trainings\Facades\TrainingFacade',
Run Code Online (Sandbox Code Playgroud)

但如果你有use Training,你会得到以下错误:

班级培训不存在

因为Training现在全局命名空间中没有类(您更改了外观的别名).

如果你use Training;完全删除,你会得到:

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

因为默认情况下,类是从当前命名空间加载的,而您AdminTrainingsControllerRoche\Trainings\Controllers\Admin命名空间是

我希望现在一切都很清楚,如果不是你也可以看看如何使用来自其他命名空间的对象以及如何在PHP导入命名空间那里解释了更多关于命名空间的内容