Phalcon 3

Routing




phalcon

يسمح لك مكون الموجه بتعريف المسارات التي تم تعيينها إلى وحدات تحكم أو معالجات يجب أن تتلقى الطلب. يقوم جهاز التوجيه ببساطة بتوزيع URI لتحديد هذه المعلومات. يحتوي جهاز التوجيه على وضعين: وضع MVC ووضع التطابق فقط. يعتبر الوضع الأول مثاليًا للعمل مع تطبيقات MVC.

تعريف المسارات

Phalcon\Mvc\Router إمكانيات توجيه متقدمة. في وضع MVC ، يمكنك تعريف المسارات وتعيينها إلى وحدات التحكم / الإجراءات التي تحتاجها. يتم تعريف الطريق على النحو التالي:

use Phalcon\Mvc\Router;

// Create the router
$router = new Router();

// Define a route
$router->add(
    "/admin/users/my-profile",
    [
        "controller" => "users",
        "action"     => "profile",
    ]
);

// Another route
$router->add(
    "/admin/users/change-password",
    [
        "controller" => "users",
        "action"     => "changePassword",
    ]
);

$router->handle();

المعلمة الأولى للأسلوب add() هي النمط الذي تريد مطابقته ، واختيارياً ، المعلمة الثانية هي مجموعة من المسارات. في هذه الحالة ، إذا كان URI / admin / users / my-profile ، فسيتم تنفيذ وحدة تحكم "المستخدمين" مع "ملف تعريف" الإجراء الخاص به. من المهم أن تتذكر أن جهاز التوجيه لا يقوم بتنفيذ وحدة التحكم والإجراء ، بل يقوم فقط بتجميع هذه المعلومات لإعلام المكون الصحيح (أي Phalcon\Mvc\Dispatcher ) بأن هذا هو جهاز التحكم / الإجراء الذي يجب تنفيذه.

يمكن أن يحتوي التطبيق على العديد من المسارات ، كما يمكن أن تكون المسارات المحددة واحدة تلو الأخرى مهمة مرهقة. في هذه الحالات ، يمكننا إنشاء طرق أكثر مرونة:

use Phalcon\Mvc\Router;

// Create the router
$router = new Router();

// Define a route
$router->add(
    "/admin/:controller/a/:action/:params",
    [
        "controller" => 1,
        "action"     => 2,
        "params"     => 3,
    ]
);

في المثال أعلاه ، نستخدم أحرف البدل لجعل المسار صالحًا للعديد من عناوين URI. على سبيل المثال ، من خلال الوصول إلى عنوان URL التالي (/ admin / users / a / delete / dave / 301) قد ينتج:

مراقب المستخدمين
عمل حذف
معامل ديف
معامل 301

يتلقى الأسلوب add() نمطًا يمكن أن يحتوي بشكل اختياري على عناصر نائبة محددة مسبقًا ومعدلات تعبير عادية. يجب أن تبدأ جميع أنماط التوجيه بحرف شرطة مائل للأمام (/). إن صيغة التعبير العادي المستخدمة هي نفس تعبيرات PCRE العادية . لاحظ أنه ، ليس من الضروري إضافة محددات التعبير العادية. جميع أنماط المسارات غير حساسة لحالة الأحرف.

تحدد المعلمة الثانية كيفية ربط الأجزاء المتطابقة مع المعلمات / الإجراء / المتحكم. الأجزاء المطابقة هي العناصر النائبة أو subpatterns محددة بواسطة الأقواس (بين قوسين دائمين). في المثال المعطى أعلاه ، فإن أول subpattern متطابق ( :controller ) هو جزء جهاز التحكم في المسار ، والثاني هو الإجراء وما إلى ذلك.

تساعد هذه العناصر النائبة في كتابة التعبيرات العادية التي تكون أكثر قابلية للقراءة للمطورين وسهلة الفهم. يتم استخدام العناصر النائبة التالية:

