2017-07-19 4 views
0

SlimPhpを使用して経路のパターンや構造を書く方法はありますか?SlimPhpマイクロフレームワークのApiルートパターン?

$app->get('/api/shirt/{id}', function (Request $request, Response $response) { 
    //CODE 
}); 
$app->get('/api/some-other-endpoint/{id}', function (Request $request, Response $response) 
    //CODE 
}); 

しかし、いくつかの時間後、私は私のインデックスファイルはかなり大きな得ることを実現:

などは、私はすべてのルートを保存するためのindex.phpとAPIフォルダを作りました。

エンドポイントルートはどのように管理できますか?クラス、コントローラ、アクションの使用?

これらの特定の概念に関するドキュメントはどこにありますか?

公共/ index.phpを

chdir(dirname(__DIR__)); 

require_once 'vendor/autoload.php'; 

$app = new Slim\App; 
require 'app/routes/index.php'; 
$app->run(); 

アプリ/路線/インデックス:私は、ドメインの後のパスに基づいて使用するルートを決定するためにスリムのルータを必要とする前に、

+0

速くAPIを構築するには、あなたがLaravelに切り替えることもできますし、 [リソースコントローラ](https://laravel.com/docs/5.4/controllers#resource-controllers)を使用してください。同じルート構文! –

+0

私はlaravelについて読んでいます。しかし、私はスリムなPHPを使用していくつかのソリューションを見つけるしようとしています。いくつかのコントローラパッケージのように、私はフレームワークを変更する代わりにスリムを使い続けたいと思っています。 –

答えて

2

私はコントローラー(この例ではActionという名前の)を使用していますが、1つのファイルにすべてのルーティングがあります。

さらに、私はそれがより良い構造(私の意見では)を与えるので、できる限り私はグループ化を使用します。 アクションクラスを可能な限り小さくして、私が変更したいクラスを取得するためのルートファイルを見る必要はありません。ここで

例:

ルート・ファイル

$app->get('/user/{name}', [ShowUserAction::class, 'showUser'])->setName('user'); 
$app->get('/login', [LoginUserAction::class, 'showLogin'])->setName('login'); 

$app->group('/api', function() { 
    $this->get('/images', [ImagesApi::class, 'getImages'])->setName('api.images'); 
    $this->get('/tags', [ImagesApi::class, 'getTags'])->setName('api.tags'); 
    $this->get('/notifications', [UserNotificationsApiAction::class, 'getNotifications'])->setName('api.notifications'); 
    $this->get('/bubbleCount', [BubbleCountApiAction::class, 'getBubbleCount'])->setName('api.bubbleCount'); 
}); 

$app->group('/review', function() use ($currentUser) { 
    $this->get('', [ReviewAction::class, 'showReviewOverview'])->setName('review.overview')->setName('review') 
    $this->get('/{type}', [ReviewAction::class, 'showReviewWithType'])->setName('review.type') 
    $this->get('/{type}/{id}', [ReviewAction::class, 'showReview'])->setName('review.type.id') 
}); 

アクションクラス

class LoginUserAction 
{ 
    public function __construct() { } // with parameters 

    public function showLogin(Request $request, Response $response) 
    { 
     if ($this->currentUser->isLoggedIn()) { 
      return $response->withRedirect($this->router->pathFor('index')); 
     } 

     return $this->view->render($response, 'user/login.twig'); 
    } 

    public function doLogin(Request $request, Response $response) 
    { 
     // check user name password and then login 
    } 
} 
+0

これは私が考えていたものと非常によく似ていて、私はこのようなことを私のプロジェクトに適用できると思う。私はクラスを使うのが好きだから。 –

1

は、私は通常自分のルーターを持っています.php

$_url = parse_url($_SERVER['REQUEST_URI']); 
$_routes = explode('/',$_url['path']); 
$_baseRoute = $_routes[1]; 

switch ($_baseRoute) { 
    case 'api': 
     $_routeFile = 'app/api/' . $_routes[2] . '.php'; 
     break; 

    default: 
     $_routeFile = 'app/routes/' . $_baseRoute . '.php'; 
     break; 
} 

if (file_exists($_routeFile)) { 
    require $_routeFile; 
} 
else { 
    die('Invalid API request'); 
} 
関連する問題