Laravel - Передача переменных из промежуточного программного обеспечения в контроллер/маршрут

Как передать переменные из промежуточного программного обеспечения в контроллер или маршрут, который выполняет такое промежуточное программное обеспечение? Я видел сообщение о добавлении его к следующему запросу:

$request->attributes->add(['key' => $value);

также другие пользователи, использующие flash:

Session::flash('key', $value);

но я не уверен, что это лучшая практика, или если есть лучший способ сделать это? Вот мое промежуточное ПО и маршрут:

namespace App\Http\Middleware;

use Closure;

class TwilioWorkspaceCapability
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $workspaceCapability = new \Services_Twilio_TaskRouter_Workspace_Capability("xxxxx", "xxxx", "xxxx");
        $workspaceCapability->allowFetchSubresources();
        $workspaceCapability->allowDeleteSubresources();
        $workspaceCapability->allowUpdatesSubresources();
        $token = $workspaceCapability->generateToken();
        //how do I pass variable $token back to the route that called this middleware
        return $next($request);
    }
}

Route::get('/manage', ['middleware' => 'twilio.workspace.capability', function (Request $request) {
    return view('demo.manage', [
        'manage_link_class' => 'active',
        'twilio_workspace_capability' => //how do I get the token here?...
    ]);
}]);

FYI причина, по которой я решил использовать промежуточное ПО для этого, заключается в том, что я планирую кэшировать токен для его жизненного цикла, иначе это было бы ужасной реализацией, так как я бы запросил новый токен по каждому запросу.

Ответ 1

передать пару значений ключа таким образом

$route = route('routename',['id' => 1]);

или к вашему действию

$url = action('[email protected]', ['id' => 1]);

Вы можете передавать данные с помощью

 return view('demo.manage', [
    'manage_link_class' => 'active',
    'twilio_workspace_capability' => //how do I get the token here?...
]) -> with('token',$token);

в вашем промежуточном программном обеспечении

 public function handle($request, Closure $next)
 {
    $workspaceCapability = new .....
    ...
    $request -> attributes('token' => $token);

    return $next($request);
 }

в вашем контроллере

 return Request::get('token');

Ответ 2

Я использовал бы laravel контейнер IOC для этого.

в вашем регистровом методе AppServiceProvider

$this->app->singleton(TwilioWorkspaceCapability::class, function() { return new TwilioWorkspaceCapability; });

Это будет означать, что там, где он DI (зависимость вводит) этот класс в вашем приложении, будет введен один и тот же конкретный экземпляр.

В вашем классе TwilioWorkspaceCapability:

class TwilioWorkspaceCapability {

    /**
     * The twillio token
     * @var string
     */
    protected $token;


    /**
     * Get the current twilio token
     * @return string
     */
    public function getToken() {
        return $this->token;
    }

    ... and finally, in your handle method, replace the $token = ... line with:
    $this->token = $workspaceCapability->generateToken();
}

Затем на вашем маршруте:

Route::get('/manage', ['middleware' => 'twilio.workspace.capability', function (Request $request, TwilioWorkspaceCapability $twilio) {
    return view('demo.manage', [
        'manage_link_class' => 'active',
        'token' => $twilio->getToken(),
    ]);
}]);