Div PHP Ways

2.4.1 2019-12-13 05:08 UTC

This package is auto-updated.

Last update: 2024-09-13 09:09:54 UTC


README

"方式"与"路由"不同。我们需要一个路径来找到特定的资源,但我们需要一个方式来做某事。这个库在实现PHP应用程序的路由和控制时遵循这个概念。

Ways是一个将SOA的概念适配到PHP应用程序架构的类,并试图整合混合系统的各个部分。

使用Ways时,你应该更多地考虑“控制点”而不是MVC模式中的控制器。控制点在需要时被激活,即按需,取决于你做出的定义。

<?php

ways::listen('sql://...', function($data, $args){
    
	ways::listen('sql://query', function($data){
	  $pdo = new PDO();
	  $st = $pdo->prepare($data['query']);
	  $st->execute($data['params']);
	  $data['result'] = $st->fetchAll(PDO::FETCH_OBJ);
	  return $data;
	});
	
});

ways::invoke('sql://query', [
    'query' => 'SELECT * FROM cats WHERE name = ?',
    'params' => ['Tom']
]);

在其他平台上,通常在同一个文件中一次性定义所有到驱动器的路由。在Ways中,这不是强制性的。你可以有一个初始控制点,并根据调用的URI转到另一个定义了路由的控制点X,从而使路径在需要时形成,从而提高应用程序的性能。URI的结构可能表明Ways允许控制点的分层结构,但实际上它可以创建一个完整的图结构。

首先调用一个URI,来自HTTP或CLI。但你在代码中可以调用任何URI。

div ways MVC

此外,控制点可能需要先执行另一个控制点。你还可以实现事件或钩子,这样你可以在另一个控制点之前或之后执行一个控制点,而后者不知道前者的存在。这些灵活性对于插件架构来说很有用。

控制点可以交互,这意味着可以将流程重定向到另一个,直接调用控制点,交换数据和URL参数,处理屏幕上的输出等。

此外,你可以为控制点的执行建立规则。

<?php

ways::rule('is-monday', function(){
    return date('D') === 'Mon';
});

ways::listen('*', function (){
    echo 'Today is Monday !!!';
}, [ways::PROPERTY_RULES => ['is-monday']]);

Ways不仅适用于Web,也适用于命令行应用程序。Ways通过一个类,一个文件实现。这允许快速启动和与其他平台的轻松适配。

文档

https://github.com/divengine/ways/wiki

安装

使用composer...

composer require divengine/ways

不使用composer,下载类并...

include "path/to/divengine/ways.php";

基本用法

<?php

// arbitrary location for software's packages
define('PACKAGES', 'path/to/app/');

use divengine\ways;

// ways with closure
ways::listen("get://home", function($data){
	echo "Hello {$data['user']}";
}, "home");

// add a hook
ways::hook(DIV_WAYS_BEFORE_RUN, "home", function($data){
	$data['user'] = "Peter";
});

// listen... 
$data = ways::bootstrap('_url', 'home');

调用静态方法

app/control/Home.php

<?php

#id = home
#listen = /home

class Home {
	
	static function Run()
	{
	    echo "Hello world";
	}
		
	static function About()
	{
		echo "About us";
	}
	
	#listen@Contact = get://about
	static function Contact()
	{
		echo "Contact us";
	}
}

index.php

<?php

// register a controller with the default static method ::Run()
ways::register("app/control/Home.php");

// route to another static method ([controllerID]@[method])
ways::listen("/about", "home@About");

// route to closure
ways::listen("/sayMeHello/{name}", function($data, $args) {
	echo "Hello {$args['name']}";	
});

// hook on the fly
ways::hook(DIV_WAYS_BEFORE_RUN, 
	ways::listen("/tests/...", function(){
		
		ways::listen("/tests/1", function(){
			echo "This is the test 1";
		}); 	
		
		ways::listen("/tests/2", function(){
			echo "This is the test 2";
		});
		
		if (ways::match("/tests/3")) {
			echo "This is the test 3";
		}
		
		ways::bootstrap();
	}), 
	function(){
		if (!isset($_SESSION['user']))
		{
			echo "You are not a tester";
			return false;
		}
		return true;
	});

// route to a static method
ways::bootstrap("_url", "home");

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L]

CLI应用程序

<?php

// say me hello
// $ php one_script.php hello Peter
ways::listen("/hello/{name}", function ($data = [], $args = []) {
	echo "Hello {$args['name']}\n";
});

获取控制器属性

<?php

$property = "This is a property value";

ways::listen("/", function ($data = [], $args = [], $properties = []) {
	echo "Controller ID = " . $properties['id'] . "\n";
	echo "A controller property = " . $properties['myProperty'];

}, [
	'myProperty' => $property,
]);

享受吧!

--

@rafageist

Eng. Rafa Rodriguez

https://rafageist.com