craft-group / phpframework
此包的最新版本(dev-master)没有可用的许可证信息。
另一个PHP框架
dev-master
2019-09-27 08:48 UTC
Requires
- php: >=7.0
- ext-json: *
- ext-pdo: *
Requires (Dev)
- phpmd/phpmd: ~2
- phpunit/phpunit: ~5
- smarty/smarty: ^3.1
- squizlabs/php_codesniffer: ^2
- swiftmailer/swiftmailer: ^5.4
- twig/twig: ~1.0
This package is auto-updated.
Last update: 2024-08-27 20:54:11 UTC
README
自行组装的自行车,用于快速创建Web应用程序。PHP >= 5.4
项目结构和配置
app
config
app.php
env.php
controllers
models
views
public
css
im
js
.htaccess
index.php
.htaccess
AddDefaultCharset UTF-8
Options +FollowSymLinks +ExecCGI
php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting 2047
php_flag magic_quotes_gpc off
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
index.php
<?php
require '../vendor/autoload.php';
new \framework\App();
配置设置存储在config
文件夹中。env.php
包含特定环境的设置(如数据库设置等),app.php
包含应用程序的通用设置。
每个配置文件都必须返回一个设置数组。例如
<?php
return [
'db' => [
'dsn' => 'mysql:dbname=dbname;host=localhost;charset=utf8',
'username' => 'root',
'password' => 'password'
]
];
路由
为此,在配置文件app.php
中描述规则。例如
<?php
return [
'routes' => [
['^/$', 'HomeController'],
['^/profile', 'ProfileController']
]
];
在第二种情况下,所有以/profile
开头的请求都会转发到控制器。额外的路由可以在控制器ProfileController
内部完成。
控制器
框架中有一个基本类Controller
,具有抽象方法abstract public function handle();
。控制器类的名称应以Controller
结尾。
<?php
class HomeController extends Controller
{
public function handle()
{
$this->request->set('user', 'Вася Пупкин');
return 'profile.php'; // для PHP представлений
return 'profile.tpl'; // для Smarty представлений
return array('profile.tpl', 'user', 'Вася Пупкин'); // для передачи в представление одной переменной
return array('profile.tpl', array(
'user' => 'Вася Пупкин',
'city' => 'Дефолт сити'
)); // для передачи в представление массива переменных
return 'redirect:/success'; // для редиректа на другой URL
}
}
还有一个在RouterController
内部具有额外路由的控制器,具有抽象方法abstract protected function getRoutes();
。路由规则设置类似于app.php
中的规则,只是将控制器名称替换为方法名称。
class ProfileController extends RouterController
{
protected function getRoutes()
{
return array(
array('^/profile', 'index'),
array('^/profile/(\d+)$', 'details')
);
}
public function index()
{
return array('profile/index.tpl', ProfileModel::getAll());
}
public function details($id)
{
return array('profile/details.tpl', ProfileModel::get($id));
}
}
模型和数据库操作
模型类的名称应以Model
结尾。对于数据库操作,有一个名为Db
的类,具有以下方法
public static function query($sql, $values = null);
public static function getValue($sql, $values = null);
public static function getRow($sql, $values = null);
public static function getRows($sql, $values = null);
public static function getPairs($sql, $values = null, $keyColumn = 'id', $valueColumn = 'name');
public static function update($sql, $values = null);
public static function insert($sql, $values = null);
public static function begin();
public static function commit();
public static function rollback();
public static function getLogs();
除了getPairs
之外的所有方法都可以以下形式调用
<?php
$user = Db::getRow('SELECT * FROM user WHERE id = ?', 5);
$users = Db::getRows('SELECT * FROM user WHERE age BETWEEN ? AND ?', array(21, 35));
или
$users = Db::getRows('SELECT * FROM user WHERE age BETWEEN ? AND ?', 21, 35);
или
$users = Db::getRows('SELECT * FROM user WHERE age BETWEEN :from AND :to', array('from' => 21, 'to' => 35));
对于简单的表查询,有一个名为Entity
的类,具有以下方法
public static function getRow($table, $id);
public static function getRows($table, $where = null, $order = null, $from = null, $count = null);
public static function save($table, $data, $idColumn = 'id');
public static function delete($table, $id);
使用示例
$user = Entity::getRow('user', 5); // равносильно $user = Db::getRow('SELECT * FROM user WHERE id = ?', 5);
$id = Entity::save('user', array('first_name' => 'Вася', 'last_name' => 'Пупкин'));
// равносильно
$id = Db::insert('INSERT user SET first_name = :first_name, last_name = :last_name', array('first_name' => 'Вася', 'last_name' => 'Пупкин'));
如果将id值传递给save方法,则会更新记录。
表单和验证
对于表单验证以及任何其他关联数组,有一个名为Validator
的类。使用示例
<?php
if ($this->request->getMethod() == 'POST') {
$validator = new Validator();
$validator->add('username')->required('Please, enter value');
$validator->add('password')->required('Please, enter value');
if ($validator->validate()) {
$data = $validator->getData(); // отвалидированные данные
} else {
$this->request->set('errors', $validator->getErrors()); // передача ошибок в отображение
}
}