codeandcode / start
Requires
- php: >=5.5
- codeandcode/auth-start: 1.*
- codeandcode/micro-fwk: dev-master
- codeandcode/simplebase-start: 1.*
This package is not auto-updated.
Last update: 2024-09-18 20:35:57 UTC
README
开始您的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);