ホームページ  >  記事  >  php教程  >  マイナー [PHP フレームワーク] 3. ルーティング、コントローラー、ビュー

マイナー [PHP フレームワーク] 3. ルーティング、コントローラー、ビュー

WBOY
WBOYオリジナル
2016-06-20 08:42:151340ブラウズ

3.1 ルーティング

本格的な Web アプリケーションにはきれいな URL が絶対に必要です。これにより、index.php?article_id=57 のような醜い URL が非表示になり、代わりに /read/intro-to -symfony のようなより一般的な URL に置き換えられます。

3.1.1 ルーティング設定

設定ファイルは app/Config/routes.php です

<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> [
  </span>'/demo/{productName}'            =><span style="color: #000000;">  [
        </span>'name'                =>    'test1',
        'controller'        =>    'App\Modules\Demo\Controller\FooController',
        'action'            =>    'bar',
        'required'          =>  ['productName' => '\w+'],<span style="color: #000000;">
    ]</span>,<span style="color: #000000;">
];</span>

上記のコードを例として、エレガントな (laravel 病...) ルーティングを構成する方法を詳しく説明します

'/demo/{productName}' は、ルーティングの一致ルールです。構成内の required は、productName が満たさなければならない通常の条件を指定します。フレームワークの実際の動作中に、ルーティング ルール + required が通常のルールに解析されます。 /demo/(w+) 、URL (例: xxx.xxx.xxx/demo/testproduct) がこの規則に一致すると、設定内のコントローラーのアクションが実行されます: FooController->。 ;bar($ 製品名);

ルーティング ルールの中括弧 (productName) の内容が bar メソッドのパラメーターであることがわかります。したがって、ルートを照合するときは、ルーティング ルールが特定のコントローラー メソッドのパラメーターの数と一致している必要があることに注意してください。一致しないと、ControllerException がスローされます。

3.1.2 デフォルトのルーティング設定

コントローラーを定義するたびにルートを設定する必要があると、開発効率が低下します。この問題の発生を防ぐために、マイナーではデフォルトのルーティング機構が提供されます。 http://xxx.xxx.xxx/demo/foo/bar にアクセスすると、AppModulesDemoFooController の bar メソッドが実行されます。つまり、デフォルト ルートは次のとおりです:

http://xxx.xxx.xxx/{モジュール名}/{コントローラ名}/{メソッド名}

3.1.3 デメリット

ご覧のとおり、マイナーのルーティングは強力ではありません。リクエストメソッドの制限、HTTPS の制限、およびフィルターはサポートされていません。

3.2 コントローラー

3.2.1 独自のコントローラーを作成する

Controllerの定義は非常にシンプルで、MinorControllerController基本クラスを継承するだけです(もちろん継承する必要はありませんが、基本クラス内のメソッドやプロパティは使用できませんのでわかりやすいです)。フォルダー app/Modules/Demo/Controller/ を作成し、ファイル FooController.php:

を作成します。
<?<span style="color: #000000;">php
namespace App\Modules\Demo\Controller;

</span><span style="color: #0000ff;">use</span><span style="color: #000000;"> Minor\Controller\Controller;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义一个控制器</span>
<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义一个方法   </span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
        </span><span style="color: #0000ff;">return</span> 'Hello World'<span style="color: #000000;">;
    }
}</span>

xxx.xxx.xxx/demo/foo/bar (デフォルトルート、独自ルート設定も可能) にアクセスすると、Hello World が返されることがわかります。

3.2.2 URL 生成

URL の gen メソッドを呼び出すと、デフォルトのパスをルーティング ルールに準拠する URL に変換できます

<span style="color: #800080;">$url</span> = Url:gen(<span style="color: #800080;">$path</span>);

Url::gen('/demo/foo/bar?productName=test') が 3.1.1 のルーティングに従って設定されている場合、/demo/test が返されます。

3.2.3 ページジャンプリダイレクト、前方リダイレクト

マイナーには、redirect、forward、forwardUrl という 3 つのジャンプ メソッドが用意されています (これら 3 つは、MinorControllerController の保護されたメソッドです)。

別の URL にジャンプする場合、コントローラーで次のように呼び出すことができます: $this->redirect($url);

別の URL にリダイレクトする場合、コントローラー内で次のように呼び出すことができます: $this->forwardUrl($url); (このメソッドの実装は、実際には、次のように URL リクエストのコントローラーとメソッドを解析します。次に、forward($controller, $action, $param))

を呼び出します。

別のメソッドに転送する場合、コントローラー内で次のように呼び出すことができます: $this->forward($controller, $action, $params); (パラメーター $controller は、以下を含むコントローラーのクラス名です。名前空間)

例:

<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
        </span><span style="color: #800080;">$this</span>->redirect('www.baidu.com'<span style="color: #000000;">);
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->forward('App\Modules\Demo\Controller\FooController', 'bar', 'test'<span style="color: #000000;">);
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->forward('/demo/testpro'<span style="color: #000000;">);
    }
}    </span>