نائب تعبير عادي استعمال
/:module /([a-zA-Z0-9\_\-]+) تتطابق مع اسم وحدة نمطية صالح يحتوي على أحرف أبجدية رقمية فقط
/:controller /([a-zA-Z0-9\_\-]+) يطابق اسم وحدة تحكم صالحة بأحرف أبجدية رقمية فقط
/:action /([a-zA-Z0-9\_]+) يطابق اسم إجراء صالح مع أحرف أبجدية رقمية فقط
/:params (/.*)* تتطابق مع قائمة من الكلمات الاختيارية مفصولة بشرطة مائلة. لا تستخدم سوى هذا العنصر النائب في نهاية الطريق
/:namespace /([a-zA-Z0-9\_\-]+) يطابق اسم مساحة اسم مستوى واحد
/:int /([0-9]+) تتطابق مع معلمة عدد صحيح

أسماء camelized تحكم ، وهذا يعني أنه يتم إزالة الأحرف ( - ) و ( _ ) و الأحرف التالية الأحرف الكبيرة. على سبيل المثال ، يتم تحويل some_controller إلى SomeController.

نظرًا لأنه يمكنك إضافة العديد من المسارات حسب الحاجة باستخدام طريقة add() ، فإن الترتيب الذي يتم إضافة المسارات فيه يشير إلى ملاءمتها ، فإن أحدث المسارات المضافة لها صلة أكثر من الأولى التي تمت إضافتها. داخليًا ، يتم اجتياز جميع المسارات المحددة بترتيب عكسي حتى يعثر Phalcon\Mvc\Router المطابق لـ URI المعين ويقوم بمعالجتها ، بينما يتجاهل الباقي.

معلمات مع أسماء

يوضح المثال أدناه كيفية تعريف الأسماء لمعلمات المسار:

$router->add(
    "/news/([0-9]{4})/([0-9]{2})/([0-9]{2})/:params",
    [
        "controller" => "posts",
        "action"     => "show",
        "year"       => 1, // ([0-9]{4})
        "month"      => 2, // ([0-9]{2})
        "day"        => 3, // ([0-9]{2})
        "params"     => 4, // :params
    ]
);

في المثال أعلاه ، لا يحدد المسار جزء "وحدة التحكم" أو "الإجراء". يتم استبدال هذه الأجزاء بالقيم الثابتة ("المشاركات" و "عرض"). لن يعرف المستخدم وحدة التحكم التي يتم إرسالها بالفعل بواسطة الطلب. داخل وحدة التحكم ، يمكن الوصول إلى تلك المعلمات المسماة على النحو التالي:

use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function indexAction()
    {

    }

    public function showAction()
    {
        // Get "year" parameter
        $year = $this->dispatcher->getParam("year");

        // Get "month" parameter
        $month = $this->dispatcher->getParam("month");

        // Get "day" parameter
        $day = $this->dispatcher->getParam("day");

        // ...
    }
}

لاحظ أنه يتم الحصول على قيم المعلمات من المرسل. يحدث هذا لأنه المكون الذي يتفاعل أخيراً مع برامج تشغيل التطبيق الخاص بك. علاوة على ذلك ، هناك طريقة أخرى لإنشاء معلمات مسماة كجزء من النموذج:

$router->add(
    "/documentation/{chapter}/{name}.{type:[a-z]+}",
    [
        "controller" => "documentation",
        "action"     => "show",
    ]
);

يمكنك الوصول إلى قيمهم بالطريقة نفسها كما كان من قبل:

use Phalcon\Mvc\Controller;

class DocumentationController extends Controller
{
    public function showAction()
    {
        // Get "name" parameter
        $name = $this->dispatcher->getParam("name");

        // Get "type" parameter
        $type = $this->dispatcher->getParam("type");

        // ...
    }
}

جملة قصيرة

إذا كنت لا تحب استخدام مصفوفة لتعريف مسارات المسارات ، فهناك أيضًا بنية بديلة متاحة. الأمثلة التالية تنتج نفس النتيجة:

// Short form
$router->add(
    "/posts/{year:[0-9]+}/{title:[a-z\-]+}",
    "Posts::show"
);

