codeandcode/start

安装: 40

依赖: 0

建议者: 0

安全: 0

星标: 3

关注者: 3

分支: 1

开放问题: 1

语言:CSS

类型:项目

2.0.1 2017-11-14 16:07 UTC

This package is not auto-updated.

Last update: 2024-09-18 20:35:57 UTC


README

alt text

开始您的WEB编程之旅,使用PHP + MVC。

介绍

Start是一个微框架,用于构建Web应用程序。我们相信开发应该是一种愉快且高效的体验。Start试图简化新手开发者的生活,提供了以下资源

Banco de dados ORM expressivo e intuitivo 
Vários back-ends para armazenamento de sessão e cache
Motor de renderização simples e rápido
Sistemas de autenticação
Sistemas de rotas
Envio de email
Sistema de upload

Site: http://start.codeandcode.com.br/

安装

1 - 项目依赖

php 5.5+
composer
mysql

安装

2 - 项目安装

要安装项目依赖,请执行以下命令

composer create codeandcode/start

ou

git clone https://github.com/code-and-code/start.git
cd start
composer install 

importe o arquivo SQL start_DB.sql

3 - 初始化项目

要启动应用程序,请遵循以下说明

php -S servidor:porta -t ./pasta_de_inicialização

示例

php -S 127.0.0.1:8080 -t ./public

数据库:与数据库通信的配置位于 [App/config/app]

'database' => [            
   'host'     => '127.0.0.1',
   'dbname'   => 'hotspot',
   'username' => 'root',
   'password' =>  ''
  ],

4 - 模型

要构建一个模型,创建一个扩展Cac\Model\Model中类的新类,位于:Cac\Model\Model;

必须引用模型将与之通信的表。

可以使用方法创建关系方法

hasMany(Class) -> um pra muitos
hasOne(Class) -> um pra um
belongsTo(Class) ou  belongsTo(Class, 'coluna_externa', 'coluna_interna') -> um pra um invertido.

查询方法;

all() -> busca todos registros da tabela
find($id) -> busca determinado registro através do ID
where($name,$operator,$value) -> clausula de comparação
andWhere($name,$operator,$value) -> clausula de comparação com oprador AND
orWhere($name,$operator,$value) -> clausula de comparação com operador OR
create(array $attributes) -> cria registro com os atributos passados por parametro 
update(array $attributes) -> atualiza o registro com os atributos passados por parametro
delete() -> deleta registro
fill(array $attributes) -> preenche os atributos do objeto
toArray() -> transforma um objeto em Array
getAttributes() -> captura quais atributos aquele objeto possui
get() -> Lista o resultado da consulta
first() -> trás o primeiro registro da tabela 

创建和更新控制

Para ter abilitar esse controle, só é preciso que a tabela tenha as seguintes colunas:

created_at -> do tipo dateTime, not null
updated_at -> do tipo dateTime, not null

示例 - 模型

<?php
namespace App\Models;

use Cac\Model\Model;

class User extends Model
{
    protected $table = "users";
}

示例 - 关系

Tabelas
users
    id - integer
    email - string
    profile_id - integer
    
profile
    id - integer
    name - string

friends
    id - integer
    user_id - integer
    friend_id - integer

**Models**

<?php
namespace App\Models;
use Cac\Model\Model;

class User extends Model {

   protected $table      = “users”;

   public function Profile()
   {
       return $this->hasOne(Profile::class);
   }

   public function Friends()
   {
       return $this->hasMany(Friend::class);
   }

}

class Profile extends Model {

   protected $table      = “profiles”;

   public function User()
   {
       return $this->belongsTo(User::class);
   }
}

class Friend extends Model {

   protected $table      = “friends”;

   public function User()
   {
       return $this->belongsTo(User::class,‘id’,‘user_id’);
   }

   public function Friend()
   {
       return $this->belongsTo(User::class,‘id’,‘friend_id’);
   }
}    

5 - 路由系统

一个Application Service Provider将提供路由系统。

位于目录 [App\Providers\StartProvider.php]

Na classe StartProvider é possível mapear as rotas separadamente, sendo que o método boot() deve executar as rotas. 

Exemplo:

class StartProvider extends  ServiceProvider
{
    protected $namespace  = 'App\Controllers';

    public function boot()
    {
        $this->mapRoutes();
        $this->userRoutes();
    }

