PHP code example of atomdev / odinfmk

1. Go to this page and download the library: Download atomdev/odinfmk library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

atomdev / odinfmk example snippets


    define("ODIN_SERIAL", "SUA_SERIAL");
    define("ODIN_ROOT", "/diretorio/raiz/do/projeto");

    
    //Incluindo o autoload do Composer
    rk
	use Odin\utils\Config;
	use Odin\routes\Routes;
	
	Config::init("projeto"); //nome da pasta do seu projeto
	Routes::init();

	//Rota GET
	Routes::get("/", function(){
	    echo "Primeiro projeto com a Ødin Framework!";
	})->name("home");
	//Rota POST
	Routes::post("/", "Projeto\http\controllers\Classe:metodo");
	//Rota PUT
	Routes::put("/", "Projeto\http\controllers\Classe:metodo");
	//Rota DELETE
	Routes::delete("/", "Projeto\http\controllers\Classe:metodo");

	//Definindo um grupo de rotas
	$instance = Routes::getInstance();
	Routes::group("/grupo", function() use ($instance){
	    Routes::get("/", "Projeto\http\controller\sClasse:metodo");
	});
	
	Routes::run();

    Routes::get("/teste", function(){
        echo "Olá, Mundo!";
    })

    namespace App\http\controllers; //O namespace master é o de sua preferencia
    
    use Odin\http\controller\Controller;

    class Teste extends Controller
    {
        public function olaMundo()
        {
            echo "Olá, Mundo";
        }
    }
### Recuperando valores em rotas dinâmicas no Controller
A Ødin também suporta rotas dinâmicas, ou seja, rotas que contém valores variáveis na estrutura, como no exemplo a seguir.

    Routes::get("/filme/:categoria", "App\http\controllers\Filmes:listarPelaCategoria");
Para definir uma parte dinâmica em uma rota você deve utilizar `/:nomeDaVariavel`.
Alguns exemplos de requisição para este tipo de rota seriam:

    GET http://localhost/projeto/filme/terror
    GET http://localhost/projeto/filme/acao
    GET http://localhost/projeto/filme/romance
    
Para recuperar esse valor passado na rota e utilizá-lo em sua aplicação basta adicionar um parâmetro ao método do Controller.

    class Filmes extends Controller
        {
            public function listarPelaCategoria($categoria)
            {
                echo $categoria;
            }
        }
Você também pode definir um padrão a ser passado às variáveis através de um regex, como no exemplo abaixo.

    Routes::get("/filme/:id", "App\http\controllers\Filmes:selecionarPeloId", ["id" => "[\d]{1,8}"]);

O regex irá forçar a valor a seguir o padrão, caso contrário, um erro será lançado.

### Redirecionamento de Rotas

Você também pode fazer redirecionamento utilizando a nomenclatura de rotas. Como no exemplo a seguir.

    Routes::get("/login", "App\http\controllers\Login:view")->name("loginPage");

Para fazer o redirecionamento basta usar a propriedade `router` no contexto.

    $this->router->redirectTo("loginPage");

### Utilizando Views
Como qualquer aplicação MVC, você poderá usar suas views para renderizar elementos visuais, como formulários, listas, etc.
Na Ødin, as views são renderizadas a partir do Controller, mais especificamente dentro do método acionado ao acessar a rota.

    Config::init("projeto");
    Routes::init();
    
    Routes::get("/login", "App\http\controllers\Login:view");

O Controller buscará pelas Views na pasta `projeto/source/views`.

Para renderizar a view, basta seguir o modelo a baixo.

    use Odin\view\View;
    
    class Login extends Controller
    {
        use View;
    
        public function view()
        {
            View::render($this, "login_page.php");
        }
     }


### Parâmetros de `View::render()`

A tabela abaixo mostra os parâmetros que podem ser passado para o método render. Os parâmetros cujo Valor Padrão está vazio significa que deve conter um valor obrigatório.

|NOME|TIPO|VALOR PADRÃO|DESCRIÇÃO|
|----|----|-----|---------|
|`$controller`|`IController`||Instância do Controller|
|`$page`      |`string`||Nome do arquivo a carregar|
|`$params`    |`array`|`[]`|Valores a serem passados para a View|
|`$hf`        |`bool`|`true`|Informa se a View deve ou não renderizar o arquivo de Cabeçalho e Rodapé definidos como padrão|

### Definindo Cabeçalho e Rodapé padrão

Você pode definir um arquivo como header e outro como footer para armazenar informações de contexto global, esses arquivos devem estar na pasta `views`. Como por exemplo o `<head>` e todas as chamadas de CSS de uma página HTML ou `<script>` no final da página. Como mostra o exemplo a seguir.

> `views/header.php`

    <!DOCTYPE html>
    <html>
        <head>
            <title>Projeto</title>
            <meta charset="utf-8"/>
            <link rel="stylesheet" type="text/css" href="./css/bootstrap.css"/>
            <link rel="stylesheet" type="text/css" href="./css/style.css"/>
        </head>
        <body>

  

> `views/footer.php`

            <script src="./js/jquery.js"></script>
            <script src="./js/bootstrap.js"></script>
        </body>
    </html>

> `index.php`

    Config::init("projeto");
    Routes::init();
    
    Routes::setHF("header.php", "footer.php");
    
    Routes::get("/login", "App\http\controllers\Login:view");

Caso você tenha alguma página que deve carregar um header e um footer específico, você poderá bloquear o carregamento dos arquivos padrão no Controller, como no exemplo abaixo.

    public function view()
    {
        View::render($this, "login_page.php", [], false);
    }

### Passando valores do Controller para a View

Você pode compartilhar dados do Controller para a suas Views, por exemplo, os dados parar fazer uma listagem de filmes.

    public function listarFilmes()
    {
        View::render($this, "listar_filmes.php", [
	        "itens" => ["Filme 1", "Filme 2", "Filme 3"]
	    ]);
    }
   
Na sua view:

    <div class="container">
        <table class="table table-hover">
	        <thead>
	            <tr>
	                <th>Chave</th>
	                <th>Filme</th>
	            </tr>
	        </thead>
	        <tbody>
	            
	                foreach($itens as $i => $item)
	                {
		                echo "<tr>";
		                echo "<td>{$i}</td>";
		                echo "<td>{$item}</td>";
		                echo "</tr>";
	                }