// Array form
$router->add(
    "/posts/([0-9]+)/([a-z\-]+)",
    [
       "controller" => "posts",
       "action"     => "show",
       "year"       => 1,
       "title"      => 2,
    ]
);

خلط صفيف وقصيرة البناء

يمكن خلط المصفوفة والقواعد اللغوية القصيرة لتحديد مسار ، في هذه الحالة ، يتم إضافة المعلمات المسماة تلقائيًا إلى مسارات المسار وفقًا للموضع الذي تم تحديدها فيه:

// First position must be skipped because it is used for
// the named parameter 'country'
$router->add(
    "/news/{country:[a-z]{2}}/([a-z+])/([a-z\-+])",
    [
        "section" => 2, // Positions start with 2
        "article" => 3,
    ]
);

التوجيه إلى وحدات

يمكنك تحديد المسارات التي تتضمن مساراتها الوحدات النمطية. هذا هو مناسب خصيصا لتطبيقات متعددة الوحدات. من الممكن تحديد مسار افتراضي يتضمن حرف بدل وحدة نمطية:

use Phalcon\Mvc\Router;

$router = new Router(false);

$router->add(
    "/:module/:controller/:action/:params",
    [
        "module"     => 1,
        "controller" => 2,
        "action"     => 3,
        "params"     => 4,
    ]
);

في هذه الحالة ، يجب أن يحتوي المسار دائمًا على اسم الوحدة كجزء من عنوان URL. على سبيل المثال ، سيتم معالجة عنوان URL التالي: / admin / users / edit / sonny ، على النحو التالي:

وحدة مشرف
مراقب المستخدمين
عمل تصحيح
معامل ولد صغير

أو يمكنك ربط مسارات محددة بوحدات محددة:

$router->add(
    "/login",
    [
        "module"     => "backend",
        "controller" => "login",
        "action"     => "index",
    ]
);

$router->add(
    "/products/:action",
    [
        "module"     => "frontend",
        "controller" => "products",
        "action"     => 1,
    ]
);

أو ربطهم بمساحات أسماء محددة:

$router->add(
    "/:namespace/login",
    [
        "namespace"  => 1,
        "controller" => "login",
        "action"     => "index",
    ]
);

يجب أن يتم تمرير أسماء النطاقات / أسماء الفئات بشكل منفصل:

$router->add(
    "/login",
    [
        "namespace"  => "Backend\\Controllers",
        "controller" => "login",
        "action"     => "index",
    ]
);

قيود طريقة HTTP

عند إضافة مسار باستخدام ببساطة add() ، سيتم تمكين المسار لأي طريقة HTTP. في بعض الأحيان يمكننا تقييد المسار إلى طريقة معينة ، وهذا مفيد بشكل خاص عند إنشاء تطبيقات RESTful:

// This route only will be matched if the HTTP method is GET
$router->addGet(
    "/products/edit/{id}",
    "Products::edit"
);

// This route only will be matched if the HTTP method is POST
$router->addPost(
    "/products/save",
    "Products::save"
);

// This route will be matched if the HTTP method is POST or PUT
$router->add(
    "/products/update",
    "Products::update"
)->via(
    [
        "POST",
        "PUT",
    ]
);

باستخدام المحولين

يسمح لك المُحَوِّلون بتحويل معلمات المسار بحرية قبل تمريرها إلى المرسل. توضح الأمثلة التالية كيفية استخدامها:

// The action name allows dashes, an action can be: /products/new-ipod-nano-4-generation
$route = $router->add(
    "/products/{slug:[a-z\-]+}",
    [
        "controller" => "products",
        "action"     => "show",
    ]
);

$route->convert(
    "slug",
    function ($slug) {
        // Transform the slug removing the dashes
        return str_replace("-", "", $slug);
    }
);

هناك حالة استخدام أخرى للمُحسِلين وهي تجسيد نموذج في مسار. يسمح ذلك بنقل النموذج إلى الإجراء المحدد مباشرةً:

