簡體   English   中英

route.php第113行中的FatalErrorException:在Laravel 5.2中,在null上調用成員函數delete()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM