![](/img/trans.png)
[英]Laravel Registration Error: FatalErrorException in AuthenticatesAndRegistersUsers.php line 41: Call to a member function validator() on null
[英]FatalErrorException in routes.php line 113: Call to a member function delete() on null in Laravel 5.2
我正在嘗試通過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->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>
這是我用來刪除目錄和數據庫中文件的路徑。
// 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!!!');
});
處理請求輸入時,有兩種類型的參數:路由參數和查詢參數。 路由參數是url的一部分,可作為參數提供給路由處理程序(閉包或控制器方法),而查詢參數則來自查詢字符串,並可以通過請求數據(您正在使用的Input Facade)使用。
如所寫,您的代碼有兩個問題。 首先,您的文件ID是一個路由參數,但是您試圖像訪問查詢參數一樣對其進行訪問。 其次,您實際上是在嘗試對id本身調用delete()
,因為它不作為查詢參數存在,所以實際上為null
。
您注釋掉的行應該可以正常工作:
File::findOrFail($id)->delete();
看起來當您刪除File
記錄時,您也在嘗試從文件系統中刪除File
。 我建議您向File
方法中添加一個deleted()
事件,以便每當刪除一個File
模型時,它都會從文件系統中刪除關聯的文件。
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);
});
}
}
您還可以使用delete deleting()
事件,該事件將在從數據庫中刪除文件記錄之前觸發。 如果這樣做,則如果文件刪除失敗,則可以從事件中返回false
,這將防止從數據庫中刪除記錄。
生成該錯誤是因為您試圖從不存在的輸入字段中檢索值。 您應該閱讀文檔並查看“輸入”與“請求請求”和“輸入”之間的區別
由於您的表單中沒有輸入字段,而您只是在表單請求中傳遞ID和ID,因此請更改此設置
$file = File::find(Input::get('id'))->delete();
對此
$file = File::find(Request::segment(2))->delete();
現在應該可以正常工作了。
已更新:確保您的模型路線中包含模型類。 還要確保您正在使用Request use Illuminate\\Http\\Request;
在您的網絡路由中,使用請求。 請執行以下操作:更改此
// 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!!!');
});
對此
// 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-我創建了一個新的控制器(FilesController),並通過該控制器在BD和公共路徑中傳遞了要消除的參數,對於該控制器,我們使用destroy方法。
2-我從同一控制器創建Route資源。
這是文件模型:
<?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');
}
}
這是FilesController方法:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Input;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\File;
use Redirect;
use Storage;
class FilesController extends Controller
{
public function destroy(Request $request, $id)
{
$file = File::find($id);
$fileName = $file->name;
//dd($fileName);
$file_path = public_path() . "/uploads/products/" . $fileName;
//dd($file_path);
if(File::exists($file_path))
{
unlink($file_path);
}
$file->delete();
return redirect()->back()->with('success', 'Imagen eliminada satisfactoriamente!!!');
}
}
路線:
Route::resource('properties','PropertyController');
這是視圖中刪除文件的部分:
<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>
通過這種簡單的形式,我們可以刪除數據庫和公共路徑的圖像。
我希望與其他熱情的人合作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.