// This example works off the assumption that the ID is being used as parameter in the url: /products/4
$route = $router->add(
    "/products/{id}",
    [
        "controller" => "products",
        "action"     => "show",
    ]
);

$route->convert(
    "id",
    function ($id) {
        // Fetch the model
        return Product::findFirstById($id);
    }
);

مجموعات من الطرق

إذا كانت هناك مجموعة من المسارات تحتوي على مسارات مشتركة ، فيمكن تجميعها للحفاظ عليها بسهولة:

use Phalcon\Mvc\Router;
use Phalcon\Mvc\Router\Group as RouterGroup;

$router = new Router();

// Create a group with a common module and controller
$blog = new RouterGroup(
    [
        "module"     => "blog",
        "controller" => "index",
    ]
);

// All the routes start with /blog
$blog->setPrefix("/blog");

// Add a route to the group
$blog->add(
    "/save",
    [
        "action" => "save",
    ]
);

// Add another route to the group
$blog->add(
    "/edit/{id}",
    [
        "action" => "edit",
    ]
);

// This route maps to a controller different than the default
$blog->add(
    "/blog",
    [
        "controller" => "blog",
        "action"     => "index",
    ]
);

// Add the group to the router
$router->mount($blog);

يمكنك نقل مجموعات من المسارات لفصل الملفات من أجل تحسين المنظمة وإعادة استخدام الكود في التطبيق:

use Phalcon\Mvc\Router\Group as RouterGroup;

class BlogRoutes extends RouterGroup
{
    public function initialize()
    {
        // Default paths
        $this->setPaths(
            [
                "module"    => "blog",
                "namespace" => "Blog\\Controllers",
            ]
        );

        // All the routes start with /blog
        $this->setPrefix("/blog");

        // Add a route to the group
        $this->add(
            "/save",
            [
                "action" => "save",
            ]
        );

        // Add another route to the group
        $this->add(
            "/edit/{id}",
            [
                "action" => "edit",
            ]
        );

        // This route maps to a controller different than the default
        $this->add(
            "/blog",
            [
                "controller" => "blog",
                "action"     => "index",
            ]
        );
    }
}

ثم قم بتركيب المجموعة في جهاز التوجيه:

// Add the group to the router
$router->mount(
    new BlogRoutes()
);

طرق مطابقة

يجب أن يتم تمرير URI صالح إلى جهاز التوجيه بحيث يمكنه معالجته والعثور على مسار مطابق. بشكل افتراضي ، يتم أخذ URI للتوجيه من المتغير $_GET["_url"] الذي تم إنشاؤه بواسطة وحدة كتابة المحرك rewrite. وهناك قاعدتان لإعادة كتابة القواعد التي تعمل بشكل جيد مع Phalcon:

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

في هذا التكوين ، سيتم إرسال أي طلبات لملفات أو مجلدات غير موجودة إلى index.php.

يوضح المثال التالي كيفية استخدام هذا المكون في الوضع المستقل:

use Phalcon\Mvc\Router;

// Creating a router
$router = new Router();

// Define routes here if any
// ...

// Taking URI from $_GET["_url"]
$router->handle();

// Or Setting the URI value directly
$router->handle("/employees/edit/17");

// Getting the processed controller
echo $router->getControllerName();

// Getting the processed action
echo $router->getActionName();

// Get the matched route
$route = $router->getMatchedRoute();

تسمية الطرق

يتم تخزين كل توجيه تتم إضافته إلى جهاز التوجيه داخليًا ككائن Phalcon\Mvc\Router\Route . يشمل هذا الفصل كل تفاصيل كل طريق. على سبيل المثال ، يمكننا إعطاء اسم لمسار لتحديده بشكل فريد في طلبنا. هذا مفيد بشكل خاص إذا كنت ترغب في إنشاء عناوين URL منه.

$route = $router->add(
    "/posts/{year}/{title}",
    "Posts::show"
);

$route->setName("show-posts");

