2015-12-29 21 views
5

powinienem używać tej struktury ...Slim 3 Framework - Czy powinienem używać grup tras dla mojego API?

require 'vendor/autoload.php'; 
$app = new \Slim\App; 

$app->get('/books', 'getBooks'); 
$app->get('/books/{id}', 'getBook'); 

$app->run(); 

function getBooks() { 
    // Return list of books 
} 

function getBook($id) { 
    // Return a single book 
} 

Albo ten „Trasa grupy” jeden?

require 'vendor/autoload.php'; 
$app = new \Slim\App; 

$app->group('/books', function() use ($app) { 
    $app->get('', function ($req, $res) { 
     // Return list of books 
    }); 

    $app->get('/{id:\d+}', function ($req, $res, $args) { 
     // Return a single book 
    }); 
}); 

$app->run(); 

Jaki jest lepszy sposób? Ta pierwsza wydaje się znacznie czystsza. Jestem stosunkowo nowy, więc nie mam pojęcia o zaletach i wadach.

+0

W gruncie rzeczy ten drugi wygląda o wiele lepiej. ale jeśli oba działają, możesz chcieć zrobić to tak, jak ci się podoba, tak naprawdę nie nadaje się do pytań opinii – nonchip

+0

@nonchip To jest to. Nie wiem, czy to zależy od opinii, czy też jest odpowiednia konwencja. – Ivan

+0

a następnie przyjrzyj się dokumentom lub przykładowym projektom dla frameworka, a wszystko, co wydaje się być tam stosowane bardziej konsekwentnie, może być konwencją. z reguły powiedziałbym, że pierwszy przykład jest w porządku (= łatwy), jeśli utrzymujesz krótkość, ale drugi wydaje się lepiej zarządzać (zarówno z punktu widzenia optymalizacji routera, jak iz punktu widzenia programisty), więc używaj tego jeśli masz zamiar robić dużo rzeczy z książkami. – nonchip

Odpowiedz

8

Zazwyczaj używasz grup tras do organizowania podobnych zasobów lub treści, aby widocznie zobaczyć ich związek w kodzie. Grupy tras są również przydatne, jeśli chcesz umieścić specjalne warunki, takie jak oprogramowanie pośrednie, w określonej grupie. Na przykład możesz mieć sekcję administratora w swojej witrynie i chcesz upewnić się, że użytkownik jest faktycznie administratorem przed uzyskaniem dostępu do kontrolera.

$app->get('panel/admin', 'Admin/DashboardController:index')->add($adminAuth); 
$app->get('panel/admin/users', 'Admin/UserController:index')->add($adminAuth); 
$app->post('panel/admin/users', 'Admin/UserController:create')->add($adminAuth); 

Oczywiście rozsądniej byłoby grupować te trasy, ponieważ mają podobne cechy. Jeśli kiedykolwiek będziesz musiał zmienić coś na temat tych cech w przyszłości (jak typ oprogramowania pośredniego), wystarczy zrobić to tylko raz.

$app->group('/panel', function() use ($app) { 
    $app->group('/admin', function() use ($app) { 
     $app->get('', 'Admin/DashboardController:index'); 
     $app->get('/users', 'Admin/UserController:index'); 
     $app->post('/users', 'Admin/UserController:create'); 

    })->add($adminAuth); 
})->add($userAuth); 

Jest to również pomocne, gdyby kiedykolwiek chcesz poszerzyć przypadku użycia tego konkretnego URI, więc powiedzmy, że chcesz rozwałkować nową funkcję w panelu że regularni użytkownicy mogą korzystać.

$app->group('/panel', function() use ($app) { 

    $app->group('/admin', function() use ($app) { 

     $app->get('', 'Admin/DashboardController:index'); 
     $app->get('/users', 'Admin/UserController:index'); 
     $app->post('/users', 'Admin/UserController:create'); 

    })->add($adminAuth); 


    $app->get('', 'DashboardController:index'); 

})->add($userAuth); 

Chociaż nie jest to wielką wagę, to tylko dobra praktyka, aby układ cały swój kod tak zorganizowane, jak to możliwe, a grupy tras pozwalają to zrobić.

+1

Cholera, to dobra odpowiedź. Dzięki! – Ivan

+0

Uwaga wewnątrz zamknięcia grupy zamiast '$ app' używany jest' $ this'. Slim wiąże zamknięcie z instancją aplikacji dla ciebie, tak jak ma to miejsce w przypadku bindback callbacków z instancją kontenera. zamknięcie grupy wewnątrz, '$ this' jest związane z instancją Slim \ App podczas zamykania trasy,' $ this' jest powiązane z instancją Slim \ Container [Dokumentacja wąska: Grupy tras] (https://www.slimframework.com/docs/objects/router.html#route-groups) – red

+1

@red prawda, ale IDE łatwo rozumie użycie ($ app) niż $ this. Używam powyższej metody dla wszystkich moich aplikacji zamiast używać $ this. – Sojimaxi