代码之家  ›  专栏  ›  技术社区  ›  Ron van der Heijden

如何在软删除模型上使用资源控制器的show方法?

  •  1
  • Ron van der Heijden  · 技术社区  · 7 年前

    ProjectController 我添加了软删除并将其用作存档。

    Route::get('project/archive', 'ProjectController@trash')->name('project.archive');
    Route::resource('project', 'ProjectController');
    

    在这个档案中,我有一个项目列表。

    public function trash()
    {
        $projects = Project::onlyTrashed()->get();
        return view('projects.archive', compact('projects'));
    }
    

    show 方法来查看这些项目。

    \App\Providers\RouteServiceProvider 我补充说:

    Route::bind('project', function ($value) {
        return \App\Project::withTrashed()->find($value);
    });
    

    但是这样,我就可以编辑这个项目了。

    我试着绑起来 project/show , project/{project}/show ,但这不起作用。

    我怎么用这个 显示 我的资源控制器在一个垃圾项目上的方法?

    我的整个ProjectController看起来像:

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Http\Requests\ProjectRequest;
    use App\Project;
    
    class ProjectController extends Controller
    {
    	public function index()
    	{
    		$projects = Project::all();
    		return view('project.index', compact('projects'));
    	}
    
    	public function create()
    	{
    		return view('project.create');
    	}
    
    	public function store(ProjectRequest $request)
    	{
    		Project::create($request->all());
    		return redirect()->route('project.index');
    	}
    
    	public function show(Project $project)
    	{
    		return view('project.show', compact('project'));
    	}
    
    	public function edit(Project $project)
    	{
    		return view('project.edit', compact('project'));
    	}
    
    	public function update(ProjectRequest $request, Project $project)
    	{
    		$project->update($request->all());
    		return redirect()->route('project.index');
    	}
    
    	public function destroy(Project $project)
    	{
    		$project->delete();
    		return redirect()->route('project.archive');
    	}
    
    	public function trash()
    	{
    		$projects = Project::onlyTrashed()->get();
    		return view('project.archive', compact('projects'));
    	}
    }
    2 回复  |  直到 7 年前
        1
  •  6
  •   Ron van der Heijden    7 年前

    通过在 \App\Providers\RouteServiceProvider .

    Route::bind('project', function ($value) {
        if (Route::currentRouteName() === 'project.show') {
            return \App\Project::withTrashed()->find($value);
        }
        return \App\Project::find($value);
    });
    

        2
  •  1
  •   mutas    7 年前

    我可能完全误解了这个问题,但据我所知:

    您可以排除控制器的某些功能,例如;

    Route::resource('photos', 'PhotoController')->only([
        'index', 'show'
    ]);
    
    Route::resource('photos', 'PhotoController')->except([
        'create', 'store', 'update', 'destroy'
    ]);
    

    更详细的信息 https://laravel.com/docs/5.7/controllers#restful-partial-resource-routes

    另外,如果你想实现一个资源控制器,它只使用垃圾项目,而不是一个常规的laravel模型,作为一个资源,你必须通过如下方式生成一个新的控制器

    php artisan make:controller -r ProjectArchiveController
    

    并对其功能进行了相应的定制。有关更多选项make:controller command,可以使用;

    php artisan help make:controller
    

    新增内容:

    Route::get('project/{id}', 'ProjectController@trash')->name('project.archive');
    Route::resource('project', 'ProjectController');
    

    和功能声明,

    public function trash(int $id)