ثم ، على سبيل المثال ، باستخدام المكون Phalcon\Mvc\Url يمكننا إنشاء مسارات من اسمه:

// Returns /posts/2012/phalcon-1-0-released
echo $url->get(
    [
        "for"   => "show-posts",
        "year"  => "2012",
        "title" => "phalcon-1-0-released",
    ]
);

أمثلة الاستخدام

فيما يلي أمثلة على طرق مخصصة:

// Matches "/system/admin/a/edit/7001"
$router->add(
    "/system/:controller/a/:action/:params",
    [
        "controller" => 1,
        "action"     => 2,
        "params"     => 3,
    ]
);

// Matches "/es/news"
$router->add(
    "/([a-z]{2})/:controller",
    [
        "controller" => 2,
        "action"     => "index",
        "language"   => 1,
    ]
);

// Matches "/es/news"
$router->add(
    "/{language:[a-z]{2}}/:controller",
    [
        "controller" => 2,
        "action"     => "index",
    ]
);

// Matches "/admin/posts/edit/100"
$router->add(
    "/admin/:controller/:action/:int",
    [
        "controller" => 1,
        "action"     => 2,
        "id"         => 3,
    ]
);

// Matches "/posts/2015/02/some-cool-content"
$router->add(
    "/posts/([0-9]{4})/([0-9]{2})/([a-z\-]+)",
    [
        "controller" => "posts",
        "action"     => "show",
        "year"       => 1,
        "month"      => 2,
        "title"      => 3,
    ]
);

// Matches "/manual/en/translate.adapter.html"
$router->add(
    "/manual/([a-z]{2})/([a-z\.]+)\.html",
    [
        "controller" => "manual",
        "action"     => "show",
        "language"   => 1,
        "file"       => 2,
    ]
);

// Matches /feed/fr/le-robots-hot-news.atom
$router->add(
    "/feed/{lang:[a-z]+}/{blog:[a-z\-]+}\.{type:[a-z\-]+}",
    "Feed::get"
);

// Matches /api/v1/users/peter.json
$router->add(
    "/api/(v1|v2)/{method:[a-z]+}/{param:[a-z]+}\.(json|xml)",
    [
        "controller" => "api",
        "version"    => 1,
        "format"     => 4,
    ]
);
احذر من الأحرف المسموح بها في التعبير العادي عن وحدات التحكم والمساحات. حيث أن هذه الأسماء تصبح أسماء فئات وبالتالي يمكن أن يتم تمريرها من خلال نظام الملفات من قبل المهاجمين لقراءة ملفات غير مصرح بها. التعبير العادي الآمن هو: /([a-zA-Z0-9\_\-]+)

السلوك الافتراضي

Phalcon\Mvc\Router على سلوك افتراضي يوفر توجيهًا بسيطًا للغاية يتوقع دائمًا عنوان URI مطابقًا للنمط التالي: /: controller /: action /: params

على سبيل المثال ، بالنسبة إلى عنوان URL مثل http://phalconphp.com/documentation/show/about.html ، سيترجم هذا الموجه على النحو التالي:

مراقب كابل بيانات
عمل تبين
معامل about.html

إذا كنت لا تريد أن يكون لهذا الموجه هذا السلوك ، فيجب عليك إنشاء جهاز التوجيه تمرير false أول:

use Phalcon\Mvc\Router;

// Create the router without default routes
$router = new Router(false);

ضبط الطريق الافتراضي

عندما يتم الوصول إلى التطبيق الخاص بك دون أي مسار ، يتم استخدام المسار "/" لتحديد المسارات التي يجب استخدامها لعرض الصفحة الأولية في موقع الويب / التطبيق:

$router->add(
    "/",
    [
        "controller" => "index",
        "action"     => "index",
    ]
);

لا توجد مسارات

في حالة عدم مطابقة أي من المسارات المحددة في جهاز التوجيه ، يمكنك تحديد مجموعة من المسارات لاستخدامها في هذا السيناريو:

// Set 404 paths
$router->notFound(
    [
        "controller" => "index",
        "action"     => "route404",
    ]
);

