0

Im Allgemeinen sollte dies ein eher einfaches Problem sein. IT sollte der folgenden Frage auf Stack OverflowLaravel 5.4: Übergabe einer Variablen über Request an Controller

sehr ähnlich sein.

Alles, was ich tun möchte, ist eine Variable von der Middleware an den Controller übergeben, also bin ich nicht mysql-Abfragen duplizieren.

Hier ist meine Middleware:

namespace App\Http\Middleware; 

use Closure; 

class CheckRole 
{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     $id = $request->user()->id; 
     $rr = $request->user()->isSuperAdmin(); 

     if ($request->user()->isSuperAdmin()) { 
      $request->merge(['group' => 123]); 

      return $next($request); 
     } 

     echo "not admin"; 
    } 
} 

So ist die Middleware funktioniert gut und wenn ich DD ($ request) auf der Middleware Ich sehe meine Gruppe => 123 auf der Seite. (Im Moment ist es 123 aus Gründen der Einfachheit.)

So möchte ich es meinen Admincontroller weitergeben müssen:

<?php 

namespace SleepingOwl\Admin\Http\Controllers; 

use Illuminate\Http\Request; 
use Illuminate\Routing\Controller; 
use SleepingOwl\Admin\Form\FormElements; 
use SleepingOwl\Admin\Form\Columns\Column; 
use SleepingOwl\Admin\Display\DisplayTable; 
use Illuminate\Contracts\Support\Renderable; 
use SleepingOwl\Admin\Display\DisplayTabbed; 
use Illuminate\Validation\ValidationException; 
use SleepingOwl\Admin\Contracts\AdminInterface; 
use SleepingOwl\Admin\Model\ModelConfiguration; 
use Illuminate\Contracts\Foundation\Application; 
use SleepingOwl\Admin\Contracts\Form\FormInterface; 
use SleepingOwl\Admin\Contracts\ModelConfigurationInterface; 
use SleepingOwl\Admin\Contracts\Display\ColumnEditableInterface; 

class AdminController extends Controller 
{ 
    /** 
    * @var \DaveJamesMiller\Breadcrumbs\Manager 
    */ 
    protected $breadcrumbs; 

    /** 
    * @var AdminInterface 
    */ 
    protected $admin; 

    /** 
    * @var 
    */ 
    private $parentBreadcrumb = 'home'; 

    /** 
    * @var Application 
    */ 
    public $app; 

    /** 
    * AdminController constructor. 
    * 
    * @param Request $request 
    * @param AdminInterface $admin 
    * @param Application $application 
    */ 
    public function __construct(Request $request, AdminInterface $admin,    Application $application) 
    { 
     $this->middleware('CheckRole'); 

So wie man sehen kann ich die Middleware auf diesem Konstruktor aufrufen. scheint

$request->get('group'); or $request->group; 

Nach dem Versuch, noch eine ganze Weile nichts zu arbeiten, und ich halte einen Nullwert bekommen: Nachdem es nennen sollte ich in der Lage, wie etwas zu tun sein. Grundsätzlich sollte das nicht sehr schwierig sein, aber ich habe anscheinend meine Syntax ausgeschaltet oder verwende nicht die richtigen Namensräume?

+1

Nun technisch nennen Sie nicht wirklich die Middleware auf dem Konstruktor. Sie haben gerade gesagt, dass die CheckRole-Middleware für alle Routen angewendet werden sollte, die auf die Controller-Methoden zeigen. Ihr Beispiel funktioniert gut für mich, wenn ich dd ($ request-> all()) in einer Controller-Methode wie index aufrufen. Die Anfrage wird nicht innerhalb des Konstruktors geändert. –

Antwort

1

Anstelle dieser Codezeile:

$request->merge(['group' => 123]); 

können Sie versuchen:

$request->request->add(['group' => 123]); 

Was dieser Code Zeile ist tun, wenn ein Parameter group existiert in der $request nannte es überschreibt mit dem neuen Wert, andernfalls wird ein neuer Parameter group zu

hinzugefügt

In Ihrem Controller, können Sie den Wert von group Parameter erhalten als:

$group = $request->group; ODER $group = $request->input('group');

+0

Okay, wenn ich eine dd ($ Anfrage) auf der Middleware Seite mache, sehe ich es im Dump. Wenn ich jedoch versuche, den Wert auf der Controllerseite zu extrahieren, bekomme ich nichts. 'echo" ----> ". $ request-> get ('group'); ' – Chad

+0

Ich habe meine Antwort bearbeitet und nun den Code hinzugefügt, um den Wert des Parameters im Controller zu extrahieren. Lassen Sie mich wissen, wenn Sie noch Probleme haben. –

+0

Bitte denken Sie daran, meine Antwort zu akzeptieren und ein UP zu geben, wenn mein Code wirklich geholfen hat, Ihr Problem zu lösen. Vielen Dank –

0

Durch die gemeinsame Hilfe von @ Rahul-Gupta und @shock_gone_wild. Es war eine gemeinsame Anstrengung, denke ich.

Das erste Problem ist, dass ich sleepingOwl Laravel Boilerplate verwende. Wahrscheinlich nicht die beste Idee für jemanden, der neu in Laravel ist. (nicht neu in MVC/PHP).

Basierend auf dem @shock_gone_wild-Kommentar, beschließen Sie, meinen Test auf einen einfachen Controller zu übertragen, und nicht auf den schlafenden Eulen-Unsinn. (Sie haben eine Menge Code.) Wie auch immer, ich glaube das hat geholfen. Ich habe die Middleware im Konstruktor belassen, weil ich die Middleware nicht auf die Routen angewendet habe.

Dann folgte ich @ Rahul-Gupta-Syntax.

Also hier ist das Endergebnis, hoffentlich wird dies irgendwann jemand irgendwann retten ...

namespace App\Http\Middleware; 

use Closure; 

class CheckRole { 

/** 
* Handle an incoming request. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Closure $next 
* @return mixed 
*/ 
public function handle($request, Closure $next) { 


if ($request->user()->isSuperAdmin()) { 
    $request->request->add(['group' => 123]); 
    return $next($request); 
} else { 
    echo "not admin"; 
} 
} 

} 

Dann hier ist der einfache Controller.

use Illuminate\Http\Request; 
use App\task; 
use App\User; 
use App\HasRoles; 

class TaskController extends Controller { 

public function __construct() { 
    // constructor code... 
    $this->middleware('auth'); 
    $this->middleware('CheckRole'); 
} 

public function index(Request $request) { 

    $group = $request->input('group'); 
    echo "---->" . $group; 

    $tasks = Task::all(); 

    return view('test_task', compact('tasks')); 

} 

} 
Verwandte Themen