dconco / php_slides
Requires
- php: ^8.0 || ^8.3
- firebase/php-jwt: ^6.9
- phpmailer/phpmailer: ^6.9
- vlucas/phpdotenv: ^5.5
This package is auto-updated.
Last update: 2024-07-24 10:45:51 UTC
README
PhpSlides 是一个主要设计用于创建 Router
、Api
和 数据库管理
的已创建基础模板的 PHP 框架 💫。
使用 PhpSlides 创建基于安全的 Router、Api 和数据库,内置了模板数据库,接受 - MySql
和 Sqlite
数据库 🔥✨,也可以设置其他数据库。
默认情况下,它通过防止 SQL 注入,防止项目遭受 XXS 攻击和 CSRF 🔐。
对于 PHP 初学者来说,从 PhpSlides 开始是一个好习惯
PhpSlides 的工作原理
-
使用 PhpSlides,所有来自服务器的请求都会被重定向到 PhpSlides 进行路由验证。检查请求是否与已注册的路由匹配,否则返回 404 Not Found 页面 📌。
-
除非在路由中指定,否则没有任何请求可以访问 PhpSlides 项目的任何文件或文件夹 📌。
-
默认情况下,如果他们导航到任何文件或文件夹或收到未注册的请求,它将返回 404 Not Found 页面 📌。
-
想要直接访问文件?它将在 Slides 配置文件中配置,但只能访问公共目录中指定的文件 📌。
-
您还可以指定要访问的文件类型,或指定公共目录中每个文件夹或所有文件夹可以请求的特定扩展名 📌。
-
它接受所有类型的文件,包括图片、视频、音频、文档或纯文本 📌。
-
阅读 PhpSlides 默认代码并理解每个代码的功能,代码整洁易读 💯。
PhpSlides 示例及解释
首先,如果在您的终端中已安装 Composer,请执行此命令创建我们的 Slides 项目。
composer create-project dconco/php_slides slide_project
其中 slide_project
是您想要创建的项目名称,它也是项目目录。它将在您安装它的目标目录中创建具有指定名称的项目
如果尚未安装 composer。通过执行以下命令安装它
pkg install composer
我们已经设置好了。
我们将使用 vscode 或 PhpStorm 或任何其他 Php 编辑器打开我们的项目。
让我们在浏览器中开始我们的项目,您需要在 Xampp 或其他 Php 服务器上设置并启动 Apache 服务器。如果您使用手机,您可以使用 AwebServer 作为 Php 服务器。然后在浏览器中打开主机,您会看到一个默认模板。
路由
有不同类型的请求路由方法。这些路由方法用于接收来自客户端的请求
- GET 路由
- POST 路由
- PUT 路由
- UPDATE 路由
- DELETE 路由
- VIEW 路由 (几乎与 GET 相同)
- REDIRECT 路由
让我们从视图路由开始
在您的编辑器中打开 routes/route.php
文件。打开 routes
文件夹,然后是 route.php
文件。默认情况下,您将看到一个仪表板路由已被注册,您可以删除它从头开始。
让我们以创建一个简单的博客幻灯片为例。因此,我们需要注册我们的路由,需要注册一个 登录页面
,注册
,个人资料
和 帖子页面
。让我们在 route.php
文件中注册我们的路由并编写示例。
<?php include_once dirname(__DIR__) . "/vendor/autoload.php"; use PhpSlides\Route; use PhpSlides\view; Route::config(); Route::view("/login", "::Login"); ?>
上面的示例已解释。
首先,我们从供应商目录中导入我们的自动加载文件,这样我们就可以使用所有的类名。
使用 use PhpSlides\Route
,我们导入并使用我们的 Route 类。
Route::config
函数必须在代码的开始处指定。它使 PhpSlides 配置我们的网站路由,使其非常安全,允许我们配置路由和请求路径。
Route::config
函数接受一个布尔参数,表示是否允许记录请求。默认情况下设置为 true。因此,在每个请求中,它都会将请求头信息写入到 .log
文件。
并且 Route::view
函数允许您创建一个视图路由。
传递给它的参数有两个,第一个参数指定应请求的路由以渲染第二个参数。
第二个参数渲染视图目录中的文件,可以使用 :: (双冒号) 和文件名访问。我们在视图目录中创建的任何文件都必须是 fileName.view.php
格式,其中 fileName
是视图文件的名称,.view.php
是文件扩展名,这样 PhpSlides 就会意识到它是一个视图文件。
所以让我们创建一个名为 Login.view.php
的新文件,因为我们已经在路由中注册了它。然后我们可以编写一段简单的 HTML 代码。
<html> <head> <title>Login Page</title> </head> <body> <h2>Login Page</h2> <input type="email" name="emai" /> <input type="password" name="password" /> <button type="submit">Login</button> </body> </html>
GET 路由方法
GET 路由方法示例
<?php use PhpSlides\Route; use PhpSlides\view; Route::config(); Route::get("/login", Route::view("::Login")); ?>
您可以看到视图与 GET 路由之间的区别。在视图路由中,您不需要使用 Route::view
来获取视图文件,您将视图作为字符串写入第二个参数。
但在 GET 路由中,第二个参数用作回调函数,可以接受任何类型的代码。例如,字符串、数组、函数。因为它直接返回到客户端。使用 GET 路由时,特定 URL 接收的请求方法必须是 GET 请求,就像所有路由方法一样。
带有闭包函数的 GET 路由方法
Route::get("/login", function() { return Route::view("::Login"); });
它返回登录视图页面,我们可以将任何 PHP 值返回到浏览器。
所有路由方法都有第二个参数作为回调函数,该函数可以接受函数方法或其他方法。
带有闭包的 URL 参数的 GET 路由方法
Route::get("/posts/{id}", function(int $id) { return "Posts ID = " . $id });
上面的示例注册了一个新的 GET 路由,用于接收 /posts 请求,该请求接收带有函数闭包参数的 ID 的 GET 请求。如果请求是 /posts/2,则它将返回 "帖子 ID = 2",它获取 ID 值并将其发送到客户端/浏览器。
POST 路由方法
POST 路由方法示例
<?php use PhpSlides\Route; use PhpSlides\view; Route::config(); Route::post("/add_user", ()); ?>
它调用 POST 方法,表示如果 REQUEST_METHOD 是 POST 请求,则只能执行 POST 路由函数。它可以用于提交表单数据。
第二个参数为空,可以返回 JSON 格式,因为 POST 方法通常用于发送返回 JSON 格式数据的 POST 请求,第二个参数可以包含用于回调函数的任何格式。
其他路由方法也是如此。
PUT 路由方法
PUT 路由方法示例
Route::put("/user", ());
PUT 方法就像 POST 请求一样,用于向特定文件或数据库添加信息或数据。
更新路由方法
UPDATE 路由方法示例
Route::update("/user/{id}", ());
UPDATE 方法通常用于更新信息,如数据库中的信息。
DELETE 路由方法
DELETE 路由方法示例
Route::delete("/user/{id}", ());
DELETE 方法通常用于在数据库中删除信息。
任意路由方法
ANY路由方法的示例
Route::any("/user/{id}", ());
使用Route::any()
方法可以接收所有类型的请求。可以是POST、GET、PUT、UPDATE或DELETE,具体取决于请求的路由方法。
创建NotFound错误路由
NotFound路由方法的示例
Route::any("*", Route::view("::errors::404"));
在上面的NotFound示例中,我们创建了一个任意路由,并将第一个参数设置为*
,表示在没有任何路由与请求的URL匹配时返回。
NotFound路由应放在已注册的路由的末尾,以便在所有上述路由不匹配时执行。
在第二个参数中,我们导航到view
文件夹,并在view
目录中创建了一个名为errors
的文件夹,然后创建了一个名为404.view.php
的页面。
多个路由URL渲染
您可以为渲染页面或函数创建多个路由URL。
使用数组及其中的URL列表创建多个URL。可以使用任何路由方法。
注意:当使用带{}花括号的路由参数时,不能使用多个URL。
Route::view(["/", "/index", "/dashboard"], "::dashboard");
此示例说明,当请求的URL与数组中指定的URL匹配时,将在浏览器中渲染dashboard.view.php
。所有路由方法都接受多个URL。也可以为404页面创建多个URL。
使用闭包的路由控制器
PhpSlides
允许您在类控制器中访问路由参数的键。
您可以使用任何路由方法进行路由控制器,除了视图方法。我们以GET方法为例。
我们在项目的根目录下的Controller
目录中创建了一个简单的类组件。
导航到Controller
目录,创建一个您选择的控制器名称,但必须是此格式ClassName
+ Controller.php
,应该是ClassNameController.php
。
让我们创建一个名为UserController.php
的新控制器。让我们导航到创建的文件并在其中编写一些代码。
<?php namespace PhpSlides\Controller; final class UserController extends Controller { public function __invoke(int $id) { return "<h2>Get User with ID = {$id}</h2>"; } } ?>
在上面的示例中,我们在/controller
文件夹中创建了一个名为UserController.php
的文件。
我们为将要调用的类创建了类控制器的命名空间。我们创建了一个名为UserController
的类,并将其扩展到Controller
类,这允许您访问一些受保护的函数。
确保在创建了有命名空间的每个类组件后,您应该运行以下命令以自动加载每个类。
composer slides-refresh
类中的final关键字表示该类应该是最终的,不能被其他类扩展,如果您希望类被扩展,则可以删除它。
我们创建了一个名为__invoke
的公共函数,它获取路由中的闭包参数,该参数将被用于获取URL参数并返回回调函数的值。因此,它获取闭包参数$id
,并在参数名前使用int
描述它为一个整数。
让我们注册用户路由并将其设置为GET路由,可以根据使用情况将其设置为任何类型的路由请求。
<?php use PhpSlides\Route; use PhpSlides\Controller\UserController; Route::config(); Route::get("/user/{id}", [ UserController::class ]); ?>
在上面的示例中,我们已经创建了一个名为UserController
的类,并且我们创建了一个具有URL参数id
的GET路由方法。
然后我们渲染UserController
类,其中id
参数已通过__invoke
函数发送到UserController
类。
使用类方法的路由控制器
在我们的类控制器中,我们还可以为不同的路由请求创建多个方法。
<?php final class UserController extends Controller { public function __invoke() { return "<h2>Invoked User Successful. Receieved all users successfully.</h2>"; } public function User($id) { return "<h2>Received an ID - $id for a user.</h2>"; } } ?>
在UserController
中,我们创建了一个名为User()
的另一个方法,该方法接受一个参数$id
,用于id
URL请求参数。
让我们在路由中使用User()
类方法。
Route::get("/user", [ UserController::class ]); Route::get("/user/{id}", [ UserController::class, 'User' ]);
第一个函数没有URL参数,因为在这种情况下,我们返回所有可用的用户,而不是每个用户。
我们创建了第二个函数/user/{id}
,这意味着我们将id
URL参数传递到User()
路由方法中。
要通过将方法名 User
作为字符串传递给路由控制器数组,并将它放置在数组的第 2 个索引处来使用 User()
方法,数组中只能有两个数组值。
可以添加尽可能多的方法,以及尽可能多的 URL 参数。
使用闭包的多个 URL 参数
以下为创建多个 URL 参数的示例
Route::get("/user/{id}/post/{post_id}", function($user_id, $post_id) { return "User ID = $user_id & Post ID = $post_id"; });
有两个 URL 参数称为 id
和 post_id
,分别对应用户 ID 和帖子 ID,然后我们在闭包函数参数中获取 URL 参数。与路由控制器方法相同。
但请确保函数闭包参数的变量不能相同,否则可能会出现冲突,但 URL 参数可以相同。
PhpSlides 配置
在 PhpSlides 中的配置,使您能够完全控制请求在路由中的发送/接收方式。路由配置可以在 phpslides.config.json
文件中设置。
默认情况下,即使在浏览任何页面时,整个网页也将为空。因此,使用网页路由可以向网页添加页面,如果它们跟随任何链接,它将返回 URL 对应的页面。如果设置了 未找到页面
,则每次页面不存在时都将使用它。
默认情况下,如果他们打开任何指向页面任何路径的 URL,除非添加了 未找到页面
,否则网页将为空,因为为了使您的网站更安全,他们只能访问他们想要访问的部分。
PhpSlides 中的配置使您能够轻松地配置用户可以查看的部分,以创建一个非常安全的网站。因为他们只能查看公共文件夹中的任何文件,但不能查看除了路由之外的其他文件夹。
PhpSlides 配置的示例
打开您项目的根目录中的 phpslides.config.json
文件。
{ "charset": "UTF-8" }
上述示例指定了返回所有文件和路由页面到浏览器的字符集。但您可以使用 PHP 代码随时更改它,如果您想更改某些部分。
{ "public": { "/": ["*"] } }
我们在 JSON 文件中添加了 public
键,它指定了可以在 public
目录及其子目录中访问的文件。
我们添加了 /
键,它指定了 public
目录的根。所以我们添加了它有 *
(星号)。指定访问 public
目录根目录下的所有文件。并且我们可以指定他们可以访问的任何类型的扩展名,即使文件存在并且他们尝试访问配置中不可用的扩展名的文件,它也会返回一个 未找到页面
。他们可以在数组中写入多个扩展名。还可以写入 image
,这样他们就可以访问所有图像、video
或 audio
。
"/": [ "image", "audio", "video" ]
在 public
目录内部每个嵌套文件夹都将指定为配置文件中的扩展名数组。如果您想允许所有嵌套文件夹,只需在 JSON 文件中指定文件夹及其可以允许的扩展名即可。
例如,目录的格式如下
public:
assets:
image.jpg
file.pdf
vendor:
bootstrap.min.js
images:
image.png
image1.jpg
file.html
以下示例解释如下:在 public
目录中我们有 assets
和 images
文件夹。所以在这个 assets
文件夹中,我们有一个图像、一个 PDF 文件和一个包含 bootstrap.min.js
的 vendor
文件夹。所以如果我们想配置它:
{ "public": { "assets": ["jpg", "js"], "images": ["image", "video"] } }
在这个示例中,我们只为 assets
和 images
目录创建了配置,所以 assets
目录中的所有文件和文件夹都将使用 assets
目录中添加的扩展名,这表示在这个示例中,指定的 js
扩展名也将允许在 vendor
文件夹中使用,或者我们可以在 JSON 文件中添加 vendor
键。
因此,当我们配置 assets
目录时,他们只能访问 vendor
文件夹中的 jpg
文件和 js
文件。
对于 images
目录,我们指定它只能访问 image
或 video
类型的任何文件,因此它允许两个文件存在,即 png
和 jpg
,并且当尝试访问没有添加扩展名的 file.html
文件时,会返回 Not Found page
。
在网页中查看公共文件
要查看 public
目录中所有文件以及嵌套文件夹中的文件,您不需要在获取文件之前添加 public
文件夹,否则将返回 Not Found page
。所以,就像上面的例子一样,要访问 assets
文件夹中的文件,我们会遵循以下 URL: https://:8000/assets/image.jpg
而不是 https://:8000/public/assets/image.jpg
。如果文件位于项目的根目录中,它将在主机 URL 之后直接访问: https://:8000/image.jpg
。
版本 1.1.0
在这个版本中,幻灯片提供了一种处理视图页面的方法 🔥 在 views
目录中创建你的视图模板文件,格式为 fileName
+ .view.php
扩展名。即 fileName.view.php
PhpSlides 创建了一些特殊的视图语法。
- @view
- ::view
- ::root
- <include !/>
<? ?>
让我们开始吧..
<!DOCTYPE html> <html> <!-- Php codes if needed --> <? ?> <head> <!-- Meta Tags Info --> <title>Page Title</title> </head> <body> <!-- Body contents --> </body> </html>
在一个视图模板页面上,当我们写入 HTML 代码时,PHP 标签不应该在文件开头,而是将 PHP 标签和代码写入 <html>
标签内或任何其他地方(除了开头),始终使用 <html>
标签开始 HTML 文档,而不是 <?php
标签。
视图模板中的 <? ?>
标签是用于编写短 PHP 代码的简短 PHP 标签。例如使用 if 语句或向 HTML 页面输出数据。示例代码
<body> <? if ($user): ?> <h1>Hello <? @view $user ?></h1> <? else: ?> <h1>Hello Guest</h1> <? endif; ?> <p> <? @view 'welcome to our blog spot!' ?> </p> </body>
此示例的解释如下:在 body 元素中,如果用户返回 true,则添加一个包含用户变量值的 h1
元素,该变量值通过在幻灯片中使用 @view 关键字返回。否则,它将返回一个包含文本 Hello Guest 的 h1
元素。在 <p>
标签中,我们编写了使用 @view
关键字将字符串/值返回到 <p>
元素的 PHP 代码。
::view & ::root
::view
仅在视图模板文件中使用,用于返回项目服务器名称后的根位置,从 /
开始。通常用于链接公共文件。而 ::root
返回项目的根位置,与 ::view
不同,::root
用于在 PHP 中包含项目的任何文件,而 ::view
只能访问浏览器/客户端可以访问的内容,但不能在不在 public
目录中访问项目中的任何文件。
现在让我们假设我们在公共目录中要访问的图像以及需要在视图页面上包含的额外 PHP 文件。
<body> <? include '::root/components/extraFile.php' ?> <div> <img src="::view/assets/icon.png" alt="Icon" /> </div> </body>
在这种情况下,项目的根被表示为 ::root
,并在项目中创建了一个名为 components
的文件夹和一个名为 extraFile.php
的新文件,用于在视图页面上包含任何 PHP 代码。
::view
是服务器主机的根位置,所以让我们假设主机 URL 为 https://:8000/
,因此它表示为 ::view
。在幻灯片中,通常将 public
目录中的所有文件和文件夹扩展到 URL 的根处,作为 ::view/
,而不是 ::view/public
。
因此,URL 为 ::view/assets/icon.png
的 public
目录中创建了 assets
文件夹和 icon.png
图像。
SLIDES_INCLUDE
幻灯片提供了一种方法,让您将另一个视图模板文件包含到视图页面中,而不仅仅是 PHP 文件。
包含视图页面的两种方法
- 使用
<include !/>
HTML 标签 - 使用
slides_include
PHP 函数
使用 <include !/>
HTML 标签,您可以将其他 PHP/视图页面包含到当前视图页面中。这允许您在其他文件中编写幻灯片视图模板以包含。同时,也可以将项目任何位置的任何 PHP 文件包含在内。
<body> <include path="::root/components/extraFile.php" ! /> <include path="::root/views/viewPage.view.php" ! /> </body>
所以,在第一个标签中,我们包含了一个位于 components
目录的 PHP 文件。在第二个标签中,我们包含了一个位于 views
目录的视图模板文件。并且只能在视图模板页面中使用 <include !/>
标签。
slides_include
此功能为您提供了一种在任何 PHP 文件中包含视图文件的方法,而不仅仅是视图模板页面。
<? @view slides_include('::root/comp/extraFile.php') ?> <? @view slides_include('::root/views/page.view.php') ?>
版本 1.2.0
API
PhpSlides 在 -v1.2.0 中发布了 API,这允许您在项目中使用 API。API 就像路由,但它将数据渲染回请求而不是浏览器。Slides 提供了 Api
函数,允许您注册 API 路由。并在 web.php
文件中设置了 API 控制器。在 routes/api.php
文件中注册您的新 API 路由。
<?php use PhpSlides\Api; Api::get(); Api::post(); Api::put(); Api::patch(); Api::update(); Api::delete(); ?>
在上面的示例代码块中,我们创建了 API,并提供了 API 请求方法。Api
函数只接受两个参数,一个是 API 路由 URL,第二个参数是控制器类方法。
注意,在您创建 API 之前,请确保在 route.php
文件中设置了 Route::config()
函数,即使您不使用 Web 路由。
让我们为给定的请求路由 "/api/users"
创建一个 POST 方法,它会显示数据库中可用的用户列表。并创建另一个路由 "/api/users/{id}"
,也是一个 POST 方法,它会根据给定的 id 显示特定的用户。
<?php use PhpSlides\Api; Api::post("/api/users"); Api::post("/api/users/{id}", @user); ?>
所以,在第一个 Api 中,我们没有为要使用的方法提供第二个参数,默认情况下是 __invoke
方法。在第二个中,我们使用了 @user
,它声明了同一控制器类的 user
方法。@
指向控制器类的方法名称。
让我们首先在 Controller/Api
目录中创建我们的控制器类。让我们将其命名为 UserController
。在我们的控制器命名中,必须在文件名末尾添加 Controller
,这描述了一个控制器文件。
<?php namespace PhpSlides\Controller; final class UserController extends Controller { function __invoke() { $response = ['data' => 'We have gotten all users id successful']; return json_encode($response); } function user(int $id) { $response = ['data' => 'The particular user id = $id']; return json_encode($response); } } ?>
在 UserController
类中,我们创建了两个功能方法,并返回编码后的 JSON 格式。
还未完成.. 我们需要在 src/web.php
文件中为每个 API 路由 URL 注册控制器类。
<?php use PhpSlides\Controller\UserController; return [ '/api/users' => UserController::class, '/api/users/{id}' => UserController::class ]; ?>
我们现在已注册了 API 路由,API 已准备好被使用 ❤️💯。
欢呼吧,当您享受使用 PhpSlides 时!!!
在下一个版本中将有更多功能。