هذا هو عادة لصفحة خطأ 404.

ضبط المسارات الافتراضية

من الممكن تحديد القيم الافتراضية للوحدة أو وحدة التحكم أو الإجراء. عندما يفقد المسار أيًا من تلك المسارات ، يمكن أن يتم تعبئته تلقائيًا بواسطة جهاز التوجيه:

// Setting a specific default
$router->setDefaultModule("backend");
$router->setDefaultNamespace("Backend\\Controllers");
$router->setDefaultController("index");
$router->setDefaultAction("index");

// Using an array
$router->setDefaults(
    [
        "controller" => "index",
        "action"     => "index",
    ]
);

التعامل مع مائلة / زائدة مائلة

في بعض الأحيان يمكن الوصول إلى مسار مع خطوط مائلة إضافية / لاحقة. هذه المائلة الإضافية تؤدي إلى إنتاج حالة غير موجودة في المرسل. يمكنك إعداد جهاز التوجيه لإزالة الشقوق المائلة تلقائيًا من نهاية مسار المعالجة:

use Phalcon\Mvc\Router;

$router = new Router();

// Remove trailing slashes automatically
$router->removeExtraSlashes(true);

أو يمكنك تعديل مسارات محددة لقبول الشُرط المائلة الزائدة اختياريًا:

// The [/]{0,1} allows this route to have optionally have a trailing slash
$router->add(
    "/{language:[a-z]{2}}/:controller[/]{0,1}",
    [
        "controller" => 2,
        "action"     => "index",
    ]
);

مباراة رد الاتصال

في بعض الأحيان ، لا يجب مطابقة المسارات إلا إذا كانت تستوفي شروطًا محددة. يمكنك إضافة شروط تعسفية إلى المسارات باستخدام beforeMatch() الاتصال beforeMatch() . إذا عرضت هذه الدالة false ، فسيتم التعامل مع المسار على أنه غير مطابق:

$route = $router->add("/login",
    [
        "module"     => "admin",
        "controller" => "session",
    ]
);

$route->beforeMatch(
    function ($uri, $route) {
        // Check if the request was made with Ajax
        if (isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && $_SERVER["HTTP_X_REQUESTED_WITH"] === "XMLHttpRequest") {
            return false;
        }

        return true;
    }
);

يمكنك إعادة استخدام هذه الشروط الإضافية في الفصول الدراسية:

class AjaxFilter
{
    public function check()
    {
        return $_SERVER["HTTP_X_REQUESTED_WITH"] === "XMLHttpRequest";
    }
}

واستخدم هذه الفئة بدلاً من الوظيفة المجهولة:

$route = $router->add(
    "/get/info/{id}",
    [
        "controller" => "products",
        "action"     => "info",
    ]
);

$route->beforeMatch(
    [
        new AjaxFilter(),
        "check"
    ]
);

اعتبارا من فالكون 3 ، هناك طريقة أخرى للتحقق من هذا:

$route = $router->add(
    "/login",
    [
        "module"     => "admin",
        "controller" => "session",
    ]
);

$route->beforeMatch(
    function ($uri, $route) {
        /**
         * @var string $uri
         * @var \Phalcon\Mvc\Router\Route $route
         * @var \Phalcon\DiInterface $this
         * @var \Phalcon\Http\Request $request
         */
        $request = $this->getShared("request");

        // Check if the request was made with Ajax
        return $request->isAjax();
    }
);

قيود اسم المضيف

يسمح لك جهاز التوجيه بتعيين قيود اسم المضيف ، وهذا يعني أنه يمكن تقييد المسارات المحددة أو مجموعة من المسارات بحيث تتطابق فقط إذا كان المسار يستوفي أيضًا قيد اسم المضيف:

$route = $router->add(
    "/login",
    [
        "module"     => "admin",
        "controller" => "session",
        "action"     => "login",
    ]
);

$route->setHostName("admin.company.com");

يمكن أيضًا تمرير اسم المضيف كتعبيرات عادية:

