イルミネイト4.1パッケージに基づくJWTサポートで完全機能のAPIを起動しようとしていました。スタンドアロンイルミネイト4.1スタックのフィルタの前にイベントが発生しない
現在のスタックが含まれています:
- イベント
- キャッシュ 私が使用しているデータベース
- 設定
- 認証
そして、JWTのため
これまでのところ、コンテナは動作していますが、私はルーティングを得るために苦労しているようです。before
フィルタが動作しています。問題は、beforeフィルタが "無視される"ということです。テストルートを使用して、応答を返す代わりにコントローラの出力で応答します。トークンが見つからないか類似しています。
タイモン/ JWT-AUTHのセットアップウィキに続いて、私は手動でもJWTAuth::parseToken()->toUser()
を行うことで、トークンを解析することによって、そのテスト
<?php
/** @var \Illuminate\Routing\Router $router */
$router = $app['router'];
$router->post('/auth', 'MyApp\Api\Controllers\Auth\[email protected]');
$router->group(array('before' => 'jwt-auth'), function (\Illuminate\Routing\Router $router) {
$router->post('/authed', 'MyApp\Api\Controllers\[email protected]');
});
私のroutes.phpの中でjwt-auth
フィルタを使用してルーティンググループを作成しました完全に機能したので、問題をbefore
フィルタに切り離しました。
フィルタを処理する方法についてスタックを歩き、イベントDispatcherで発生した部分に到達しました。これについての私の理論は、それがイベントを発射していないか、またはリスナーがそれほど反応しないということです。
私はテスト対象として、オリジナルのtymon/jwt-auth 0.4を持つLaravel 4.1アプリケーションを作成しました。私は同様にすべてをセットアップし、before
フィルタが動作するように動作します。参考として
、ここに私の全体を照らしスタックAPIのブートストラップ(パブリック/ index.phpを)
<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD');
require_once(__DIR__ . '/../../../vendor/autoload.php');
require_once(__DIR__ . '/../../../vendor/illuminate/support/Illuminate/Support/helpers.php');
use Illuminate\Auth\AuthServiceProvider;
use Illuminate\Cache\CacheServiceProvider;
use Illuminate\Config\FileLoader;
use Illuminate\Config\Repository;
use Illuminate\Container\Container;
use Illuminate\Events\EventServiceProvider;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Filesystem\FilesystemServiceProvider;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\RoutingServiceProvider;
use Illuminate\Support\ClassLoader;
use Illuminate\Support\Facades\Facade;
use Tymon\JWTAuth\Providers\JWTAuthServiceProvider;
$configDir = __DIR__ . '/../config';
$controllersDir = __DIR__ . '/../src/Controllers';
$modelsDir = __DIR__ . '/../../../models';
ClassLoader::register();
ClassLoader::addDirectories(array($controllersDir, $modelsDir));
$app = new Container;
Facade::setFacadeApplication($app);
$app['app'] = $app;
$app['env'] = env('APP_ENVIRONMENT');
$loader = new FileLoader(new Filesystem, $configDir);
$config = new Repository($loader, 'production');
$app['config'] = $config;
$request = Request::createFromGlobals();
$app['request'] = $request;
with(new EventServiceProvider($app))->register();
with(new CacheServiceProvider($app))->register();
with(new RoutingServiceProvider($app))->register();
with(new FilesystemServiceProvider($app))->register();
with(new AuthServiceProvider($app))->register();
with(new JWTAuthServiceProvider($app))->register();
require(__DIR__ . '/../src/routes.php');
try {
$response = $app['router']->dispatch($request);
} catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
$response = new JsonResponse(array(
'status_code' => $e->getStatusCode(),
'message' => $e->getMessage()
), $e->getStatusCode());
} catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
$response = new JsonResponse(array(
'status_code' => $e->getStatusCode(),
'message' => $e->getMessage()
), $e->getStatusCode());
} catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
$response = new JsonResponse(array(
'status_code' => $e->getStatusCode(),
'message' => $e->getMessage()
), $e->getStatusCode());
} catch (\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e) {
$response = new JsonResponse(array(
'status_code' => JsonResponse::HTTP_NOT_FOUND,
'message' => 'Route not found'
), JsonResponse::HTTP_NOT_FOUND);
} catch (\Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException $e) {
$response = new JsonResponse(array(
'status_code' => JsonResponse::HTTP_FORBIDDEN,
'message' => 'Method not allowed'
), JsonResponse::HTTP_FORBIDDEN);
}
$response->send();
がある誰も私に動作する前にフィルタを取得する方法についていくつかのポインタを与えることができますか? サービスプロバイダの登録に関連する可能性がありますか? イベントを成功させるために何かが欠けていますか? デフォルトのイベントリスナーがない可能性がありますか?
ハハ、あなたは私を救った。私は、サービスプロバイダを登録した後に 'boot()'を起動しなければなりませんでした。また、アプリケーションコンテナへの 'path'をおろす必要がありました。しかし、これらの変更を加えれば、beforeフィルターが機能しています。この問題を見つけるのを手伝ってくれてありがとう、ありがとう。私は21時間であなたに賞金を授与します:) –
嬉しいことです。 'register()'の前に 'boot()'を実行することをお勧めします。これはLaravelがサービスプロバイダを扱う順序です。 – radmen