접근 방법으로는 CodeIgniter 또는 다른 MVC 프레임 워크와 비슷한 방법을 사용합니다 (그러나 더 간단합니다).
그래서 먼저 스키마를 고안해야한다, 내가 그 뜻은 그런 다음 URL을 구문 분석가는 라우터를 구축 할 것이
www.yoursite.com/index.php/{controller}/{method}/args ...
같은 것입니다. 나는 너에게 편지를 쓸 수는 있지만 1 분 정도 걸릴 것이다.
SimpleRouter.php
/**
* A simple 1 level router
*
* URL schema is http://example.com/{controller}/{method}/{args ... }
*
* @author ArtisticPhoenix
* @package SimpleRouter
*/
class SimpleRouter{
/**
* should be the same as rewrite base in .htaccess
* @var string
*/
const REWRITE_BASE = '/MISC/Router/';
/**
* path to controller files
*
* @var string
*/
const CONTOLLER_PATH = __DIR__.'/Controllers/';
/**
* route a url to a controller
*/
public static function route(){
//normalize
if(self::REWRITE_BASE != '/'){
$uri = preg_replace('~^'.self::REWRITE_BASE.'~i', '',$_SERVER['REQUEST_URI']);
}
$uri = preg_replace('~^index\.php~i', '',$uri);
$uri = trim($uri,'/');
//empty url, like www.example.com
if(empty($uri)) $uri = 'home/index';
//empty method like www.example.com/home
if(!substr_count($uri, '/')) $uri .= '/index';
$arrPath = explode('/', $uri);
$contollerName = array_shift($arrPath);
$methodName = array_shift($arrPath);;
$contollerFile = self::CONTOLLER_PATH.$contollerName.'.php';
if(!file_exists($contollerFile)){
//send to error page
self::error404($uri);
return;
}
require_once $contollerFile;
if(!class_exists($contollerName)){
self::error404($uri);
return;
}
$Controller = new $contollerName();
if(!method_exists($Controller, $methodName)){
self::error404($uri);
return;
}
if(!count($arrPath)){
call_user_func([$Controller, $methodName]);
}else{
call_user_func_array([$Controller, $methodName], $arrPath);
}
}
/**
* call error 404
*
* @param string $uri
*/
protected static function error404($uri){
require_once self::CONTOLLER_PATH.'home.php';
$Controller = new home();
$Controller->error404($uri);
}
}
기본 컨트롤러 홈 :
UPDATE
당신은 내 GitHub의 페이지 here
에 그러나 여기에 refrence 위해 그것을 찾을 수 있습니다 코드입니다. PHP
/**
*
* The default controller
*
* @author ArtisticPhoenix
* @package SimpleRouter
*/
class home{
public function index($arg=false){
echo "<h3>".__METHOD__."</h3>";
echo "<pre>";
print_r(func_get_args());
}
public function otherpage($arg){
echo "<h3>".__METHOD__."</h3>";
echo "<pre>";
print_r(func_get_args());
}
public function error404($uri){
header('HTTP/1.0 404 Not Found');
echo "<h3>Error 404 page {$uri} not found</h3>";
}
}
2 컨트롤러 (예) user.php
/**
*
* An example users router
*
* @author ArtisticPhoenix
* @package SimpleRouter
*/
class user{
public function index(){
echo "<h3>".__METHOD__."</h3>";
}
public function login(){
echo "<h3>".__METHOD__."</h3>";
}
}
재 작성 (제거의 index.php) htaccess로 내가 갔다
require_once __DIR__.'/SimpleRouter.php';
SimpleRouter::route();
index.php를 마지막으로
RewriteEngine On
# For sub-foder installs set your RewriteBase including trailing and leading slashes
# your rewrite base will vary, possibly even being/if no sub-foder are involved
RewriteBase /MISC/Router/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
라우터에 static
전화를 걸면 간단한 일을 유지할 수 있습니다. 이런 식으로 클래스의 인스턴스가 필요하지 않습니다. 어쨌든 2 가지 방법 (1 공개) 만 있습니다.
단일 레벨 라우터로 구축했는데, 그게 바로 Controllers/user.php
대신 Controllers/user/home.php
같은 컨트롤러를 하위 폴더에 둘 수 없다는 것을 의미합니다. 중소 규모 사이트의 경우이 값이 적절해야하지만 다양한 대규모 사이트의 경우 컨트롤러를 중첩하는 것이 바람직 할 수 있습니다. 그러나 이것으로 인해 복잡성이 추가됩니다.
개별적으로 경로를 만드는 대신이 방법의 장점이 분명해야합니다. 라우트 (url)가 내가 설명한 간단한 스키마를 따르는 한 코드를 만질 필요가 없습니다.또한 기능별로 사이트 섹션을 자체 파일로 구성 할 수 있습니다. 예를 들어 컨트롤러는 user.php
입니다. 로그인, 프로필, 로그 아웃 페이지 등과 같은 모든 기능을 한 곳에 넣을 수 있습니다.
member.php
컨트롤러를 추가하려면 기록하려는 모든 항목을 기록 할 수 있습니다 사용자가 있습니다. 그리고 그 컨트롤러의 __construct
메소드에서 현재 세션이 로그인되어 있는지, 그리고 그 파일에 대한 모든 메소드를 포함하고 있는지 확인합니다.
URL 스키마는 http://example.com/{controller}/{method}/{args ... }
입니다. 그러나 당신은 또한 http://example.com/index.php/{controller}/{method}/{args ... }
과 같은 URL을 사용할 수 있습니다. 나는 URL에서 index.php
의 제거를 허용하는 모 재 작성을 사용하고, 그래서 당신은 그이없는 경우는 URL에 index.php
을 넣어 (또는 다른 수단에 의해 제거)
REWRITE_BASE을 내 로컬 테스트 서버에서 가상 호스트를 설정하는 것을 게으 르기 때문에 모든 폴더를 자체 폴더에 배치합니다. 그래서이 상수와 일치하는 .htaccess 값을 하위 폴더가 무엇이든간에 (아마 아무 것도 아닐지라도) 변경하고 싶을 것입니다. 여기에 하위 폴더 내에서 사용하는 방법에 대한 예제 만 남았습니다.
마지막으로 이것은 전통적인 MVC 아키텍처에서 C
입니다. 컨트롤러에서 "비즈니스 로직"을 수행하는 것을 피해야합니다. 컨트롤러에서 직접 HTML을 출력하지 않아야합니다 (예제에서이 작업을 수행 했음에도 불구하고). HTML을 출력하는 대신, Blade
또는 Twig
과 같은 템플릿 엔진을 사용하는 것이 좋습니다. "모델 (비즈니스 로직)"을 "뷰 (템플릿)"에 조인하는 "접착제"와 같은 컨트롤러를 생각해보십시오. 비즈니스 로직은 사용자 클래스 (대명사와 같은 대문자 U, 사용자 컨트롤러와 마찬가지로 소문자가 아닌)와 같을 것이며 사용자를위한 데이터베이스 기능을 처리합니다. 따라서 컨트롤러에 바로 코드를 삽입하는 대신 "사용자 모델"을 만들어 컨트롤러로 가져올 수 있습니다. 이것은 "옳은 길"이지만, 당연히 약간의 복잡성을 더합니다. 그러나 나중에 시간을 절약하는 것보다 훨씬 더 중요하다는 것을 알게 될 것입니다.지금
일부 예
404 오류 (부재중 노선)
기본 홈 페이지 : home::index()
http://example.com/home/index/hello
루트,887에에 home::index()
http://example.com/home/index
경로에 home::index()
http://example.com/home
경로에
http://example.com/
루트 home::index()
-
http://example.com/index.php
경로 home::index('hello','world')
-
http://example.com/home/index/hello/world
경로는 당신이 집에 대한 인수의 전체 경로를 넣어야 할 의미 바와 같이, 위의 코드는이 설명하기 위해 변경 될 수 있지만, 누락 된 페이지에 대한 몇 가지 영향이있다. 기본적으로 누락 된 페이지는 컨트롤러의 인수가됩니다. 따라서 http://example.com/user/foo
이 있다면 user::index('foo')
이 호출됩니다. 물론 이것 역시 설명 될 수 있지만 복잡성이 쌓이기 시작합니다.
http://example.com/home/otherpage
home::otherpage()
으로 라우팅되지만 누락 된 인수에 대한 경고를 발행합니다. home::otherpage('hello')
당신이 보는 경우
-
home::otherpage('hello')
http://example.com/index.php/home/otherpage/hello
경로에
에 user::index()
http://example.com/user/login
경로에
어떻게 외부 링크가 내부적으로 리디렉션됩니까? 실수로 링크를 내부로 변경하고 있습니까? 이게 뭐지? 내 .htaccess 파일에 FallbackResource index.php가 있습니다. 당신이 사용하는 .htaccess 규칙 중 일부를 공유 할 수 있습니까? 예를 들어 실제 이름 대신 'www.mysite.com'을 사용할 수있는 호스트와 같이 공개하기를 원하지 않는 것을 제거해야합니다. – ArtisticPhoenix
아주 작은 PHP는 괜찮지 만, 정의에 의해 다른 서버를 호출 할 때처럼 외부 요청을 내부적으로 처리해서는 안됩니다. IE. 당신은 그것을 이해하기에 충분한 정보를주지 않았습니다. – ArtisticPhoenix
FallbackResource index.php는 내 .htaccess 파일에서 index.php 파일을 사용하거나 폴백하도록 지시하는 유일한 코드입니다. .htaccess를 사용하는 대신 PHP를 사용하여 하드 코드를 작성하려고합니다. –