$route = $router->add(
    "/login",
    [
        "module"     => "admin",
        "controller" => "session",
        "action"     => "login",
    ]
);

$route->setHostName("([a-z]+).company.com");

في مجموعات المسارات ، يمكنك إعداد قيد اسم مضيف ينطبق على كل مسار في المجموعة:

use Phalcon\Mvc\Router\Group as RouterGroup;

// Create a group with a common module and controller
$blog = new RouterGroup(
    [
        "module"     => "blog",
        "controller" => "posts",
    ]
);

// Hostname restriction
$blog->setHostName("blog.mycompany.com");

// All the routes start with /blog
$blog->setPrefix("/blog");

// Default route
$blog->add(
    "/",
    [
        "action" => "index",
    ]
);

// Add a route to the group
$blog->add(
    "/save",
    [
        "action" => "save",
    ]
);

// Add another route to the group
$blog->add(
    "/edit/{id}",
    [
        "action" => "edit",
    ]
);

// Add the group to the router
$router->mount($blog);

مصادر URI

بشكل افتراضي ، يتم الحصول على معلومات URI من المتغير $_GET["_url"] ، يتم تمرير هذا بواسطة Rewrite-Engine إلى Phalcon ، يمكنك أيضًا استخدام $_SERVER["REQUEST_URI"] إذا لزم الأمر:

use Phalcon\Mvc\Router;

// ...

// Use $_GET["_url"] (default)
$router->setUriSource(
    Router::URI_SOURCE_GET_URL
);

// Use $_SERVER["REQUEST_URI"]
$router->setUriSource(
    Router::URI_SOURCE_SERVER_REQUEST_URI
);

أو يمكنك تمرير URI يدويًا إلى طريقة handle() :

$router->handle("/some/route/to/handle");

اختبار مساراتك

نظرًا لعدم وجود تبعيات لهذا المكون ، يمكنك إنشاء ملف كما هو موضح أدناه لاختبار مساراتك:

use Phalcon\Mvc\Router;

// These routes simulate real URIs
$testRoutes = [
    "/",
    "/index",
    "/index/index",
    "/index/test",
    "/products",
    "/products/index/",
    "/products/show/101",
];

$router = new Router();

// Add here your custom routes
// ...

// Testing each route
foreach ($testRoutes as $testRoute) {
    // Handle the route
    $router->handle($testRoute);

    echo "Testing ", $testRoute, "<br>";

    // Check if some route was matched
    if ($router->wasMatched()) {
        echo "Controller: ", $router->getControllerName(), "<br>";
        echo "Action: ", $router->getActionName(), "<br>";
    } else {
        echo "The route wasn't matched by any route<br>";
    }

    echo "<br>";
}

الحواشي الموجه

يوفر هذا المكون متغيرًا يتكامل مع خدمة annotations . باستخدام هذه الإستراتيجية يمكنك كتابة المسارات مباشرة في وحدات التحكم بدلاً من إضافتها في تسجيل الخدمة:

use Phalcon\Mvc\Router\Annotations as RouterAnnotations;

$di["router"] = function () {
    // Use the annotations router. We're passing false as we don't want the router to add its default patterns
    $router = new RouterAnnotations(false);

    // Read the annotations from ProductsController if the URI starts with /api/products
    $router->addResource("Products", "/api/products");

    return $router;
};

يمكن تعريف التعليقات التوضيحية بالطريقة التالية:

/**
 * @RoutePrefix("/api/products")
 */
class ProductsController
{
    /**
     * @Get(
     *     "/"
     * )
     */
    public function indexAction()
    {

    }

    /**
     * @Get(
     *     "/edit/{id:[0-9]+}",
     *     name="edit-robot"
     * )
     */
    public function editAction($id)
    {

    }

    /**
     * @Route(
     *     "/save",
     *     methods={"POST", "PUT"},
     *     name="save-robot"
     * )
     */
    public function saveAction()
    {

    }

