ドキュメント

目次

前のトピックへ

< Cookie 管理

次のトピックへ

メッセージのフラッシュ >

このページ

URL とパスを生成する

Phalcon\Mvc\Url は Phalcon アプリケーションに置いて、URL 生成を担うコンポーネントです。 ルーティングをベースにした、個々の URL を生成する能力があります。

ベース URI の設定

アプリケーションをインストールしたドキュメントルートのディレクトリの状況に応じて、ベース URI が必要になる場合があります。

例えば、ドキュメントルートが /var/www/htdocs であなたのアプリケーションが /var/www/htdocs/invo にインストールしてある場合、ベース URI は /invo/ になります。 VirtualHost を使っていたり、またはドキュメントルート直下にインストールしている場合、ベース URI は / になります。 Phalcon が検出しているベース URI を確認するため、下記のコードを実行しましょう。

<?php

use Phalcon\Mvc\Url;

$url = new Url();

echo $url->getBaseUri();

Phalcon は、デフォルトでは自動的にベース URI を検出します。 しかしアプリケーションのパフォーマンスを向上させたい場合は、設定を手動で行うことを推奨しています。

<?php

use Phalcon\Mvc\Url;

$url = new Url();

// ベース URI を相対的に設定
$url->setBaseUri("/invo/");

// ベース URI としてフルドメインを指定する
$url->setBaseUri("//my.domain.com/");

// ベース URI としてフルドメインを指定する
$url->setBaseUri("http://my.domain.com/my-app/");

通常、このコンポーネントは DI コンテナ内で登録されなければならないので、下記のように設定することもできます。

<?php

use Phalcon\Mvc\Url;

$di->set(
    "url",
    function () {
        $url = new Url();

        $url->setBaseUri("/invo/");

        return $url;
    }
);

URI の生成

もし、:doc:`ルーティング <routing>`のデフォルトの振る舞いを使用するならば、 あなたのアプリケーションのルーティングパターンは /:controller/:action/:params にすることができます。 従って、ルータ内部で定義しているあらゆるパターン含め、GET メソッドへ渡す文字列パターンも簡単に作ることができます。

<?php echo $url->get("products/save"); ?>

ベース URI を先頭につける必要が無いことに注意してください。名前をつけたルートであれば、動的に簡単に変更、作成ができます。 例えば、次のようなルートを持っていたとします。

<?php

$router->add(
    "/blog/{year}/{month}/{title}",
    [
        "controller" => "posts",
        "action"     => "show",
    ]
)->setName("show-post");

URL は次のような方法で生成することができます。

<?php

// 結果は /blog/2015/01/some-blog-post となります
$url->get(
    [
        "for"   => "show-post",
        "year"  => "2015",
        "month" => "01",
        "title" => "some-blog-post",
    ]
);

mod_rewrite を使用せずに URL を生成する

mod_rewrite を使用せずに URL を生成する場合も、このコンポーネントを使うことができます。

<?php

use Phalcon\Mvc\Url;

$url = new Url();

// $_GET["_url"] 内の URI を渡す
$url->setBaseUri("/invo/index.php?_url=/");

// 出力結果は /invo/index.php?_url=/products/save となります。
echo $url->get("products/save");

この際、$_SERVER["REQUEST_URI"] を使うことも可能です。

<?php

use Phalcon\Mvc\Url;

$url = new Url();

// $_GET["_url"] 内の URI を渡す
$url->setBaseUri("/invo/index.php?_url=/");

// $_SERVER["REQUEST_URI"] を使っ、マニュアルでハンドルが必要になります。て URI を渡す
$url->setBaseUri("/invo/index.php/");

この場合、ルーター内で要求した URI をマニュアルで対処する必要があります。

<?php

use Phalcon\Mvc\Router;

$router = new Router();

// ... ルートをマニュアルで定義する

$uri = str_replace($_SERVER["SCRIPT_NAME"], "", $_SERVER["REQUEST_URI"]);

$router->handle($uri);

結果のルートは下記のようになります

<?php

// 結果として /invo/index.php/products/save となります。
echo $url->get("products/save");

Volt での URL の生成

Volt 内部でこのコンポーネントを使って URL を生成するために url という関数を用意しています。

<a href="{{ url("posts/edit/1002") }}">Edit</a>

静的なルートが生成されます。

<link rel="stylesheet" href="{{ static_url("css/style.css") }}" type="text/css" />

静的な URI vs. 動的な URI

このコンポーネントは、同一アプリケーション内で異なるベース URI を設定することも許されています。

<?php

use Phalcon\Mvc\Url;

$url = new Url();

// 動的 URI
$url->setBaseUri("/");

// 静的リソースは CDN へ
$url->setStaticBaseUri("http://static.mywebsite.com/");

Phalcon\Tag は、このコンポーネントを使った動的・静的 URI の両方を要求します。

独自 URL ジェネレータの実装

Phalcon が提供している URL ジェネレータの代わりに独自で URL ジェネレータを作成する場合、 Phalcon\Mvc\UrlInterface インターフェースを必ず実装してください。

Follow along: