routes.php第113行中的FatalErrorException:在Laravel 5.2中对null上的成员函数delete()的调用
我试图通过routes.php删除一个文件,但它生成以下错误:routes.php第113行中的FatalErrorException:在Laravel 5.2中对null上的成员函数delete()的调用,php,mysql,laravel,laravel-5,Php,Mysql,Laravel,Laravel 5,我试图通过routes.php删除一个文件,但它生成以下错误: FatalErrorException in routes.php line 113: Call to a member function delete() on null 这是将函数放置在“删除”按钮中的视图 <div class="col-md-12 col-xs-12"> <div class="row"> @foreach($properties->fi
FatalErrorException in routes.php line 113: Call to a member function delete() on null
这是将函数放置在“删除”按钮中的视图
<div class="col-md-12 col-xs-12">
<div class="row">
@foreach($properties->files as $index=>$file)
<div class="col-sm-6 col-md-2">
<div class="thumbnail">
<img src="{{ URL::asset('uploads/products/' . $file->name) }}" alt="{{ $file->property_id }}" width="300" height="200">
<div class="caption">
<div class="caption" align="center">
<form action="{{ url('file/'.$file->id) }}" method="POST" enctype="multipart/form-data">
{{ csrf_field() }}
{{ method_field('DELETE') }}
<button onclick="return confirm('Está seguro eliminar esta imagen?')" class="button btn btn-danger btn-xs" data-toggle="tooltip" data-placement="top" title="Eliminar imagen"><i class="material-icons delete-white">delete</i></button>
</form>
</div>
</div>
</div>
</div>
@endforeach
</div>
</div>
处理请求输入时,有两种类型的参数:路由参数和查询参数。路由参数是url的一部分,可作为路由处理程序(闭包或控制器方法)的参数使用,而查询参数来自查询字符串,可通过请求数据(您正在使用的输入外观)使用 如前所述,您的代码有两个问题。首先,您的文件id是一个路由参数,但您试图像访问查询参数一样访问它。其次,实际上您正在尝试对id本身调用
delete()
,该id本身实际上是null
,因为它不作为查询参数存在
您注释掉的行应该可以正常工作:
File::findOrFail($id)->delete();
当您删除
文件
记录时,您似乎还试图从文件系统中删除文件。我建议您将deleted()
事件添加到文件
方法中,以便无论何时删除文件
模型,它都会从文件系统中删除关联的文件
class File extends Model
{
public static function boot()
{
// make sure to call the parent boot
parent::boot();
// this function will be called whenever a File is deleted
static::deleted(function ($model) {
// delete the file when the model is deleted. very basic,
// you'll want to add in more sanity checks, etc.
// get the file path
$path = 'uploads/products/' . $model->filename;
// delete the file
unlink($path);
});
}
}
您还可以使用
deleting()
事件,该事件将在从数据库中删除文件记录之前触发。如果执行此操作,如果文件未能删除,则可以从事件中返回false
,这将阻止从数据库中删除记录。处理请求输入时,有两种类型的参数:路由参数和查询参数。路由参数是url的一部分,可作为路由处理程序(闭包或控制器方法)的参数使用,而查询参数来自查询字符串,可通过请求数据(您正在使用的输入外观)使用
// Delete files
Route::delete('/file/{id}', function ($id) {
//File::findOrFail($id)->delete();
$file = File::find(Input::get('id')->delete());
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
如前所述,您的代码有两个问题。首先,您的文件id是一个路由参数,但您试图像访问查询参数一样访问它。其次,实际上您正在尝试对id本身调用delete()
,该id本身实际上是null
,因为它不作为查询参数存在
您注释掉的行应该可以正常工作:
File::findOrFail($id)->delete();
当您删除
文件
记录时,您似乎还试图从文件系统中删除文件。我建议您将deleted()
事件添加到文件
方法中,以便无论何时删除文件
模型,它都会从文件系统中删除关联的文件
class File extends Model
{
public static function boot()
{
// make sure to call the parent boot
parent::boot();
// this function will be called whenever a File is deleted
static::deleted(function ($model) {
// delete the file when the model is deleted. very basic,
// you'll want to add in more sanity checks, etc.
// get the file path
$path = 'uploads/products/' . $model->filename;
// delete the file
unlink($path);
});
}
}
您还可以使用
deleting()
事件,该事件将在从数据库中删除文件记录之前触发。如果执行此操作,如果文件未能删除,则可以从事件中返回false
,这将阻止从数据库中删除记录。由于您试图从不存在的输入字段中检索值,因此会生成错误。您应该阅读文档,了解输入和请求之间的区别
// Delete files
Route::delete('/file/{id}', function ($id) {
//File::findOrFail($id)->delete();
$file = File::find(Input::get('id')->delete());
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
由于表单中没有输入字段,而您只是在表单请求中传递和id,所以请更改此设置
$file = File::find(Input::get('id'))->delete();
// Delete files
Route::delete('/file/{id}', function ($id) {
//File::findOrFail($id)->delete();
$file = File::find(Input::get('id')->delete());
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
对此
$file = File::find(Request::segment(2))->delete();
// Delete files
Route::delete('/file/{id}', use function (Request $request) {
File::findOrFail($request->segment(2))->delete();
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
现在应该可以用了
更新:
确保在web路由中有模型类。还要确保您使用的是Requestuse-lighted\Http\Request代码>
在您的web路由中使用请求。请执行以下操作:
改变这个
$file = File::find(Input::get('id'))->delete();
// Delete files
Route::delete('/file/{id}', function ($id) {
//File::findOrFail($id)->delete();
$file = File::find(Input::get('id')->delete());
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
对此
$file = File::find(Request::segment(2))->delete();
// Delete files
Route::delete('/file/{id}', use function (Request $request) {
File::findOrFail($request->segment(2))->delete();
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
生成错误的原因是您试图从不存在的输入字段中检索值。您应该阅读文档,了解输入和请求之间的区别
由于表单中没有输入字段,而您只是在表单请求中传递和id,所以请更改此设置
$file = File::find(Input::get('id'))->delete();
// Delete files
Route::delete('/file/{id}', function ($id) {
//File::findOrFail($id)->delete();
$file = File::find(Input::get('id')->delete());
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
对此
$file = File::find(Request::segment(2))->delete();
// Delete files
Route::delete('/file/{id}', use function (Request $request) {
File::findOrFail($request->segment(2))->delete();
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
现在应该可以用了
更新:
确保在web路由中有模型类。还要确保您使用的是Requestuse-lighted\Http\Request代码>
在您的web路由中使用请求。请执行以下操作:
改变这个
$file = File::find(Input::get('id'))->delete();
// Delete files
Route::delete('/file/{id}', function ($id) {
//File::findOrFail($id)->delete();
$file = File::find(Input::get('id')->delete());
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
对此
$file = File::find(Request::segment(2))->delete();
// Delete files
Route::delete('/file/{id}', use function (Request $request) {
File::findOrFail($request->segment(2))->delete();
$filename= Input::get('upload');
$path = 'uploads/products/' . $file->filename;
//return redirect('/');
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
});
谢谢你的建议,但我决定改变处理这些事件的方法
1-我创建了一个新的控制器(FileController),并通过该控制器在BD和公共路径中传递了要消除的参数,对于该控制器,我们使用destroy方法
2-我从同一控制器创建路由资源
这是文件模型:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class File extends Model
{
protected $table = 'files';
protected $fillable = ['name', 'property_id'];
// Relation with Property
public function property()
{
return $this->belongsTo('App\Property');
}
}
这是视图中删除文件的部分:
<div class="col-md-12 col-xs-12">
<div class="row">
@foreach($properties->files as $index=>$file)
<div class="col-sm-4 col-md-2">
<div class="thumbnail">
<img src="{{ URL::asset('uploads/products/' . $file->name) }}" alt="{{ $file->property_id }}" width="300" height="200">
<div class="caption">
<div class="caption" align="center">
{!! Form::open(['method' => 'DELETE','route' => ['files.destroy', $file->id],'style'=>'display:inline']) !!}
{!! Form::hidden('_method', 'DELETE') !!}
{!! csrf_field() !!}
@permission('role-delete')
<button onclick="return confirm('Se eliminara la propiedad de la lista')" class="button btn btn-danger btn-xs" data-toggle="tooltip" data-placement="top" title="Eliminar imagen" data-id="{{$file->id}}"><i class="material-icons delete-white">delete</i></button>
@endpermission
{!! Form::close() !!}
</div>
</div>
</div>
</div>
@endforeach
</div>
</div>
@foreach($properties->fileas$index=>$file)
name)}“alt=“{{$file->property_id}}”width=“300”height=“200”>
{!!Form::open(['method'=>'DELETE','route'=>['files.destroy',$file->id],'style'=>'display:inline'])
{!!Form::hidden('u method','DELETE')
{!!csrf_field()!!}
@权限('role-delete')
删除
@结束许可
{!!Form::close()!!}
@endforeach
通过这个简单的表单,我们可以删除数据库和公共路径的映像
我希望与其他热情的人合作。谢谢你的建议,但我决定改变处理这些事件的方法
1-我创建了一个新的控制器(FileController),并通过该控制器在BD和公共路径中传递了要消除的参数,对于该控制器,我们使用destroy方法
2-I