    public function mapRoutes()
    {
        //pode passar as rotas no metodo
        Router::get(['route' => '/',        'namespace' => $this->namespace,'controller' => 'HomeController','action' => 'index']);
        
        //pode passar parametros na rota 
        Router::get(['route' => '/$var',    'namespace' => $this->namespace,'controller' => 'HomeController','action'=>'index']);
    }

    /*
     * exemplo por arqui externo
     */
    public function userRoutes()
    {
        //pode criar um arquivo com as rotas separadamente e incluir esse arquivo no método
        include __DIR__.'/../routes/user.php';
    }
}

6 - 控制器

要构建一个控制器,创建一个扩展Cac\Controller\Action中类的新类,位于:Cac\Controller\Action;

<?php
namespace App\Controllers;

use App\Models\User;
use Cac\Controller\Action;

class UserController extends Action
{
    public function index()
    {
        ** Codigo **
    }
}

7 - 视图

要通过控制器调用视图,使用方法 "$this->render('view_path', ['变量或对象'])",使用 "echo" 打印到屏幕。

public function index()
{
    echo $this->render('user.index', ['user' => $this->user->all()]);
}

构建视图文件

[nome_da_view.html.twig]

助手

auth() -> retorna usuário logado
guest() -> verifica se o usuário esta logado
view() -> retorna view
include() -> inclue uma view
extends -> extende uma view
block -> sessão reservada no HTML
display() -> dispara o alerta na tela
assets() -> busca arquivos no diretorio [public/assets]

Mais informações https://github.com/twigphp/Twig

要使用逻辑,请使用解释标记

{%  %}

Exemplos Condicionais: 

   {% if guest() == true %}

      {{ include( view(‘auth._infologin’) ) }}

   {% else %}

       <li><a href=“/auth”>Entrar</a></li>

   {% endif %}
        
Exemplo Repetição

     {% for user in users %}

        <tr>
            <td>{{ user.id }} </td>
            <td>{{ user.email }}</td>
        </tr>

     {% endfor %}

要在视图中显示变量,请使用解释标记

{{ }}

要配置视图,请访问目录 [App\config\mail.php]。

'layout' =>  [         'folder'     => '../App/views/',
                       'tag'       => ['{','}'],
                       'extension' => '.html.twig',
                       'cache'     => 'storage/compilation_cache'
                    ],

8 - 发送电子邮件

要发送电子邮件,请使用位于:App\Support\Mail的Mail类。new Mail('要发送的地址', HTML(渲染),或消息,'邮件标题', html(true, false));

<?php
    namespace App\Controllers;

    use Cac\Support\Mail;
    use App\Models\User;
    use Cac\Controller\Action;

    class UserController extends Action
    {
        public function sendEmail()
        {
             new Mail(['email@dominio.com.br' => 'Nome'], "Menssagem", 'Assunto', false);
        }
    }

如何使用HTML消息发送电子邮件。

使用方法 render('view_path', [对象]) 构建HTML。

 <?php
    namespace App\Controllers;

    use Cac\Support\Mail;
    use App\Models\User;
    use Cac\Controller\Action;

    class UserController extends Action
    {
        public function sendEmail()
        {
            $html  = $this->render('site.email.answer');
            new Mail(['email@dominio.com.br' => 'Nome'], $html, 'Assunto', true);
        }
    }

要配置电子邮件发送,请访问目录 [App\config\mail.php] 并输入您的电子邮件配置。

<?php
return [
            'default' =>    [  'Host' => 'webmail.dominio.com.br',
                               'Port' => 587,
                               'SMTPSecure' => 'tls',
                               'SMTPAuth' => true,
                               'SMTPDebug'=> false,
                               'Username' => 'email_de_desparo@dominio.com.br',
                               'Password' => '******'
            ]
];

9 - 上传

要上传文件,请使用Cac\Support\File类创建一个对象,将文件和要创建的目录(将在[public]文件夹中自动创建)作为参数传递,并指定文件名。使用以下方法

mimeType(array) -> para informar o tipo do arquivo
maxSize() ->  para informar o tamanho máximo que o arquivo deve ter
upload() -> realizar upload

示例

 <?php

namespace App\Controllers;

use App\Models\User;
use Cac\Controller\Action;

