deadpikle/yamf-php

此包最新版本(dev-master)没有可用的许可证信息。

dev-master 2020-04-26 22:06 UTC

This package is auto-updated.

Last update: 2024-09-29 04:14:42 UTC


README

YAMF (Yet Another MVC Framework) 是一个轻量级的PHP MVC框架,旨在让您快速开始使用MVC模式,而无需进行大量设置工作。您只需要一个接受 .htaccess 文件的Web服务器,基本上就可以开始使用了!

设置

最低要求:PHP 7.0+。

  1. 克隆存储库,或通过点击 此链接 或在主项目仓库页面上点击 Use this template 按钮将此项目用作您自己的项目的模板。
  2. 确保您的Web服务器已设置好以读取和利用 .htaccess 文件。(如果您不知道这意味着什么,请谷歌一下!也许我们稍后会在此处添加一些辅助链接。)
  3. 如有必要,请配置 config.php。调整您想在其中设置的任何参数,或向 $app 中添加新参数,例如会话逻辑。默认情况下,您无需调整任何内容即可启动和运行您的网站。
  4. 如果您需要使用数据库凭据、私钥等在网站上使用的信息,请将 config-private.sample.php 复制到 config-private.php 并根据您的需求进行调整。例如,您可以设置 $app->db 为您的本地数据库的 PDO 实例。 请注意,config-private.php 将在 config.php 中的任何内容之前加载。
  5. 为了使 use Yamf/XYZ 语句正常工作,您需要使用 Composer。使用Composer非常简单:只需访问 下载页面 并运行顶部的脚本。(注意:如果您使用Windows,请按照简介页面上的说明 进行操作。)
  6. composer install(如果您在目录中有 composer.phar 文件,请运行 php composer.phar install)。它将静置思考一分钟。
  7. 您已完成!享受您的基于MVC的网站!当然,您可以移除默认示例项和CSS!

等等!数据库迁移库/视图模板逻辑/单元测试库/{其他框架}在哪里?

它们不在这里,也不是故意不在这里的!YAMF是特意编写的,不使用任何外部依赖项,除了Composer的自动加载器,以降低使用PHP中MVC模式进入的门槛。如果您需要任何这些功能,只需使用您最喜欢的依赖管理器(如Composer)引入它们。由于Composer对于运行此项目的PSR-4自动加载是必需的,因此我们建议使用Composer。vendor/autoload.php 已经在 init.php 中为您包含。

有关视图模板的说明,请参阅子类化部分。

文档

如果您阅读了以下关于YAMF的文档,您将比仅仅跳入并尝试阅读代码要好得多。 :) 这只需几分钟,而且值得!

关于 $app 的说明

