/** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * * @return mixed */ public function handle($request, Closure $next) { $owner = $creator = null; /** @var TenantContract $tenant */ $tenant = app('auth.tenant'); /** @var TenantParticipantContract $owner */ if (null !== ($tenantOwnerId = $request->route('tenant_owner_id'))) { if ($tenant->getTenantOwnerId() && $tenantOwnerId != $tenant->getTenantOwnerId()) { abort(500, sprintf('Selected tenant_owner_id "%s" in route parameters does not match the resolved owner "%s: %s"', $tenantOwnerId, $tenant->getTenantOwnerId(), $tenant->getTenantOwner()->getName())); } $owner = $this->repository->find($tenantOwnerId); } /** @var TenantParticipantContract $creator */ if (null !== ($tenantCreatorId = $request->route('tenant_creator_id'))) { $creator = $this->repository->find($tenantCreatorId); } /** @var BelongsToTenantContract $user */ $user = $this->auth->user(); if (!$user instanceof BelongsToTenantContract) { abort(500, sprintf('The Authenticatable User entity does not implement BelongsToTenant contract.')); } if (!$creator || !$user->belongsToTenant($creator)) { return redirect()->route('tenant.access_denied'); } if ($owner && $creator->getTenantOwner() !== $owner) { return redirect()->route('tenant.invalid_tenant_hierarchy'); } // remove the tenant parameters, TenantAware URL generator has access to Tenant $request->route()->forgetParameter('tenant_owner_id'); $request->route()->forgetParameter('tenant_creator_id'); // bind resolved tenant data to container $tenant->updateTenancy($user, $creator->getTenantOwner(), $creator); return $next($request); }
/** * Returns the class name of the object managed by the repository. * * @return string */ public function getClassName() { return $this->repository->getClassName(); }