bhaswanth53/ynotphp

YNOTPHP 框架版本 1.0

1.0 2020-11-10 10:11 UTC

This package is auto-updated.

Last update: 2024-09-22 23:00:11 UTC


README

YNOTPHP 是一个轻量级的 PHP 框架,旨在使开发者的生活更轻松。与 LaravelCodeigniter 等所有现代框架不同,它不包含任何会混淆开发者的核心。这意味着整个结构完全掌握在开发者手中。

服务器要求

YNOTPHP 框架具有以下一些要求。

  • PHP >= 5.6
  • Composer
  • MySql PHP 扩展
  • PDO PHP 扩展
  • Fileinfo PHP 扩展
  • XML PHP 扩展

入门

安装

您可以直接从以下 GitHub URL 下载框架:https://github.com/bhaswanth53/ynotphp

或者

如果您的系统上安装了 Git,您可以使用以下命令进行安装。

git clone https://github.com/bhaswanth53/ynotphp.git

一旦您下载了框架,首先您需要使用以下命令在您的命令行界面安装包。

composer install

安装包安装完成后,您需要使用以下命令生成您唯一的 APP_KEY。

./vendor/bin/generate-defuse-key

上述命令将生成如下哈希 APP_KEY。

def000009eaeb386dcee38dacd38e1eea8cb710d2944920e7138738f8297c8d284978bb2b3a79701e6202c0d6a5561eb50e87e914fcf345ad768594788fa387bbbd0ee74

您需要将您的应用密钥添加到您的 env.php 文件中,如下所示。

"APP_KEY" =>
"def000009eaeb386dcee38dacd38e1eea8cb710d2944920e7138738f8297c8d284978bb2b3a79701e6202c0d6a5561eb50e87e914fcf345ad768594788fa387bbbd0ee74"

如果您从根目录使用框架,您需要在 env.php 中设置 APP_PATH,如下所示。

"APP_PATH" => "",

或者如果您从任何子目录使用框架,您需要配置该子目录路径,如下所示。

"APP_PATH" => "/folder/subfolder",

完成这些操作后,您的安装将完成,您将被重定向到主页。

配置

公共目录

安装 YNOTPHP 后,您应该将您的 Web 服务器的文档 / Web 根目录配置为公共目录。此目录中的 index.php 作为所有进入您应用的 HTTP 请求的前端控制器。

环境变量

此框架中的所有环境变量都将配置在 env.php 文件中。

YNOTPHP 默认包含以下变量。

APP_NAME:这是您项目的名称。

"APP_NAME" => "YNOTPHP",

APP_PATH:这是应用路径。

"APP_PATH" => "/test/ynotphp",

APP_KEY:这是应用的唯一密钥,将在所有涉及安全的交易中使用。

"APP_KEY" =>
"def000009eaeb386dcee38dacd38e1eea8cb710d2944920e7138738f8297c8d284978bb2b3a79701e6202c0d6a5561eb50e87e914fcf345ad768594788fa387bbbd0ee74",

APP_DEBUG:这将调试您的应用并将错误记录到 logs 文件夹中。

"APP_DEBUG" => true,

注意:默认情况下它是开启的,但在生产模式下您可以将它设置为 false

APP_MODE:这是应用的模式。最初 YNOTPHP 支持以下 3 种模式。

  1. 开发
  2. 测试
  3. 生产

默认模式设置为 开发

"APP_MODE" => "development",
配置目录

配置目录包含 3 个不同的文件夹。

  1. 开发
  2. 测试
  3. 生产

每个文件夹包含 3 个不同的文件。

  1. db.php
  2. mail.php
  3. env.php

您可以在不同的模式下配置不同的数据库和邮件配置。

例如,如果您将 APP_MODE 设置为 测试,则将使用测试文件夹中的数据库和邮件配置。

路由

YNOTPHP中的所有路由都将配置在web.php中。YNOTPHP使用AltoRouter进行路由。因此,您可以利用其所有功能。但YNOTPHP采用了最新的MVC架构,并带有路由器,因此您可以直接从路由器定义控制器方法,如下所示。

// Method, URL, Controller, Name

$router->map('GET', '/', 'Controllers\\HomeController@home', 'home');

要定义动态路由和URL参数,您可以查看AltoRouter的文档。

控制器

