我有一个系统,用户可以在其中将数据输入到各种表单并生成自定义文档。当我设置所有内容时,因为每个表单都有唯一的数据,我会为每种类型的文档创建一个模型/控制器,例如BriefDocument、InvoiceDocument等。
我很快发现,这变得非常混乱,太多的模型和控制器。创建一个新的文档类型也花费了相当长的时间。因此,我重新安排了我的数据库。
我现在有一个Document模型和一个DocumentData模型。一个文档可以有许多文档数据。我设想这样的
Document
+----+---------------+-----------------+
| id | name | description |
+----+---------------+-----------------+
| 1 | BriefDocument | Something |
+----+---------------+-----------------+
DocumentData
+----+--------------+-----------------+--------------+
| id | key | value | documentId |
+----+--------------+-----------------+--------------+
| 1 | whatData | inputted data | 1 |
+----+--------------+-----------------+--------------+
| 2 | whoData | inputted data | 1 |
+----+--------------+-----------------+--------------+
| 3 | whyData | inputted data | 1 |
+----+--------------+-----------------+--------------+
| 4 | howData | inputted data | 1 |
+----+--------------+-----------------+--------------+
这样做应该允许我只使用这两个模型创建任何类型的Document。我的第一个问题是,我设置了如下路线
Route::model('projects.document', 'Document');
Route::resource('projects.document', 'DocumentController', ['except' => ['index', 'show']]);
在一个页面上,我有一个下拉列表,用户可以在其中选择他们创建的文档类型。下拉列表中有类似的内容
<li>{!! link_to_route('projects.document.create', 'Brief Document', array($project->id, 'Brief Document')) !!}</li>
因此,这将调用DocumentController 中的创建函数
public function create(Project $project, $name)
{
$briefDocument = Document::where('projectId', '=', $project->id)
->where('name', '=', $name)
->first();
}
我在这个功能中要做的是首先确定是否已经为这个项目创建了相同的文档,因为一个项目只能有很多文档,而不能有重复的文档。
然而,如果我这样做,我会得到
Missing argument 2 for AppHttpControllersDocumentController::create()
但是我不是在link_to_route中传递论点2吗?据我所见,这正在传递我的Project实例,以及字符串Briefing Document。
为什么我会出现这个错误?
感谢
更新如果我明确设置了路线,它就会工作,例如
Route::model('projects.document', 'Document');
Route::get('projects/{projects}/document/{name}', array('as' => 'projects.document.create', 'uses' => 'DocumentController@create'));
您会收到此错误,因为您没有将$name
变量传递给create()
操作。
也许问题出在create()
本身。这个方法是RESTful控制器的一部分,看起来它被设计为只接受Request
对象,所以试试这个:
<li>{!! link_to_route('projects.document.create', 'Brief Document', ['project_id' => $project->id, 'name' => Brief Document')) !!}</li>
和create()
作用:
public function create(Request $request)
{
$id = $request->get('project_id');
$name = $request->get('name');
$briefDocument = Document::where('projectId', '=', $project->id)
->where('name', '=', $name)
->first();
}