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(),
]);
}]);