3.2.4 リクエストパラメータの取得

MinorRequest の get($paramName, $defaultParamValue = null) メソッドまたは post($paramName, $defaultParamValue = null) メソッドを呼び出して、リクエスト メソッドを取得します。コントローラー内で次のように呼び出すことができます。

<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
       $minorRequest = <span style="color: #800080;">$this->app->getMinorRequest()</span>; </span><br>    $paramValue = <span style="color: #000000;">$minorRequest</span>->get('paramKey', 'defaultValue'<span style="color: #000000;">);<br>    ...
    }
}   </span>

3.2.5 リクエストメソッドの取得

MinorRequest の getMethod() メソッドを呼び出して、要求されたメソッドを取得します。

<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
       </span><span style="color: #800080;">$minorRequest</span> = <span style="color: #800080;">$this</span>->app-><span style="color: #000000;">getMinorRequest(); 
    </span><span style="color: #800080;">$method</span> = <span style="color: #800080;">$minorRequest</span>-><span style="color: #000000;">getMethod();
    </span>...<span style="color: #000000;">
    }
}  </span>

 

3.3 视图

  Minor提供了一个极其强大的模板引擎,这个模板引擎的名称就是: PHP。是的!你没看错就是PHP。为什么Minor不提供一个类似于smarty或者Twig这样的模板引擎呢? 因为没有必要,PHP本身已经足够好了,如果Minor再造一个模板引擎无疑就会使Minor更难上手,所以Minor直接使用PHP作为视图文件的语言。

  3.3.1 在控制器中使用视图

  在控制器中使用视图只需要调用View::render('模块名:控制器名:视图文件名', ['param1key' => 'param1value', 'param2key' => 'param2value' ...]);例:

<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
        </span><span style="color: #800080;">$param1</span> = 'Hello'<span style="color: #000000;">;
        </span><span style="color: #800080;">$param2</span> = 'World'<span style="color: #000000;">; 
        </span><span style="color: #0000ff;">return</span> View::render('Demo:Foo:bar.php', ['param1' => <span style="color: #800080;">$param1</span>, 'param2' => <span style="color: #800080;">$param2</span><span style="color: #000000;">]);
    }
}  </span>

  render函数的第二个参数(['param1key' => 'param1value', 'param2key' => 'param2value' ...])就是向视图文件中传递的变量,我们可以在视图文件中使用这些变量:

文件:app/Modules/Demo/Controller/Tpl/Foo/bar.php<br><?php echo $param1key;?><br><?=$param2key ?>

  3.3.2 视图内置函数

  Minor提供了两个视图文件中可以使用的函数:

<span style="color: #0000ff;">function</span> include_tpl(<span style="color: #800080;">$module</span>, <span style="color: #800080;">$controller</span>, <span style="color: #800080;">$tpl</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">require_once</span> (!<span style="color: #008080;">defined</span>('APP_DIR') ? APP_DIR : <span style="color: #008080;">realpath</span>(__DIR__ . '/../../app/') .DIRECTORY_SEPARATOR) . 'Modules' . '/' . <span style="color: #800080;">$module</span> . '/Tpl/' . <span style="color: #800080;">$controller</span> . '/' . <span style="color: #800080;">$tpl</span><span style="color: #000000;">;
}

</span><span style="color: #0000ff;">function</span> url(<span style="color: #800080;">$path</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">return</span> Url::gen(<span style="color: #800080;">$path</span><span style="color: #000000;">);
}</span>

  使用:

<span style="color: #000000;">html>   
    </span><span style="color: #0000ff;"><?</span><span style="color: #ff00ff;">php include_tpl('Public', 'Public', 'header.php');</span><span style="color: #0000ff;">?></span> 
    <span style="color: #0000ff;"><</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span>
        <span style="color: #0000ff;"><</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">></span>Hello!<span style="color: #0000ff;"></</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">></span>
        <span style="color: #0000ff;"><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="<?php url('/demo/foo/bar?productName=testpro');?>"</span><span style="color: #0000ff;">></span>
    <span style="color: #0000ff;"></</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"></</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>

  这两个函数定义在app/Resource/functions.php文件中,你可以在这个文件中自定义你需要的视图函数。

 

3.4 响应

  可以在控制器中通过调用App对象的getMinorResponse()方法来获取当前MinorResponse对象。 MinorResponse类提供了六个方法分别是:

<span style="color: #000000;">public function send(); // 用于将响应对象发送给客户端

public function setHeader($header);// 设置响应头

public function setContent($content); // 设置响应对象的内容

public function beforeContent($content); // 在当前已有的内容之前添加内容

public function appendContent($content); // 在当前已有内容之后追加内容

public function getContent(); // 获取对象中的响应内容</span>

 

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHP学習、シンプルなカレンダー(1)次の記事:PHP学習、シンプルなカレンダー(1)

関連記事

続きを見る