parable-php / framework
Parable PHP 框架是一个极简框架
Requires
- php: >=8.0
- ext-json: *
- ext-pcntl: *
- ext-pdo: *
- parable-php/console: ^1.0
- parable-php/di: ^1.0
- parable-php/event: ^1.0
- parable-php/getset: ^1.0
- parable-php/http: ^1.0
- parable-php/orm: ^1.0
- parable-php/routing: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9.0
- vimeo/psalm: ^4.6
README
Parable 是一个 PHP 框架,有两个目标:它足够简单,并且不强制执行一种构建方式。
安装
需要 Php 8.0+ 和 composer。
$ composer require parable-php/parable
要设置 parable,请运行以下命令并按照交互式问题操作
$ vendor/bin/parable install
使用方法
安装后(并且您选择安装示例应用)您将有一个示例应用可供查看。
Parable 2.0 基于插件来安排一切。它不是一个让您在框架之外以特定方式做事的框架。
如果您想设置路由? RoutesPlugin
。设置配置? ConfigPlugin
。只要将它们添加到 Boot.php
,它们就会在适当的时间加载。
Application::PLUGIN_BEFORE_BOOT
应包含需要在数据库或会话加载之前加载的插件。例如,ConfigPlugin
应该在这里,这样您就可以设置数据库。Application::PLUGIN_AFTER_BOOT
是用于需要数据库的插件。
示例 ConfigPlugin
在 parable
命名空间中的任何内容都会被 Application
类用于设置特定内容。您不必使用这些(此示例文件显示了所有可能的值),但您可以这样做,如果它更快/更简单的话。
在下面的示例中,yourstuff
是向应用程序中使用的 Config
实例添加自定义配置值的示例。在这里添加您想要的任何内容!
class ConfigPlugin implements PluginInterface { public function __construct( protected Config $config ) {} public function run(): void { $this->config->setMany([ 'parable' => [ 'default-timezone' => 'Europe/Amsterdam', 'database' => [ 'type' => Database::TYPE_MYSQL, 'host' => 'localhost', 'username' => 'username', 'password' => 'password', 'database' => 'database', 'charSet' => 'utf8mb4', 'port' => 40673, // all other values, see https://github.com/parable-php/orm/blob/master/README.md for more ], 'session' => [ 'enabled' => true, 'name' => 'app_session_name', ], 'debug' => [ 'enabled' => (bool)getenv('DEBUG_ENABLED'), 'levels' => E_ALL | ~E_DEPRECATED, ], ], 'yourstuff' => [ 'extensions' => [ CleanerExtension::class, ], ], ]); } }
示例 RoutingPlugin
要设置路由,只需添加一个 RoutingPlugin
,并将其放置在 PLUGIN_BEFORE_BOOT
或 PLUGIN_AFTER_BOOT
中,具体取决于您是否需要首先激活会话/数据库。
有关 parable-php/routing
的完整信息,请参阅该包的 README.md。
class RoutingPlugin implements PluginInterface { public function __construct( protected Router $router, protected Path $path ) {} public function run(): void { $this->router->add( ['GET'], 'site-index', '/', [SiteController::class, 'indexAction'], ['template' => $this->path->getPath('src/Templates/Site/index.phtml')] ); } }
能够设置 template
是 Parable 2.0.0 的特定功能。默认情况下,parable-php/routing
不理解模板,因此它作为元数据传递,而框架本身可以处理 template
元数据。
预期模板文件只是 php
文件(但在这里命名为 phtml
以指示它是一个模板)。请参阅示例应用中的 welcome.phtml
以了解如何使用它。
通过在文件顶部设置此内容,您将能够访问许多内置功能
/** @var \Parable\Framework\Http\Template $this */
请参阅 Template.php
的最顶部的文档块以查看可用的内容,但您可以从访问 Di 容器 ($this->container
) 到事件 ($this-events
) 做任何事情。
我经常被问到的一个问题是“我如何将数据从控制器传递到模板/视图?”。
亲爱的朋友,这很简单。在控制器
public function __construct(protected DataCollection $dataCollection) {} public function someAction() { $this->dataCollection->set('viewData', [ 'value' => 'this is value', 'bool' => true, ]); }
在模板中,如果您已经添加了如我建议的 @var \Parable\Framework\Http\Template $this
?很简单!
echo 'Value is ' . $this->data->get('viewData.value');
DataCollection
从 parable-php/getset
是专门用于自由形式数据存储和跨文件共享的,因此它非常适合此目的。
请注意,您不需要控制器或模板!您也可以传递一个匿名函数,这对于小型简单的 REST API 完美。
$this->router->add( ['GET'], 'api-index', '/api', static function () { echo json_encode([ 'status' => 'success', ]); }, );
在 parable-php/framework
中使用的包
请查看以下包,以了解您可能对如何处理它们有任何疑问。它们的行为作为框架的一部分完全可用,Parable 2.0 不会采取任何特殊措施来阻止您或以奇怪的方式包装它们。添加的大部分内容仅用于作为 Config
流程的一部分进行设置,这些都不是必需的。
- parable-php/console
- parable-php/di
- parable-php/event
- parable-php/getset
- parable-php/orm
- parable-php/routing
- parable-php/http
感谢
我想感谢以下这些人在启发、挑战和与我一起头脑风暴关于想法以及如何使Parable成为我从未在任何地方找到过的最佳框架方面的贡献。
- Dave van der Brugge 因为他近乎疯狂的注重细节,经常问“为什么?”,以至于有一次让我哭了出来。
- Thijs Riezebeek 无论是否愿意,都成为我的头脑风暴伙伴。他从不质疑我每一个决定的每一个方面。这是好事!
- Jerry van Kooten 因为他总是超出我对他知识水平的预期,并测试我的东西。还因为他实际上在不喜欢某些东西时创建PR,极大地改进了几个包。
- Lucas Grossi 选择使用Parable的alpha版本进行实际的专业项目,迫使我发布2.0.0版本,否则它永远不会被批准。
贡献
欢迎提出建议、错误报告或一般反馈。请使用github issues和pull requests,或者在我所在的devvoh.com上找到我。
许可
所有Parable组件都是开源软件,采用MIT许可证。