Итак, я был на последнем Laravel 5.1 и обновлен до 5.2 сегодня. В моих маршрутов у меня есть что-то вроде этого:Laravel 5.2 - Обновленная и маршрутная группа промежуточного программного обеспечения теперь больше не называется
Route::group(['middleware' => ['api']], function() {
// Members
Route::get('members', '{api-namespace}\[email protected]');
Route::get('member/{id}', '{api-namespace}\[email protected]');
// Members Pension
Route::get('member/{id}/pension/beneficiaries', '{api-namespace}\Inquiry\[email protected]');
Route::get('member/{id}/pension/contributions', '{api-namespace}\Inquiry\[email protected]');
Route::get('member/{id}/pension/yearlySummary', '{api-namespace}\Inquiry\[email protected]');
Route::get('member/{id}/pension/pensioners', '{api-namespace}\Inquiry\[email protected]');
// Members Summary
Route::get('member/{id}/beneficiaries/{fund?}', '{api-namespace}\[email protected]');
Route::get('member/{id}/contributions/', '{api-namespace}\[email protected]');
// Beneficiaries
Route::get('beneficiaries', '{api-namespace}\[email protected]');
Route::get('beneficiary/{id}', '{api-namespace}\[email protected]');
// Contributions
Route::get('contributions', '{api-namespace}\[email protected]');
Route::get('users', '{api-namespace}\[email protected]');
});
АНИ-версия промежуточного слоя в основном проверяет заголовок для Апи-версии, а затем заполняет {апи-имен} в действиях маршрут соответствующим образом. Это прекрасно работает в 5.1. Тем не менее, с момента обновления я получаю Class App\\Http\\Controllers\\{api-namespace}\\MembersController does not exist
, и он даже не попадает в мое промежуточное ПО. У меня возникло ощущение, что они, возможно, изменили порядок кода, чтобы он проверял действия маршрута перед запуском промежуточного программного обеспечения, потому что, если я поместил промежуточное ПО во всем мире, он отлично работает. Тем не менее, мне нужна эта группа api-версий, поэтому, если у кого-нибудь есть идеи, как обойти это, я все уши.
По запросу:
Kernel.php
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
/**
* The application's route middleware.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'api-version' => \App\Http\Middleware\ApiVersionMiddleware::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
'api-version',
'cors'
],
];
}
ApiVersionMiddleware.php
<?php namespace App\Http\Middleware;
use Closure;
use Jbm\Exceptions\ApiVersionException;
use Jbm\Helpers\ApiVersion;
class ApiVersionMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$route = $request->route();
$actions = $route->getAction();
$requestedApiVersion = ApiVersion::get($request);
if (!ApiVersion::isValid($requestedApiVersion)) {
throw new ApiVersionException('Invalid API Version');
}
$apiNamespace = ApiVersion::getNamespace($requestedApiVersion);
$actions['uses'] = str_replace(
'{api-namespace}', $apiNamespace, $actions['uses']
);
$route->setAction($actions);
return $next($request);
}
}
заметить также, что я переместил промежуточное программное обеспечение в группу промежуточного слоя и его до сих пор не работает. Просто FYI
Update:
Я попытался двигаться к промежуточному к глобальным, но в тот момент она имеет 0 информацию о маршруте, что означает, что он не может изменить маршрут, чтобы заменить {api-namespace}
. Я считаю, что проблема заключается в том, что маршрут «использует» проверяется до того, как на него запускается промежуточное ПО, которое явно не работает. Может ли кто-нибудь подтвердить это и/или показать мне, как я буду реализовывать что-то подобное в 5.2?
Update 2:
Так я обнаружил проблему. В Illuminate/Routing/Router.php:834
маршрутизатор пытается заменить неявные привязки. Это происходит до ПО промежуточного слоя и проверяет маршрут для действительных «использования». У меня есть идея, как обойти это, поскольку он полностью сдувает то, что я сейчас делаю. Какие-либо предложения?
Это, вероятно, что-то делать с Laravel 5.2 пытается автоматически вводить модели/классы в контроллер звонки. См. Раздел «Неявная привязка модели» в [Замечания по выпуску Laravel 5.2] (https://laravel.com/docs/5.2/releases#laravel-5.2) – samlev
im действительно думает, что это имеет отношение к этому: https: // mattstauffer.co/blog/middleware-groups-in-laravel-5-2. Они создали группы промежуточного программного обеспечения, а синтаксис для вызова групп промежуточного программного обеспечения - это то же самое, что и раньше, чтобы привязать промежуточное программное обеспечение к группе маршрутов ... так что, вероятно, это противоречиво. Перейти к тесту –
Сообщение об ошибке означает, что оно пытается привязываться к модели на основе вашего пути, но не может найти модель – samlev