nagara / prosedural-php
PROSEDURAL PHP 项目
Requires
- bramus/router: ~1.5
- symfony/var-dumper: ^5.3
- vlucas/phpdotenv: ^5.3
README
背景
本项目旨在为PHP原生mini MVC项目提供替代方案,mini MVC项目采用面向对象编程概念编写,并使用PDO(PHP数据对象)进行数据库连接。而prosedural php项目则采用过程式编程概念编写,并使用mysqli和对象进行数据库连接。其文件夹结构采用功能性的MVC模式。
对于新手
我在这个仓库中创建了我的文档学习。我不在乎你说了什么。如果你不喜欢或不认同我的编程概念,我无所谓,兄弟哈哈哈。如果这个仓库不能解决你的问题,那就意味着你的问题和我不同。请查看README.md中的描述,检查readme.md。你的问题一致吗?请readme
作者及贡献者
- Naagaraa Darma Persada大学生及内容创作者
- YouTube频道
文档
- 官方文档正在制作中
如何使用/安装
要求
- PHP版本 >= 7.3.2
- 安装git客户端或cli
- 安装php xdebug(可选)
- 安装composer
使用git cli安装
-
安装 phpxdebug(可选:使错误调试信息更清晰)
-
克隆我的repository mini dfv php native
git clone https://github.com/naagaraa/prosedural-php.git
-
composer install
prosedural-php > composer install
使用composer安装
-
安装 phpxdebug(可选:使错误调试信息更清晰)
-
在Xampp/Laragon的htdocs目录或public目录下打开终端
PS C:\xampp\htdocs>
-
安装项目
** PS C:\xampp\htdocs> composer create-project nagara/prosedural-php namaproject**
PS C:\xampp\htdocs> composer create-project nagara/prosedural-php applikasi-saya
结构/架构
以下是我使用的文件夹结构风格
- #apps
- #config
- #controller
- #model
- #view
- #htaccess
- #init.php
- *#database
- #error_vew.php
- #function_error.php
- #public
- #css
- #js
- #image
- #routes
- #function
- #getonvfile
- #index
- #routing
- #storage
- #doc
- #img
- #.env
- #.env.example
- #.htaccess
- #index.php
简要说明
apps
文件夹apps是用于设计小型web项目的位置,或者从dcontroller、model和view开始进行设置。
config
文件夹config用于配置数据库mysqli,创建常量,并运行配置以调用数据库连接功能。
database
文件夹database是一个mysqli语法速查表。
controller
文件夹controller是过程式功能性编程的形式。
routes
文件夹routes用于配置apps中的路径或路由。
view
文件夹view是涉及HTML或模板的地方,这些模板将在用户页面上显示。
.htaccess
htaccess在此处设置,以防止打开核心文件夹即apps。
autoload.php
autoload用于调用config文件夹中的加载文件,首先require数据库。
init.php
用于调用apps文件夹中的config文件。
public
文件夹public用于放置资产,如css、js和图片。
storage
文件夹storage是用于保存上传文件的存储位置。
.htaccess
默认访问移除index.php以在首次打开或首次打开时显示
index.php
用于调用autoload.php文件
基本用法
连接数据库
数据库配置位于文件 .env 中
DB_HOST=localhost
DB_PORT=3306
DB_NAME=namadatabasenya
DB_USER=userdatabasenya
DB_PASS=
设置 URL 路径和应用程序
为了设置配置路径 URL 和应用程序,也存在于文件 .env 中
# configurasi Path here
APP_NAME=prosedural-php-native
APP_FOLDER=/prosedural-php-native/
APP_HOST=https:///
APP_URL=https:///prosedural-php-native/
routes
定义路由方向
# example : # $router->get('pattern', function() { # view("nama_view"); # }); $router->get('/', function() { view("welcome"); }); $router->get('login', function() { view("auth/login"); });
controller
在 apps > controller 文件夹中创建控制器名称,然后在该文件中创建函数
# example function title() { $title = 'home page'; return $title; } /** * mencetak nilai string deskripsi * @return string */ function deskripsi() { $deskripsi = "halaman home page"; }
模型
创建模型以与数据库查询交互
# example model function get_all_data() { # call connection ke database $conn = database(); # query sintax pada database $sql = "SELECT * FROM users"; # myqli execute $result = $conn->query($sql); #return data return $result->fetch_all(MYSQLI_ASSOC); } /** * docuemntations return singe data * @return object */ function get_single_data_by_condition($id) { # call connection ke database $conn = database(); # query sintax pada database $sql = "SELECT * FROM users WHERE id=$id "; # myqli execute $result = $conn->query($sql); #return data return $result->fetch_object(); }
调用数据库连接
为了调用数据库连接,只需调用 function database() 并将其保存到变量中,调用连接将在交互查询和模型时需要。
# call connection ke database $conn = database();
在控制器中调用模型
要在控制器中调用模型,可以通过使用 function model("模型名") 加载模型文件来实现
# example controller user function getDataUser() { # load model di pada function model("userModel); # panggil function yang ada pada model $data = get_all_data(); # mengembalikan nilai return $data; }
在视图中调用控制器
为了调用控制器并使用已声明的所有函数,可以在视图文件的最开始调用 controller("控制器名")
<?php # example #load controller controller("loginController") # next html code ?> <!DOCTYPE html> <html lang="en"> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <head> some code html here ... </html>
调用其他视图
要调用其他视图,可以使用 function view("视图名")
# example <?php view("header") ?> <p>some html code</p> ... <?php view("footer")?>
调用资源
要调用 public 文件夹中的资源,请使用 function asset("资源名"),资源可以是 CSS、JS 文件或图像,通常在视图文件中调用。
# example <link rel="stylesheet" type="text/css" href="<?= asset("vendor/bootstrap/css/bootstrap.min.css") ?>">
调用 URL 路径
要调用 URL 路径,可以使用 function url("URL 名"),通常用于页面间导航,例如 http://domain/home,或 http://domain/about 等,其中 URL 路径已预先在路由中注册。
# example <ul type="none" class="navbar-nav"> <li class="nav-item"><a href="<?= url("login") ?>">Login page</a></li> <li class="nav-item"><a href="<?= url("register") ?>">Login page</a></li> <li class="nav-item"><a href="<?= url("about") ?>">Login page</a></li> <li class="nav-item"><a href="<?= url("home") ?>">Login page</a></li> </ul>
调用时区函数
要调用时区函数,请打开 apps > config > timezone.php 文件,那里有一些我已创建的用于时间的函数
设置时区
date_default_timezone_set('Asia/Jakarta');
调用年份
year_now() // return tahun 2021
调试
以下是一些调试选项:
- dd(valuenya);
- dump(valuenya);
- var_dump(valuenya);
- var_dump(valuenya);die;
URL 路由参数
如果接受 URL 上的 slug 或参数(一个参数)
$router->get('data/{id}', function($id) { view("backend/penduduk", $id); });
然后在视图文件中
# example <?php # load controllernya controller("pendudukController"); $parameter = $data; dump($parameter[1]); // return id ?> <!DOCTYPE html> <html lang="en"> ...
如果接受 URL 上的 slug 或参数(多个参数)
$router->get('data/{id}/{username}', function($id, $username) { view("backend/penduduk", [$id, $username]); });
然后在视图文件中
# example <?php # load controllernya controller("pendudukController"); $parameter = $data; dump($parameter[0]); // return id dump($parameter[1]); // return username ?> <!DOCTYPE html> <html lang="en"> ...
将 slug 传递给控制器
为了传递到控制器,在控制器文件中创建一个函数并传递参数,例如
web.php 路由文件
$router->get('data/{id}/{username}', function($id, $username) { view("backend/penduduk", [$id, $username]); });
penduduk.php 视图文件
# example <?php # load controllernya controller("pendudukController"); $parameter = $data; dump($parameter[0]); // return debug id dump($parameter[1]); // return debug username #call function yang ada di dalam controllernya getuserid($parameter[0]); // return id ?> <!DOCTYPE html> <html lang="en"> ...
penduduk.php 控制器文件
<?php function getuserid($id) { echo $id; // return id } ?>
将参数传递给模型
为了传递到模型文件,与控制器相同,加载模型然后通过控制器中存在的函数将其传递给模型函数
web.php 路由文件
$router->get('data/{id}/{username}', function($id, $username) { view("backend/penduduk", [$id, $username]); });
penduduk.php 视图文件
# example <?php # load controllernya controller("pendudukController"); $parameter = $data; dump($parameter[0]); // return debug id dump($parameter[1]); // return debug username #call function yang ada di dalam controllernya getuserid($parameter[0]); // return id ?> <!DOCTYPE html> <html lang="en"> ...
penduduk.php 控制器文件
<?php function getuserid($id) { model("pendudukModel"); return get_user_data_by($id) } ?>
penduduk.php 模型控制器文件
/** * docuemntations return singe data * @return object */ function get_user_data_by($id) { $conn = database(); // sintac query $sql = "SELECT * FROM users WHERE id=$id "; $result = $conn->query($sql); return $result->fetch_object(); // return object }
创建模板或拆分模板
为了拆分 HTML 部分为多个部分,如 header、footer 和 content,这被称为模板化,为了创建模板,可以调用 function view
示例
view
- 认证
- 布局
- header.php
- footer.php
- 页面
- login.php
- 布局
在放置视图文件之前,在视图文件开头加载控制器
<?php # load controllernya controller("loginController"); ?> <!-- # load template header --> <?= view("auth/layout/header")?> # content here ...
login.php 文件
<!-- # load template header --> <?= view("auth/layout/header")?> <div class="limiter"> <div class="container-login100"> # content here ... </div> </div> <!-- # load template footer --> <?= view("auth/layout/footer")?>
header.php 文件
<!DOCTYPE html> <html lang="en"> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <head> <title><?= title() ?></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!--===============================================================================================--> <link rel="icon" type="image/png" href="images/icons/favicon.ico"/> <!--===============================================================================================--> <link rel="stylesheet" type="text/css" href="<?= asset("vendor/bootstrap/css/bootstrap.min.css") ?>"> <!--===============================================================================================--> <link rel="stylesheet" type="text/css" href="<?= asset("fonts/font-awesome-4.7.0/css/font-awesome.min.css") ?>"> <!--===============================================================================================--> <link rel="stylesheet" type="text/css" href="<?= asset("fonts/Linearicons-Free-v1.0.0/icon-font.min.css") ?>"> <!--===============================================================================================--> <link rel="stylesheet" type="text/css" href="<?= asset("vendor/animate/animate.css") ?>"> <!--===============================================================================================--> <link rel="stylesheet" type="text/css" href="<?= asset("vendor/css-hamburgers/hamburgers.min.css") ?>"> <!--===============================================================================================--> <link rel="stylesheet" type="text/css" href="<?= asset("vendor/animsition/css/animsition.min.css") ?>"> <!--===============================================================================================--> <link rel="stylesheet" type="text/css" href="<?= asset("vendor/select2/select2.min.css") ?>"> <!--===============================================================================================--> <link rel="stylesheet" type="text/css" href="<?= asset("vendor/daterangepicker/daterangepicker.css") ?>"> <!--===============================================================================================--> <link rel="stylesheet" type="text/css" href="<?= asset("css/util.css") ?>"> <link rel="stylesheet" type="text/css" href="<?= asset("css/main.css") ?>"> <!--===============================================================================================--> </head> <body>
footer.php 文件
<!--===============================================================================================--> <script src="<?= asset("vendor/jquery/jquery-3.2.1.min.js") ?>"></script> <!--===============================================================================================--> <script src="<?= asset("vendor/animsition/js/animsition.min.js") ?>"></script> <!--===============================================================================================--> <script src="<?= asset("vendor/bootstrap/js/popper.js") ?>"></script> <script src="<?= asset("vendor/bootstrap/js/bootstrap.min.js") ?>"></script> <!--===============================================================================================--> <script src="<?= asset("vendor/select2/select2.min.js") ?>"></script> <!--===============================================================================================--> <script src="<?= asset("vendor/daterangepicker/moment.min.js") ?>"></script> <script src="<?= asset("vendor/daterangepicker/daterangepicker.js") ?>"></script> <!--===============================================================================================--> <script src="<?= asset("vendor/countdowntime/countdowntime.js") ?>"></script> <!--===============================================================================================--> <script src="<?= asset("js/main.js") ?>"></script> </body> </html>