- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个路由机制,通过依赖文件系统结构来发送请求:
function Route($root) {
$root = realpath($root) . '/';
$segments = array_filter(explode('/',
substr($_SERVER['PHP_SELF'], strlen($_SERVER['SCRIPT_NAME']))
), 'strlen');
if ((count($segments) == 0) || (is_dir($root) === false)) {
return true; // serve index
}
$controller = null;
$segments = array_values($segments);
while ((is_null($segment = array_shift($segments)) !== true)
&& (is_dir($root . $controller . $segment . '/'))) {
$controller .= $segment . '/';
}
if ((is_file($controller = $root . $controller . $segment . '.php')) {
$class = basename($controller . '.php');
$method = array_shift($segments) ?: $_SERVER['REQUEST_METHOD'];
require($controller);
if (method_exists($class = new $class(), $method)) {
return call_user_func_array(array($class, $method), $segments);
}
}
throw new Exception('/' . implode('/', self::Segment()), 404); // serve 404
}
.php
同名文件)。如果提供了更多的段,第一个段将定义要调用的操作(返回到http方法),其余的段将作为操作参数。
- /controllers
- /admin
- /company
- /edit.php (has get() & post() methods)
- /company.php (has get($id = null) method)
domain.tld/admin/company/edit/
时,
edit.php
控制器提供请求(它应该提供),但是通过
domain.tld/admin/company/
或
GET
访问
domain.tld/admin/company/get/
会直接抛出404错误,因为
company
段被映射到相应的目录,即使剩余的段在文件系统中没有映射。我怎样才能解决这个问题?最好不要在磁盘上花费太多精力。
最佳答案
对于像这样关键的东西,用phpunit这样的测试框架编写测试非常重要。
按此处所述安装(您需要PEAR):
https://github.com/sebastianbergmann/phpunit/
我还使用虚拟文件系统,这样您的测试文件夹就不会变得凌乱:https://github.com/mikey179/vfsStream/wiki/Install
我只是把route函数放到了一个名为Route.php
的文件中。在同一个目录中,我现在创建了一个test.php
文件,其中包含以下内容:
<?php
require_once 'Route.php';
class RouteTest extends PHPUnit_Framework_TestCase {
}
$ cd path/to/directory
$ phpunit test.php
PHPUnit 3.7.13 by Sebastian Bergmann.
F
Time: 0 seconds, Memory: 1.50Mb
There was 1 failure:
1) Warning
No tests found in class "RouteTest".
FAILURES!
Tests: 1, Assertions: 0, Failures: 1.
// new parameter $request instead of relying on server variables
function Route($root, $request_uri, $request_method) {
// vfsStream doesn't support realpath(). This will do.
$root .= '/';
// replaced server variable with $request_uri
$segments = array_filter(explode('/', $request_uri), 'strlen');
if ((count($segments) == 0) || (is_dir($root) === false)) {
return true; // serve index
}
$controller = null;
$all_segments = array_values($segments);
$segments = $all_segments;
while ((is_null($segment = array_shift($segments)) !== true)
&& (is_dir($root . $controller . $segment . '/'))) {
$controller .= $segment . '/';
}
if (is_file($controller = $root . $controller . $segment . '.php')) {
$class = basename($controller . '.php');
// replaced server variable with $request_method
$method = array_shift($segments) ?: $request_method;
require($controller);
if (method_exists($class = new $class(), $method)) {
return call_user_func_array(array($class, $method), $segments);
}
}
// $all_segments variable instead of a call to self::
throw new Exception('/' . implode('/', $all_segments), 404); // serve 404
}
public function testIndexRoute() {
$this->assertTrue(Route('.', '', 'get'));
$this->assertTrue(Route('.', '/', 'get'));
}
PHPUnit_Framework_TestCase
,您现在可以使用类似
$this->assertTrue
的方法
$ phpunit test.php
PHPUnit 3.7.13 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 1.75Mb
OK (1 test, 2 assertions)
array_filter
是否正确删除空段:
public function testEmptySegments() {
$this->assertTrue(Route('.', '//', 'get'));
$this->assertTrue(Route('.', '//////////', 'get'));
}
$root
目录不存在,还可以测试是否请求索引路由。
public function testInexistentRoot() {
$this->assertTrue(Route('./inexistent', '/', 'get'));
$this->assertTrue(Route('./does-not-exist', '/some/random/route', 'get'));
}
require_once 'Route.php';
require_once 'vfsStream/vfsStream.php';
class RouteTest extends PHPUnit_Framework_TestCase {
public function setUp() {
// intiialize stuff before each test
}
public function tearDown() {
// clean up ...
}
setUp
方法在此测试类中的每个测试方法之前执行。以及执行测试方法后的
tearDown
方法。
public function setUp() {
$edit_php = <<<EDIT_PHP
<?php
class edit {
public function get() {
return __METHOD__ . "()";
}
public function post() {
return __METHOD__ . "()";
}
}
EDIT_PHP;
$company_php = <<<COMPANY_PHP
<?php
class company {
public function get(\$id = null) {
return __METHOD__ . "(\$id)";
}
}
COMPANY_PHP;
$this->root = vfsStream::setup('controllers', null, Array(
'admin' => Array(
'company' => Array(
'edit.php' => $edit_php
),
'company.php' => $company_php
)
));
}
public function tearDown() {
unset($this->root);
}
vfsStream::setup()
现在创建一个具有给定文件结构和给定文件内容的虚拟目录。
public function testSimpleDirectMethodAccess() {
$this->assertEquals("edit::get()", Route(vfsStream::url('controllers'), '/controllers/admin/company/edit/get', 'get'));
}
$ phpunit test.php
PHPUnit 3.7.13 by Sebastian Bergmann.
...
Fatal error: Class 'edit.php.php' not found in C:\xampp\htdocs\r\Route.php on line 27
$class
变量有问题。如果我们现在使用调试器(或一些
echo
s)检查route函数中的以下行。
$class = basename($controller . '.php');
$controller
变量保存了正确的文件名,但是为什么会附加一个
.php
?
$class = basename($controller, '.php');
edit
。
/**
* @expectedException Exception
* @expectedMessage /random-route-to-the/void
*/
public function testForInexistentRoute() {
Route(vfsStream::url('controllers'), '/random-route-to-the/void', 'get');
}
Exception
类型的异常,以及异常消息是否
/random-route-to-the/void
$request_method
参数是否正常工作。
public function testMethodAccessByHTTPMethod() {
$this->assertEquals("edit::get()", Route(vfsStream::url('controllers'), '/admin/company/edit', 'get'));
$this->assertEquals("edit::post()", Route(vfsStream::url('controllers'), '/admin/company/edit', 'post'));
}
$ phpunit test.php
PHPUnit 3.7.13 by Sebastian Bergmann.
....
Fatal error: Cannot redeclare class edit in vfs://controllers/admin/company/edit.php on line 2
include
/
require
。
require($controller);
require_once($controller);
company
和文件
company.php
是否相互干扰。
$this->assertEquals("company::get()", Route(vfsStream::url('controllers'), '/admin/company', 'get'));
$this->assertEquals("company::get()", Route(vfsStream::url('controllers'), '/admin/company/get', 'get'));
$ phpunit test.php
PHPUnit 3.7.13 by Sebastian Bergmann.
.....E.
Time: 0 seconds, Memory: 2.00Mb
There was 1 error:
1) RouteTest::testControllerWithSubControllers
Exception: /admin/company
C:\xampp\htdocs\r\Route.php:32
C:\xampp\htdocs\r\test.php:69
FAILURES!
Tests: 7, Assertions: 10, Errors: 1.
while ((is_null($segment = array_shift($segments)) !== true)
&& (is_dir($root . $controller . $segment . '/'))) {
$controller .= $segment . '/';
}
function Route($root, $request_uri, $request_method) {
$segments = array_filter(explode('/', $request_uri), 'strlen');
if ((count($segments) == 0) || (is_dir($root) === false)) {
return true; // serve index
}
$all_segments = array_values($segments);
$segments = $all_segments;
$directory = $root . '/';
do {
$segment = array_shift($segments);
if(is_file($controller = $directory . $segment . ".php")) {
$class = basename($controller, '.php');
$method = isset($segments[0]) ? $segments[0] : $request_method;
require_once($controller);
if (method_exists($class = new $class(), $method)) {
return call_user_func_array(array($class, $method), array_slice($segments, 1));
}
}
$directory .= $segment . '/';
} while(is_dir($directory));
throw new Exception('/' . implode('/', $all_segments), 404); // serve 404
}
关于php - HMVC路由中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14592181/
目前我正在使用codeigniter 3.0版。我想知道如何在其中实现 HMVC 结构,有人可以帮忙吗? 最佳答案 codeigniter 3 hmvc 模块文件夹用于: https://bitbuc
背景 我使用小部件这个词作为一个局部 View ,它有自己的 Controller (所以它自己的 Action ),它几乎被放置在所有页面中。我通过 HMVC 实现了这个渲染,这很棒。 问题 现在,
我是 Codeigniter 的新手,我正在考虑在我的新项目中使用这个框架。我将需要这两个扩展。在深入研究之前,我想知道是否有人已经使用过它们,并且可以就它们一起使用时是否存在任何兼容性问题提供一些见
我正在使用的PHP框架(Kohana)最近实现了HMVC架构。我读过它是一个分层的 mvc,其中请求是在彼此之上发出的。它有点像ajax,只是纯粹的服务器端。我已经在一些实验中应用了它,但我无法将它应
我做了模块评论,它需要我的自定义助手才能工作,我如何将助手存储在模块文件夹而不是应用程序/助手中? 最佳答案 我相信您可以在 module 目录中创建一个 helpers 文件夹,然后像往常一样加载它
我通过wiredesignz 安装了HMVC,但路由来自application/modules/xxx/config/routes.php根本没有得到认可。 这是一个例子: 在 application
我正在开发基于 Codeigniter + HMVC 的应用程序,并且正在尝试添加一个新模块。我使用 Phil Sturgeon 的 REST_Controller 2.6.0 和 格式库以将 RES
首先,很抱歉这篇文章带来的任何便利,因为这是我第一次在这里发布问题,我需要更多时间来适应这个问题。 Q1。我想为 创建 2 个“主 Controller ”前端 和 后台 像这样: MY_ Contr
我已经敲了 5 个小时的头,终于解决了问题,但我就是在不知道原因的情况下无法休眠。让我先解释一下这个问题。 我使用了 codeigniter HMVC 扩展并将 ion_auth 作为单独的模块安装。
我的问题需要一些帮助。我有一个用户列表,我想在 CI HMVC 中使用 ajax 删除用户 onclick 删除按钮。这是我的 ListView 的代码 $(function() { $(".
我最近尝试为 Code igniter 2.2.1 实现 wiredesignz hmvc 模块化扩展,位于 https://bitbucket.org/wiredesignz/codeigniter
我的配置中有数组,我将其用于 foreach。它工作正常,但我如何从任何模块获取参数。例如我希望参数 1 为 custom/custom/index。 谢谢您的回复 $config['modules'
我是 HMVC Codeigniter 的新手。我会使用 codeigniter 对 codeigniter 的 HMVC 格式进行表单验证,但它没有显示任何效果,这意味着 formvalidatio
好的,所以 HMVC in Codeigniter是scalable web applications (with Kohana 3)的方法基于许多 stackoverflow 讨论,例如 HMVC
我正在使用 CI 2.0.2 并使用 5.4 模块化扩展.. 我有用户作为默认 Controller 。 class User extends CI_Controller{ public funct
是否可以在 Zend Framework 中使用 HMVC 模式?它默认在 Kohana 3 中实现,我非常喜欢它,所以现在我想在 Zend Framework 中使用它。 编辑 我想让它成为可能:1
我已将 codeigniter 项目从本地主机迁移到服务器,但面临“内部服务器错误 (500)”问题。 (我压缩了整个项目目录并在服务器上提取)我已尝试解决此问题。 将 index.html 文件放在
我希望在 CodeIgniter 中使用 HMVC 创建桌面版和移动版网站。 这类似于这个问题: Mobile and desktop web app with codeigniter 但不同之处在于
阅读 Kohana 的文档,我发现 3.0 版本的主要区别在于它遵循 HMVC 模式,而不是像 2.x 版本那样遵循 MVC。 Kohana 的文档和维基百科上关于此的页面并没有真正给我一个明确的想法
我正在尝试实现 CodeIgniter 样式的文件夹结构以在 Laravel 中使用 HMVC。我正在关注 this教程。但是我无法路由到模块文件夹内的 Controller 。我当前的 Larave
我是一名优秀的程序员,十分优秀!