    /**
     * @Route(
     *     "/delete/{id:[0-9]+}",
     *     methods="DELETE",
     *     conversors={
     *         id="MyConversors::checkId"
     *     }
     * )
     */
    public function deleteAction($id)
    {

    }

    public function infoAction($id)
    {

    }
}

يتم فقط استخدام الطرق المميزة بتعليقات توضيحية صالحة كطرق. قائمة التعليقات التوضيحية المدعومة:

اسم وصف استعمال
RoutePrefix بادئة سيتم إلحاقها بكل عنوان URI للطريق. يجب وضع هذا التعليق التوضيحي في الصنف 'docblock' @RoutePrefix("/api/products")
طريق يشير هذا التعليق التوضيحي إلى طريقة كمسار. يجب وضع هذا التعليق التوضيحي في docblock @Route("/api/products/show")
احصل على يشير هذا التعليق التوضيحي إلى طريقة كمسار يقيّد طريقة HTTP إلى GET @Get("/api/products/search")
بريد يشير هذا التعليق التوضيحي إلى طريقة كمسار يقيّد طريقة HTTP إلى POST @Post("/api/products/save")
ضع يشير هذا التعليق التوضيحي إلى طريقة كمسار يحد من طريقة HTTP إلى PUT @Put("/api/products/save")
حذف يشير هذا التعليق التوضيحي إلى طريقة كمسار يقيّد طريقة HTTP إلى DELETE @Delete("/api/products/delete/{id}")
خيارات يشير هذا التعليق التوضيحي إلى طريقة كمسار يقيّد طريقة HTTP إلى OPTIONS @Option("/api/products/info")

بالنسبة إلى التعليقات التوضيحية التي تضيف طرقًا ، يتم دعم المعلمات التالية:

اسم وصف استعمال
أساليب حدد طريقة HTTP واحدة أو أكثر يجب أن يلتقيها المسار @Route("/api/products", methods={"GET", "POST"})
اسم حدد اسمًا للمسار @Route("/api/products", name="get-products")
مسارات مجموعة من المسارات مثل تلك التي تم تمريرها إلى Phalcon\Mvc\Router::add() @Route("/posts/{id}/{slug}", paths={module="backend"})
conversors تجزئة من المحولين ليتم تطبيقها على المعلمات @Route("/posts/{id}/{slug}", conversors={id="MyConversor::getId"})

إذا كنت تستخدم وحدات نمطية في تطبيقك ، فمن الأفضل استخدام طريقة addModuleResource() :

use Phalcon\Mvc\Router\Annotations as RouterAnnotations;

$di["router"] = function () {
    // Use the annotations router
    $router = new RouterAnnotations(false);

    // Read the annotations from Backend\Controllers\ProductsController if the URI starts with /api/products
    $router->addModuleResource("backend", "Products", "/api/products");

    return $router;
};

تسجيل مثيل جهاز التوجيه

يمكنك تسجيل جهاز التوجيه أثناء تسجيل الخدمة مع حاقن التبعية Phalcon لجعلها متوفرة داخل وحدات التحكم.

أنت بحاجة إلى إضافة كود أدناه في ملف Bootstrap الخاص بك (على سبيل المثال index.php أو app / config / services.php إذا كنت تستخدم Phalcon Developer Tools )

/**
 * Add routing capabilities
 */
$di->set(
    "router",
    function () {
        require __DIR__ . "/../app/config/routes.php";

        return $router;
    }
);

تحتاج إلى إنشاء تطبيق / config / routes.php وإضافة رمز تهيئة الموجه ، على سبيل المثال:

use Phalcon\Mvc\Router;

$router = new Router();

$router->add(
    "/login",
    [
        "controller" => "login",
        "action"     => "index",
    ]
);

$router->add(
    "/products/:action",
    [
        "controller" => "products",
        "action"     => 1,
    ]
);

return $router;

تنفيذ جهاز التوجيه الخاص بك

يجب تنفيذ واجهة Phalcon\Mvc\RouterInterface لإنشاء جهاز التوجيه الخاص بك بدلاً من جهاز التوجيه المقدم من Phalcon.