您不必在路由文件中定义所有的请求处理逻辑,您可能希望使用控制器类来组织这种行为。控制器可以将相关的请求处理逻辑组织到一个类中。控制器存储在app/Controllers目录中。

定义控制器

下面是一个基本控制器类的示例。请注意,该控制器扩展了YNOTPHP中包含的基本控制器类。基本类提供了一些便利方法,这些方法可用于控制器操作

<?php
    namespace Controllers;

    class HomeController extends Controller
    {
        public function home()
        {
            // render view
            return $this->render("home");
        }
    }

您可以这样定义到该控制器操作的路径

$router->map('GET', '/', 'Controllers\\HomeController@home', 'home');

视图

视图包含您的应用程序提供的HTML,将控制器/应用程序逻辑与您的表示逻辑分离。视图存储在Views目录中。一个简单的视图可能看起来像这样

<html>
    <body>
        <h1>Hello, <?php echo $variable ?></h1>
</body>

</html>

视图将通过在控制器中定义的render方法进行渲染。

public function home()
{
return $this->render("home");
}

在上述代码中,将在Views目录中渲染home.php。如果视图在Views目录中的某个文件夹中,则可以像下面这样调用它。

public function home()
{
return $this->render("site.home");
}

然后它将查找Views/site/home.php

传递数据到视图

您可以从控制器将字符串和数组传递给视图,如下所示。

public function about()
{
$name = "YNOTPHP";
$study = "10";
$data = array('args' => $args, "name" => $name, "study" => $study);
return $this->render("about", compact('name', 'study', 'data'));
}

然后我们可以在视图中正常输出变量,如下所示。

<?php echo $name; ?>

更好的模板

您可以将视图文件包含在另一个文件中,就像Laravel blade模板一样。

<?php parseview('layouts.site.header'); ?>
// Reset of the view code

上述代码将在当前文件中包含Views/layouts/site/header.php

模型

模型是数据库表的表示。控制器将通过模型访问数据库。在YNOTPHP中,我们可以像下面这样定义模型。

<?php
    // Define the namespace
    namespace Models;
    // use the DB Facade
    use Facades\DB;

    class User extends Model
    {
        public function model_function() {
            // Add the query
        }
    }

模型使用PDO语句与数据库交互。

public function update_profile_by_email($uemail, $name, $mobile, $state, $district, $city)
{
    $db = DB::open();
    $sql = "UPDATE users SET name=?, mobile=?, state=?, district=?, city=? WHERE email=?";
    $query = $db->stmt_init();
    if($query = $db->prepare($sql))
    {
        $query->bind_param('ssssss', $name, $mobile, $state, $district, $city, $uemail);
        $query->execute();
        $query->close();
    }
    return true;
}
public function get_all()
{
    $data = array();
    $db = DB::open();
    $sql = "SELECT id, id_num, name, email, mobile, state, district, city, active, created_at FROM users ORDER BY id DESC";
    $query = $db->stmt_init();
    if($query = $db->prepare($sql))
    {
        $query->execute();
        $query->store_result();
        $query->bind_result($id, $id_num, $name, $email, $mobile, $state, $district, $city, $active, $created);
        $numrows = $query->num_rows;
        if($numrows > 0)
        {
            while($query->fetch())
            {
                $data[] = array(
                    "id" => $id,
                    "id_num" => $id_num,
                    "name" => $name,
                    "email" => $email,
                    "mobile" => $mobile,
                    "state" => $state,
                    "district" => $district,
                    "city" => $city,
                    "active" => $active,
                    "created_at" => $created
                );
            }
        }
        $query->close();
    }
    return $data;
}

我们可以在控制器中使用模型,如下所示。

use Models\User;

一旦模型包含在控制器中,我们就可以使用模型中的所有方法。

public function users()
{
    // get all the users as array
    $users = User::get_all();
    return $this->render('admin.users', compact('users'));
}

我们也可以在视图中通过直接调用模型来使用模型。

$users = Models\User::get_all()

外观

外观是为了优化典型功能所需的代码而开发的,就像Laravel一样。默认情况下,YNOTPHP附带6种类型的外观。那些是

  1. 邮件
  2. 请求
  3. 验证
  4. 加密
  5. 数据库
  6. 文件

让我们快速了解一下这些外观是用来做什么的。

邮件

