Skip to content

Instantly share code, notes, and snippets.

@alganet
Created April 12, 2011 18:48
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alganet/916119 to your computer and use it in GitHub Desktop.
Save alganet/916119 to your computer and use it in GitHub Desktop.
Another microframework concept
<?php
$r = new Respect\Rest\Router;
$r->get('/', function() {
return 'Hello World';
});
$r->get('/users', function() use($users) {
return $users->list()->toHTML(); //sample model/view call
});
$r->get('/posts/*/*/*'), function($year=null,$month=null,$day=null) use($posts) {
return $posts->find($year, $month, $day)->toHTML(); //sample model/view call
});
<?php
$r = new Respect\Rest\Router;
$singleArticle = $r->get('/articles/*', function($id) use($articles) {
return $articles->show($id)->toHTML(); //sample model/view call
});
$r->post('/article', function() use ($articles) {
$createdId = $articles->create($_POST); //sample model/view call
return $singleArticle->redirect($createdId);
});
<?php
$r = new Respect\Rest\Router;
$view = new Twig_BlaBlaBla;
$r->get('/users', function() use($users, $view) {
$userList = $users->list(); //sample model call
return $view->display('users.phtml', $userList);
});
<?php
class MyArticle {
public function __construct($db) { /* bla bla bla */ }
public function post($articleId=null) { /* bla bla bla */ }
public function get($articleId) { /* bla bla bla */ }
}
$r = new Respect\Rest\Router;
//bind entire class
$r->resource('/articles/*', 'MyArticle', $db);
@ppadron
Copy link

ppadron commented Apr 12, 2011

A idéia de fazer o bind de uma classe inteira é ótima! A intenção é que o framework seja 100% REST? Ou pretende deixar o usuário mapear uma parte da URL p/ o método da classe também? (esquema ZF)

@alganet
Copy link
Author

alganet commented Apr 12, 2011

A idéia é algo 100% REST mesmo! Usando esse conceito, a maioria dos CRUDs completos seria composta de duas ou mais classes. Um blog simples seria descrito assim:

class MyBlog {
    public function post(); //novo artigo
    public function get(); //listar artigos
}
class MyArticle {
    public function get($id); //exibir artigo e comentários
    public function delete($id); //excluir artigo
    public function put($id); //atualizar artigo
    public function post($id); //novo comentário no artigo
}
class MyComment {
    public function delete($postId, $commentId); //excluir comentário
    public function put($postId, $commentId); //atualizar comentário
}
$r->resource('/articles/', 'MyBlog');
$r->resource('/articles/*', 'MyArticle');
$r->resource('/articles/*/comments/*', 'MyComment');

Ao contrário dos controllers normais, REST é naturalmente hierárquico. Então algumas ações acabam se deslocando pra um pai ou filho do controller em questão, como acontece aí acima.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment