2017-11-03 3 views
4

Können wir einen einzigen Controller für mehrere Routen haben, und erhalten Sie den Parameter?Laravel - mehrere Ressourcen Routen zu einem einzigen Controller mit Argument

Derzeit habe ich diese Routen:

Route::resource('/customers', 'CustomerController'); 
Route::resource('/agents', 'AgentController'); 

Und ein CustomerController und AgentController mit allen Arbeitsressourcenfunktionen.

Aber als CustomerController und AgentController sind fast die gleichen mit Ausnahme für ein Datenbankfeld, d.h. group_id. Ich dachte, ein Controller heißt PartyController und eine Route zu verwenden, wie:

Route::resource('/parties/customers', 'PartyController '); 
Route::resource('/parties/agents', 'PartyController '); 

oder wenn jemand schlägt vor:

Route::resource('/parties/{group}', 'PartyController '); 

Ich habe für eine Weile gesucht, aber es schwer, diesen Weg zu beschreiten. Ich habe diesen Code im Konstruktor von PartyController, hinzugefügt, um die Berufung Route zu überprüfen:

$path = Request::capture()->path(); 
    $this->group = ucwords(explode("/", $path)[1]); 
    echo($this->group); 

Alles scheint bis hier gut zu laufen. Aber wenn in meinem index.blade.php, ich habe diese Aussage:

<p>{{ link_to_route('parties.create', 'Add new') }}</p> 

Ich erhalte eine Ausnahme:

Route [parties.create] not defined. 

ich mehrere Kombinationen versucht haben, ohne Erfolg und mehr Fehler kommen durch, wie den Zugriff auf /parties/customers/create doesn Ich arbeite jetzt nicht.

Also, ist es irgendwie möglich oder sollte ich diese Idee aufgeben?

EDIT: Meine Frage unterscheidet sich von Same Laravel resource controller for multiple routes, da ich kein Merkmal verwende.

+0

ein weiterer tumbleweed !!! aber ich denke, ich habe das Problem gelöst ... – Khan

+0

Mögliches Duplikat von [Same Laravel Resource Controller für mehrere Routen] (https://stackoverflow.com/questions/46128476/same-laravel-resource-controller-for-multiple-routes) – sepehr

Antwort

1

ich es getan habe von meinem eigenen Ansatz, habe ich die gleichen Strecken.

Route::resource('/parties/agents', 'PartyController'); 
Route::resource('/parties/customers', 'PartyController'); 

und in Konstruktor PartyController

$path = Request::capture()->path(); 
$group = strtolower(explode("/", $path)[1]); 

Jetzt habe ich die Variable $ Gruppe, welche Gruppe arbeite ich mit zu identifizieren.

Und in meiner Klinge Dokumente ersetzt ich parties.create mit $ group.create

<a href="{{ route($group.'.create')}}" > Add new </a> 

Das Gleiche gilt für andere Routen .. Jetzt funktioniert es wollte, so wie ich.

Vielen Dank für Hilfe.

5

Wenn ich Sie wäre, würde ich verwenden:

Route::resource('/customers', 'CustomerController'); 
Route::resource('/agents', 'AgentController'); 

Jetzt können Sie AgentControllerCustomerController erstreckt machen (oder einen anderen Controller, den Sie möchten), so können sie denselben Code wiederverwenden. Bei Bedarf können Sie im Konstruktor einige Eigenschaften für eine Beispielgruppe festlegen, um zu erfahren, ob Sie mit Agenten oder Kunden arbeiten.

Um Ihre Routen zu machen arbeiten Sie zusätzliche Variable von der Steuerung, anzuzeigen passieren können in Ihrer Klinge haben:

<p>{{ link_to_route($group.'.create', 'Add new') }}</p> 
1
<p>{{ link_to_route('parties.create', 'Add new') }}</p> 

Sie den variablen Parameter verpasst hinzugefügt, sollte es

<p>{{ link_to_route('parties.' . $group . '.create', 'Add new') }}</p> 
sein
1

Wie ich gerade denke ... Es wäre schön, Klassenvererbung zu verwenden! : D

Sie können beide PartyController als Eltern von CustomerController definieren und AgentController (beide von ihnen erstreckt PartyController).

Also, verschieben Sie Ihre gemeinsamen Methoden in PartyController und rufen Sie sie von Customer/Agent Controller. :)

1

Also, zuerst definieren Sie Routen mit der nächsten Zeile:

Route::resource('/parties/agents', PartiesAgentsController::class); 
Route::resource('/parties/customers', PartiesCustomersController::class); 

Dann könnten Sie einige Parteien im REST-Stil benötigen:

class PartiesController extends BaseController 
{ 

    /** 
    * The Entry Repository 
    * 
    * @var EntryRepositoryInterface 
    */ 
    protected $repository; 

    /** 
    * Create an instance of the RestController class 
    * 
    * @param EntryRepositoryInterface $repository 
    */ 
    public function __construct(EntryRepositoryInterface $repository) 
    { 
     parent::__construct(); 

     if (!$this->request->ajax()) 
     { 
      return redirect('/'); 
     } 

     $this->repository = $repository; 
    } 

    /** 
    * Display a listing of the resource. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function index() 
    { 
    } 

    /** 
    * Show the form for creating a new resource. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function create() 
    { 
    } 

    /** 
    * Store a newly created resource in storage. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\Response 
    */ 
    public function store() 
    { 
    } 

    /** 
    * Display the specified resource. 
    * 
    * @param int       $slug 
    * @return \Illuminate\Http\Response 
    */ 
    public function show($slug) 
    { 
    } 

    /** 
    * Show the form for editing the specified resource. 
    * 
    * @param int       $id 
    * @return \Illuminate\Http\Response 
    */ 
    public function edit($id) 
    { 
    } 

    /** 
    * Update the specified resource in storage. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param int       $id 
    * @return \Illuminate\Http\Response 
    */ 
    public function update(Request $request, $id) 
    { 
    } 

    /** 
    * Remove the specified resource from storage. 
    * 
    * @param int       $id 
    * @return \Illuminate\Http\Response 
    */ 
    public function destroy($id) 
    { 
    } 

} 

Im Inneren des Konstrukts Verfahren dieser Controller Ich bin Machen Sie einige Überprüfungen und andere Operationen, wie Sie sehen konnten. Ich benutze auch Repositories ... Es ist kein DDD).

Dann kann ich alle oben wie verwenden:

class PartiesAgentsController extends PartiesController 
{ 

    /** 
    * Create an instance of the PartiesAgentsController class 
    * 
    * @param EntryRepositoryInterface $repository 
    */ 
    public function __construct(PartyAgentRepositoryInterface $repository) 
    { 
     parent::__construct($repository); 
    } 

} 

Und das gleiche für die Kunden würde ...

Verwandte Themen