Как я могу использовать метод show моего контроллера ресурсов на мягкой удаленной модели? - PullRequest
0 голосов
/ 27 сентября 2018

Итак, у меня есть контроллер ресурсов с именем ProjectController, и я добавил soft delete и использую его как архив.

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, но это не работает.

Как я могу использовать метод 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 ]

0 голосов
/ 27 сентября 2018

Добавив чек в \App\Providers\RouteServiceProvider.

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

Надеюсь, это поможет другим.

0 голосов
/ 27 сентября 2018

Возможно, я полностью неправильно понял проблему, но насколько я понял:

Вы можете исключить некоторые функции контроллера, такие как;

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 вы можете использовать:

php artisan help make:controller

Надеюсь, что все это поможет.

Новое добавление:

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

и объявление функциимусор,

public function trash(int $id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...