邮件外观用于发送电子邮件。您可以在控制器中使用此外观发送电子邮件。要使用邮件外观,我们首先必须在控制器中调用它。

use Facades\Mail;

一旦外观被使用,我们就可以自由地使用它。首先,我们需要在配置目录中的当前模式下配置mail.php

如果您正在以开发模式使用应用程序,那么您需要在config/development/mail.php文件中配置邮件服务器。

return array(
    "MAIL_DRIVER" => "",
    "MAIL_HOST" => "",
    "MAIL_PORT" => "",
    "MAIL_USERNAME" => "",
    "MAIL_PASSWORD" => "",
    "MAIL_ENCRYPTION" => ""
);

一旦配置完成,我们就可以自由地发送电子邮件。

$mail = new Mail();
// We can add multiple senders using the method.
$mail->addSender("sender@gmail.com", "Sender Name");
$mail->addReceiver("receiver@gmail.com", "Receiver Name");
$mail->subject = "This is the subject";
// Body will look into mails folder inside views folder. The view file will execute is views/mails/view_name.php
$mail->body = "view_name";
// We can send arguments to the view file.
$mail->args = array(
    "url" => "This is a url parameter",
    "name" => "YNOTPHP"
);
try {
    $mail->send();
    return $this->back(); // It will return to the back page.
}
catch(Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

我们可以使用$args从邮件视图中接收动态参数。

<?php echo $args['url']; ?>
<?php echo $args['name']; ?>

请求

请求外观用于获取表单数据或URL参数。请求外观是在处理动态网站时使用的重要外观。

use Facades\Request;

请求外观将在如下所示的控制器中使用。

$request = new Request();
$token = $request->input("reset_token");
$password = $request->secure_input("password");
$confirm_password = $request->secure_input("confirm_password");

请求外观包含以下方法。

input()

此方法将用于在不使用任何过滤器的情况下正常获取表单数据。

$name = $request->input("input_name")
get()

此方法用于获取使用GET方法发送的数据或来自URL参数的数据。

$id = $request->get("id")
ajax()

此方法用于获取使用ajax POST请求发送的表单数据。

$name = $request->ajax("input_name")
secure_input()

此方法用于通过过滤恶意字符以安全模式获取表单数据。

$name = $request->secure_input("input_name")
secure_get()

此方法用于以安全模式获取URL参数中的数据。

$id = $request->secure_get("id")
secure_ajax()

此方法用于以安全模式获取ajax POST请求中的数据。

$name = $request->secure_ajax("input_name")
password_check()

此方法用于验证密码。它检查密码是否符合以下条件。

  1. 最小长度:10
  2. 最大长度:32
  3. 必须包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符。
if($request->password_check($password)) {
// Password is valid
} else {
// Not valid
}
hash()

此方法用于对密码等字符串进行哈希处理。

$hashed_password = $request->hash($password);
verify_hash()

此方法用于验证哈希字符串与普通字符串。

if($request->verify_hash($string, $hashed_string))
{
// hash verified
}
else {
// hash not verified
}
all()

此方法用于通过传递请求名称从请求中获取所有数据。

$get_data = $request->all("get") // Returns all data from get method.
$post_data = $request->all("post") // Returns all data from post method.
$ajax_data = $request->all("ajax") // Returns all data from ajax request.

验证

验证外观用于验证表单数据。您可以从控制器中使用外观。

use Facades\Validation;
$request = new Request();
$email = $request->secure_input("email");
$password = $request->secure_input("password");

// Create validation instance
$validation = new Validation();

// Check email required.
$validation->name("email")->value($email)->required();

// Check password required
$validation->name("password")->value($password)->required();

// Check validation result
if($validation->isSuccess()) {
// Validation is success
}
else{
// Validation fails
return $this->back();
}

YNOTPHP已采用来自davidecesarano/Validation库的验证插件。它提供灵活的功能和开发者友好的功能。请检查官方库存储库中的完整文档。

加密

加密外观用于加密和解密字符串。通常它将使用您唯一的APP_KEY进行加密和解密。

YNOTPHP已采用defuse/php-encryption库以获得更好的安全性。

我们可以在控制器中如下使用此外观。

use Facades\Crypt;

一旦包含,我们就可以开始加密和解密字符串。

public function encrypt() {
$string = "YNOTPHP";

// Encrypt string
$encrypted_string = Crypt::encrypt($string);

// Decrypt string
$decrypted_string = Crypt::decrypt($encrypted_string);
}

文件

文件外观用于在服务器上存储文件。它将从POST请求中收集文件并将其用于上传到服务器。

use Facades\File;

一旦包含外观,我们就可以在控制器内部自由使用此外观。

public function addimage()
{
// Create file instance
$file = new File();

// Get file by input name
$image = $file->get("image");

// Create a new name for the uploaded file.
// If you don't give any new name it will upload using its current name.
$name = "gallery_".time();

// Upload file
// $file->upload(file, path, new_name)
// If file has been uploaded, then it will return its name.
$name = $file->upload($image, "images", $name);
if($name)
{
// Uploaded successfully
}
else {
// Not uploaded
}
}

YNOTPHP将文件上传到public/storage目录。

使用此外观,我们可以使用validateImageSizes方法验证图像大小。

public function image() {
$file = new File();
$image = $file->get("image");

// $file->validateImageSizes(image, width(px), height(px))
if($file->validateImageSizes($image, 100, 250)) {
// Validation passed
} else {
// Validation fails
}
}

数据库

DB外观用于探索数据库连接。它将用于模型中连接数据库。

namespace Models;

use Facades\DB;

class Tag
{
public $table = "tags";

public function create($page, $tag)
{
// Open connection
$db = DB::open();

// Write query
$sql = "INSERT INTO tags (page, tag) VALUES (?, ?)";

// Execute query
$query = $db->stmt_init();
$query = $db->prepare($sql);
if($query)
{
$query->bind_param('is', $page, $tag);
$query->execute();

// Close connection
$query->close();
return true;
}
return false;
}
}

DB外观使用mysqli类打开数据库连接。但开发人员可以在模型中自由使用任何类型的连接,而无需使用外观。

辅助函数

辅助函数是开发出来的以减少复杂功能编码时间。

以下是列出的辅助函数

配置

env()

此函数用于从env.php获取变量。

$keyAscii = env('APP_KEY');
db()

此函数用于从当前配置在env.php中的当前模式获取db.php中的变量。

$dbhost = db("DB_HOST");
$dbuser = db("DB_USER");
$dbpassword = db("DB_PASSWORD");
$dbname = db("DB_NAME");

这将返回配置目录中当前模式下的db.php中的值。

如果您的模式是testing,则它将返回config/testing/db.php中的值。

email()

此函数用于从当前模式获取mail.php中的变量。

$mail->Host = email("MAIL_HOST");
$mail->Username = email("MAIL_USERNAME");
$mail->Password = email("MAIL_PASSWORD");
$mail->SMTPSecure = email("MAIL_ENCRYPTION");
$mail->Port = email("MAIL_PORT");
modeenv()

此函数用于从当前模式获取env.php中的变量。

如果您想在不同模式中设置不同的变量,可以使用此函数。

$variable = modeenv('VARIABLE_NAME);

路径 & 资产

asset()

此函数用于将脚本和样式表链接到视图。此函数将指向public目录。

<link rel="stylesheet" href="<?php echo asset('css/custom.css'); ?>" type="text/css" />
request_path()

此函数用于获取网页的确切URL路径。

<li>
    <a href="<?php echo url('showcase')?>"
        class="home <?php if(request_path() == "showcase") echo "active"; ?>">Showcase</a>
</li>
<li>
    <a href="<?php echo url('about')?>" class="home <?php if(request_path() == "about") echo "active"; ?>">About Us</a>
</li>
request_is()

此函数将给定路径的前缀与URL路径匹配,如果匹配则返回true

<li class="nav-item <?php if(request_is("masterzone/pages")) echo "active"; ?>"></li>

此功能将检查URL路径是否以 masterzone/pages 为前缀,如果是,则返回 true。

url()

此函数用于生成URL。

echo url("contact");

这将生成带有联系信息的完整URL。这将同时在视图和控制台中使用。

get_url()

此函数用于获取页面当前的URL。这将打印整个URL。

$url = get_url();

存储

storage_asset()

此函数用于从 public 目录中的 storage 目录检索上传的文件。

<img src="<?php echo storage_asset('images/uploaded.png'); ?>" /> 

这将返回 public/storage/images/uploaded.png