php - 我想使用 url 方法从带有操作按钮的数据表路由,但是在成功获取数据时,按钮路由到 404 页面
问题描述
*VendorController*- *this is the datatable function*
public function datatable(){
$data = Vendor::all();
try {
return DataTables::of($data)->addColumn('action', function ($data) {
$url_edit = url('master/vendor/'.$data->id.'/edit');
$url = url('master/vendor/'.$data->id.'/');
$view = "<a class='btn btn-action btn-primary' href='$url' title='View'><i class='nav-icon fas fa-eye'></i></a>";
$edit = "<a class='btn btn-action btn-warning' href='$url_edit' title='View'><i class='nav-icon fas fa-edit'></i></a>";
$delete = "<button data-url='" . $url . "' onclick='deleteData(this)' class='btn btn-action btn-danger' title='delete'><i class='nav-icon fas fa-trash'></i></button>";
return $view."".$edit."".$delete;
})->editColumn('address', function ($data) {
return str_replace("\r\n", ',', $data->address);
})->editColumn('phone', function ($data) {
return str_replace("\r\n", ',', $data->phone);
})->rawColumns(['action'])->editColumn('id', 'ID:{{$id}}')->make(true);
} catch (\Exception $e) {
}
}
*web.php* - *here i am making use of resource for my routing*
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::resource('/master/vendor/', '\App\Http\Controllers\Master\VendorController');
Route::get('vendor/datatable', [\App\Http\Controllers\Master\VendorController::class, 'datatable'])->name('vendor/datatable');
*The edit function*
public function edit($id)
{
$data = Vendor::where('id', $id)->where('active', '!=', 2)->get();
if ($data->count() > 0){
return view('Vendor.update', compact('data'));
}
}
*DataTable Script* - *here's the datatable script*
<script>
$(function () {
$('#example1').DataTable({
responsive: true,
processing:true,
pagingType:'full_numbers',
stateSave:false,
scrollY:true,
scrollX:true,
ajax:"{{url('vendor/datatable')}}",
order:[0, 'desc'],
columns:[
{data:'name', name:'name'},
{data:'address', name:'address'},
{data:'cp', name:'cp'},
{data:'phone', name:'phone'},
{data:'active',
render:function(data){
if(data=='1'){
return '<span class="badge badge-success">Active</span>'
}
if(data=='2'){
return '<span class="badge badge-warning">Inactive</span>'
}
}
},
{data:'action', name:'action', searchable:false, sortable:false}
]
});
});
</script>
请我会在线查看我可能需要显示 的任何其他内容 请我将在线查看我可能需要显示的其他任何内容请 我将在线查看我可能需要显示的其他任何内容 在线查看我可能需要展示 的其他任何内容 请我在线查看我可能需要展示 的其他任何内容 请在线查看我可能需要展示的其他任何内容
解决方案
问题:资源路由生成的路由不包含强制路由参数名称,它是一个{}
空的,应该是{vendor}
这样的。
Route::resource('/master/vendor/', '\App\Http\Controllers\Master\VendorController');
Output:
+--------+-----------+-----------------------+---------+-----------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-----------------------+---------+-----------------------------------------+------------+
| | GET|HEAD | master/vendor | index | App\Http\Controllers\Controller@index | web |
| | POST | master/vendor | store | App\Http\Controllers\Controller@store | web |
| | GET|HEAD | master/vendor/create | create | App\Http\Controllers\Controller@create | web |
| | GET|HEAD | master/vendor/{} | show | App\Http\Controllers\Controller@show | web |
| | PUT|PATCH | master/vendor/{} | update | App\Http\Controllers\Controller@update | web |
| | DELETE | master/vendor/{} | destroy | App\Http\Controllers\Controller@destroy | web |
| | GET|HEAD | master/vendor/{}/edit | edit | App\Http\Controllers\Controller@edit | web |
+--------+-----------+-----------------------+---------+-----------------------------------------+------------+
查看{}
URI 中的所有内容,当您生成类似于master/vendor/1/edit
edit的路由时会导致 404 resource #1
。
该问题是由于/
资源路由中的尾部斜杠造成的/master/vendor/
。在资源路由中,最后一个变量放在花括号内以使其成为参数名称。但在这种情况下,laravel 认为它是斜线后的空值,导致{}
路由中出现这种情况。
删除尾部斜杠,输出将是。
Route::resource('/master/vendor', '\App\Http\Controllers\Master\VendorController');
Output:
+--------+-----------+-----------------------------+----------------+-----------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-----------------------------+----------------+-----------------------------------------+------------+
| | GET|HEAD | master/vendor | vendor.index | App\Http\Controllers\Controller@index | web |
| | POST | master/vendor | vendor.store | App\Http\Controllers\Controller@store | web |
| | GET|HEAD | master/vendor/create | vendor.create | App\Http\Controllers\Controller@create | web |
| | GET|HEAD | master/vendor/{vendor} | vendor.show | App\Http\Controllers\Controller@show | web |
| | PUT|PATCH | master/vendor/{vendor} | vendor.update | App\Http\Controllers\Controller@update | web |
| | DELETE | master/vendor/{vendor} | vendor.destroy | App\Http\Controllers\Controller@destroy | web |
| | GET|HEAD | master/vendor/{vendor}/edit | vendor.edit | App\Http\Controllers\Controller@edit | web |
+--------+-----------+-----------------------------+----------------+-----------------------------------------+------------+
旧解决方案:由于强制id
参数导致找不到路由。手动创建路由
Route::get('/master/vendor/{id}/edit', '\App\Http\Controllers\Master\VendorController@edit');
推荐阅读
- r - 在R中使用条件和按ID分组计算值的比例
- math - 在反应扩散模拟中实现拉普拉斯算子
- mysql - 选择最后一次下订单早于 X 日期的帐户
- python - 使用未初始化的全局变量会引发 NameError
- flutter - 类型列表动态不是类型映射字符串动态的子类型
- jquery - CSP & Safari:因为 CSP 而拒绝加载,但设置了 CSP
- html - HTML - 嵌套表格格式不正确
- python - W0703: 捕获过于笼统的异常 Exception (broad-except)
- python - 使用 Pyxll 提取 excel 公式/vba 代码以便在 python 中重写
- react-native - 在本机反应中使用 Formik 进行 RadioGroup 验证