为了便于配置参数(如数据库设置等)的轻松传递,YAMF将一个类为Yamf\AppConfig$app变量传递给每个控制器函数。您可以设置此变量以存储您的数据库PDO对象,更改视图扩展名或文件夹位置,以及许多其他设置。如果要将自定义值添加到$app中,可以创建一个从Yamf\AppConfig派生的类,并将config.php中的appConfigClass设置更改为您自定义的类。请注意,您的自定义类必须从Yamf\AppConfig派生!请参阅config.php以查看YAMF通过$app传递的所有设置和值。值得注意的是,您可以

  • 更改视图文件夹的位置(viewsFolderName
  • 更改视图文件的扩展名(viewExtension
  • 更改默认的头部或尾部名称(defaultHeaderName/defaultFooterName
  • 轻松访问您的PDO/其他数据库(在config-private.php中设置)

$app在您的视图中自动可用。

添加新路由

您可能首先想要做的是添加一个新路由。为此,请按照以下步骤操作

  1. 如果您还没有为新路由创建控制器类,请前往项目中的app/Controllers文件夹添加一个。子文件夹是可以的。控制器实际上不需要在名称中包含Controller,但请确保类名与文件名匹配。
  2. 为您的控制器方法添加一个存根。至少,它必须是一个接受两个参数的public函数:$app$request(按此顺序)。
  3. 打开routes.php并确保您理解路由的工作原理的文档和示例。
  4. 将您的路由添加到routes数组中。
    • 如果需要,请指定POST
    • 控制器名称字符串必须与第一步中控制器文件名和类名匹配。
    • 如果控制器位于子文件夹(或子文件夹中),请确保您有Parent-Folder/Controller-Name格式的名称。
    • 函数名称应与第二步中的函数名称匹配。
  5. 到目前为止,路由已经生效,但您的控制器方法需要返回某种类型的yamf/Responses/Response,这可以是从View到JSON响应,甚至更多。请参阅下一部分以获取更多信息。
  6. 您正常的用例可能是返回一个yamf/Responses/View。在views文件夹中创建一个PHP文件(视图)--同样,子文件夹是可以的--,并在控制器方法中返回return new View('name/of/view');
  7. 现在路由应该可以正常工作了!

简而言之

  1. 将控制器及其方法添加到app/Controllers文件夹
  2. 将路由添加到routes.php
  3. 如果需要,在views文件夹中创建视图
  4. 将控制器方法修改为return new View('name/of/view');

控制器函数的返回类型

所有因路由而调用的控制器方法都应该返回一个yamf/Responses/Response或其子类。以下是关于如何使用每个类的说明。大多数都可以使用一行代码仅使用构造函数来完成。

  • Response -- 路由响应的基类。
    • 构造函数格式:new Response($statusCode = 200)
    • 输出状态码。
    • 由于所有其他yamf/Responses/Response项目都是从这个父类派生的,因此它们都可以返回自定义HTTP状态码,如果您想的话!
  • ErrorMessage -- 简单包装View,以发送回状态码为400的错误.php视图。
    • 构造函数格式:new ErrorMessage($msg = '', $name = 'error', $title = '', $headerName = '', $footerName = '')$name是视图名称。
    • 请注意,第一个参数是错误消息,而不是视图名称!
    • 默认情况下,输出到视图中的错误变量名为 $error。如果不使用子类化,您不能更改此变量。
    • 默认情况下,使用的头部和尾部文件是 views/header.phpviews/footer.php
    • 当然,状态码也可以更改。
  • JsonResponse -- 有关如何从控制器发送JSON响应的示例
    • 构造函数格式:new JsonResponse($data, $jsonEncodeOptions = 0)
    • 通过 echo json_encode($this->data, $this->jsonEncodeOptions); 输出 $data
  • NotFound -- 用于向客户端返回404未找到消息。
    • 构造函数格式:new NotFound($name = '404', $data = [], $title = '', $headerName = '', $footerName = '')$name 是视图的名称。
    • 默认情况下,使用的头部和尾部文件是 views/header.phpviews/footer.php
    • 如果您只想返回404(例如,用于API),请使用 Response
  • Redirect -- 允许对其他页面或路由进行302重定向
    • 构造函数格式:new Redirect($redirectPath, $isInternalRedirect = true)
    • 默认状态码为302
    • $isInternalRedirect 用于重定向到当前网站/routes.php 数据中的路由。如果您想重定向到内部路由,请像这样使用 Redirectnew Redirect('/route/name');(注意前面的 /)。如果不这样做,请像这样使用 Redirectnew Redirect('https://example.com', false);
  • View -- 用于返回基于PHP的HTML视图。
    • 构造函数格式:new View($name, $data = [], $title = '', $headerName = '', $footerName = '')$name 是视图的名称。
    • 要将数据发送到您的视图,最简单的方法可能是使用 compact 函数。请参阅 BlogController 的示例。
    • 默认情况下,使用的头部和尾部文件是 views/header.phpviews/footer.php

如果您对YAMF中应包含的更多 Response 类型有想法,请通过问题标签打开功能请求或打开拉取请求!

发送到控制器方法的数据

从路由发送到您的控制器方法中的有两个主要变量:$app$request请注意,所有 View 输出都将具有可用的 $app$request 变量。您不需要将它们作为 $data 参数发送。

AppConfig $app

$app 主要是在 config.php 中设置的配置变量。查看该文件以快速查看可用项。一些更重要的事项包括

  • $app->db 用于数据库连接
  • 所有视图、404页面和错误页面的默认头部文件名。您可以将其设置为 null 以避免完全使用它们。

除此之外,还有两个在 init.php 中设置的变量可用

  • $app->isLocalHost -- 应用程序是否在本地主机上运行(127.0.0.1::1
  • $app->basePath -- 当前Web应用程序的基础目录。这可以用于允许在Web服务器上嵌套Web应用程序。我 强烈 建议在本地网站链接时使用此变量,以便在移动文件或稍后将其移动到子文件夹时不会破坏一切。要链接到网站上的另一个页面,只需使用 $app->yurl(string)(YAMF URL)函数,如下所示:<?= $app->yurl('/path/to/page') ?>

$request

$request 将包含有关您的路由以及随请求传入的不同参数的所有数据。它是 yamf/Request 类型。它具有以下公共成员可用

  • $request->route -- 请求的原始路由字符串
  • $request->controller -- 控制器的字符串名称
  • $request->function -- 要调用的控制器函数的字符串名称
  • $request->routeParams -- 路由中的任何参数,例如 {id}。格式:['id' => value]
  • $request->get -- 在URL中找到的任何GET参数 -- 与 $_GET 的格式相同(没有进行额外处理)
  • $request->post -- 任何POST参数 -- 与 $_POST 的格式相同(没有进行额外处理)
  • $request->anchor -- 如果使用,则是 URL 的 # 部分(不含 #)。路由器足够智能,不会与像 /blah/#/foo 这样的 URL 匹配。

通过子类扩展框架

您扩展此框架的最简单方法是从 Response(或某些其他 Response 子类)派生,并为一些控制器创建一个父类。例如,通过从 View 派生,您可以将视图输出更改为使用 Twig 模板引擎,而不是仅使用简单的 PHP 输出。通过为您的控制器创建父类,您可以为所有 API 路由添加验证或其他额外数据处理,例如验证用户名/密码或令牌。选项无穷无尽,潜力巨大!

在 Twig 分支中有一个使用 Twig 而不是原始 PHP 的示例!

静态页面简洁性

YAMF 支持的一种非常巧妙的特性是无需 routecontroller 的静态网页。如果您想让 /about 只是一个简单的页面,只需将 about.php 页面放入 views/static/ 文件夹中,然后 -- 嘭! -- /about 就可以在您的网站上工作。那么子文件夹如 /blog/post-name 呢?这也一样工作!添加一个 views/static/blog/post-name.php 文件,它就 Just Works(tm)!您可以使用此功能在网站上仍然拥有漂亮的 URL,而无需担心添加路由和控制器。

您可以在 config.php 中配置静态视图位置。

请注意,路由器在检查静态页面之前会尝试匹配 router.php 路由。

URL 缩短器

路由器支持的一个未立即启用的功能是 URL 缩短 -- 例如 https://example.com/short-url。它需要一个数据库连接,但如果您添加数据库连接并具有适当的数据库表(模式在 config.sample.php 中),则可以在需要时使用 URL 缩短。您不必启用此功能。

默认会话逻辑

我在 config.sample.php 中包含了一些默认的会话逻辑,并已注释。请随意使用它、修改它或丢弃它。如果您有改进此功能的建议,请提交一个拉取请求或问题以产生进一步的讨论。

我能帮忙贡献吗?

很高兴您问!开源项目上总是有可以做的事情:修复错误、添加新功能等等!检查此存储库的问题标签,看看已经报告了哪些错误,以及哪些功能已被请求。有关贡献的更多信息,请参阅 贡献 文档。

许可

MIT 许可证。请确保在使用此框架(如果愿意,请包括 GitHub 链接!)时包含此框架的许可证。谢谢! :)

特别感谢

特别感谢 Bootswatch 提供的 Bootstrap Paper 主题,该主题用于示例。