我正在构建一个Laravel 4.2应用程序,我正在使用Creolab的模块包。这是一个用于管理公司培训的应用程序,因此我的模块称为培训。一切顺利,除了保存新创建的培训。我提交“新建”表单时收到的错误是:
Call to undefined method Roche\Trainings\Facades\TrainingFacade::save()
这些是我的TrainingsController,Training Model,TrainingFacade,Trainings Service Provider和routes。我没有尝试似乎解决它。
答案 0 :(得分:6)
您不需要在此更改外观别名,但此处还有其他错误。
在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;
,你会得到:
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我在那里解释了更多关于名称空间的内容