class UserController extends Action
{
    public function upload()
    {
        $file  = new File($_FILES['file'],images);
        $nameFile   = md5(date('H:m:s:')); 
        $file->setName($nameFile)->mimeType(['image/png','image/jpeg', 'image/jpg'])->maxSize('3MB')->upload();        
    }
}

要配置上传目录,请访问目录 [App\config\mail.php]。

'file'  => [
                'folder' => 'images'
            ]

10 - 缓存

可以使用以下方法使用缓存系统

<?php

namespace App\Controllers;

use App\Models\User;
use Cac\Controller\Action;

class UserController extends Action
{
    public function getCache()
    {
        Cache::get(‘key’); -> caputa o cache com determinado indice             
    }
    
    
    public function setCache()
    {
        Cache::set(‘key’,‘value’); -> cria um cache passando o Indice e seu valor
    }
    
    
    public function deleteCache()
    {
        Cache::delete(‘key’); -> deleta o cache com determinado indice
    }
}

要配置缓存系统,请访问目录 [App\config\app.php]。

'cache'  => [ 
                'active' => true,
                'folder' => 'storage/cache',
            ]

11 - 助手

该系统包括许多全局“helper”PHP函数。其中许多函数被框架自身使用。

config() -> retorina o arquivo de configuração no arquivo passado por parametro. 
    
    Ex: config('app.database.username')
    
auth() -> retorna o objeto do usuário logado.

    Ex: if(auth())
        {
            echo auth()->email;
        }else
        {
            echo 'NÃO LOGADO';
        }
    
guest() -> verifica se está logado ou não

    Ex: if(guest())
        {
            echo 'LOGADO';
        }else
        {
            echo 'NÃO LOGADO';
        }
        
arrayToObject() -> converte array para objeto

    Ex:  $array = ['email' => 'teste@teste.com'];
         $obj = arrayToObject($array);
         echo $obj->email;
         
 objectToArray() -> converte objeto para array

    Ex:  $obj = new Class();
         $obj->email = 'teste@teste.com';
         $array = objectToArray($obj);
         echo $array['email'];
        
 assets() -> Carrega arquivos disponíveis no diretório [Public/assets]. Geralmente usado na view.
    
    Ex: <link rel="stylesheet" href="{{ assets('home/css/main.css') }}"/>
    
    A configuração para URL raiz '/' fica no diretório [App/config/app], quando for para produção deve trocar o valor da posição 'url' para novo dominio.
    
    'url'      => 'http://127.0.0.1:8080'
    
 dd() -> Mostra informações sobre o objeto ou variável, substitui a função nativa do php "var_dump"
 
    Ex: dd($obj);

12 - 应用程序服务提供者

可以创建提供者以推广服务和配置。为此,只需创建一个扩展ServiceProvider类的类,如下面的示例所示。但是,必须存在公共方法

boot()
mapRoutes()

Exemplo:

<?php
namespace App\Providers;
use Cac\Provider\ServiceProvider;

class StartProvider extends  ServiceProvider
{
    protected $namespace  = 'App\Controllers';

    public function boot()
    {
        $this->mapRoutes();
        $this->userRoutes();
    }

    public function mapRoutes()
    {
        ** Código ** 
    }
}

13 - Flash消息

要向用户发送通知(警报),请使用"back()"或"alert()"函数,并传递消息及其类型作为参数。该函数将返回前一个页面,并显示消息。

消息类型:错误、成功、警告、信息

Exemplo :

public function umMetodoNaController()
{
    try{
        **realiza uma operação**
        return back('Operação realizada com sucesso!!! :) ', 'success');
        
    }catch (\Exception $e){
        return back($e->getMessage(), 'error');
    }
}

在主视图(View principal)中,放置以下代码,使其能够监听消息

 {% if hasMessages() == true %}
    {{ display() }}
{% endif %}

14 - 验证

对于需要更复杂验证的类属性,并且这些属性是必须的,需要在模型(model)中添加更多属性。

public    $requested  = [];

变量 $request 接收一个数组,其中包含类中必须的属性。

Exemplo : 
<?php
namespace App\Models;
use Cac\Model\Model;

class User extends Model {

protected $table      = "users";
public    $requested  = ['nome', 'email'];

}

或者调用方法,传入要检查的字段名称,用于特定请求。

Exemplo:

Validation::requiredBasic(['nome','email'], $_REQUEST);