penghalaan


URL yang kelihatan baik adalah satu kemestian mutlak untuk sebarang aplikasi web yang serius. Ini bermakna URL hodoh seperti index.php?article_id=57 akan digantikan dengan /read/intro-to-symfony. index.php?article_id=57这类丑陋的URL要被/read/intro-to-symfony取代。

拥有灵活性是更加重要的。你将页面的URL从/blog改为/news时需要做些什么?你需要跟踪和更新多少链接以做出改变?如果你使用Symfony的路由,这就很容易了。

Symfony路由器允许你定义创造性的url,映射到应用程序的不同区域。在本章结束时,你将可以做到:

  • 创建复杂的路由,它们将映射到控制器

  • 在模板和控制器中生成URL

  • 从Bundle中(也可以从其它地方)加载路由资源

  • 对路由除错

路由样例 

一个路由,是指一个URL路径(path)到一个控制器(controller)的映射。例如,你想匹配一些URL:/blog/my-post/blog/all-about-symfony,并且发送路由到一个“能够查询和渲染那一篇博文”的控制器上。路由简单的很:

Annotations:// src/AppBundle/Controller/BlogController.phpnamespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class BlogController extends Controller{
    /**
     * @Route("/blog/{slug}", name="blog_show")
     */
    public function showAction($slug)
    {
        // ...
    }}
YAML:# app/config/routing.ymlblog_show:
    path:      /blog/{slug}
   defaults:  { _controller: AppBundle:Blog:show }
XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/routing        http://symfony.com/schema/routing/routing-1.0.xsd">     <route id="blog_show" path="/blog/{slug}">
        <default key="_controller">AppBundle:Blog:show</default>
    </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('blog_show', new Route('/blog/{slug}', array(
    '_controller' => 'AppBundle:Blog:show',))); return $collection;

定义blog_show路由模式,用于匹配像/blog/*的URL,把相关参数或通配符用slug表示并传入。对于/blog/my-blog-post这样的URL,slug变量得到my-blog-post的值,并供你控制器使用。美观blog_show是一个内部名称,他没什么实际的意义就是一个唯一的标识。以后,你可用他来生成一些URL。

如果你不想去使用注释方式,因为你不喜欢他们,或者因为你不希望依赖于SensioFrameworkExtraBundle,你也可以使用YAML,XML或者PHP。在这些格式中,_controller参数是一个特殊的键,它告诉symfony路由指定的URL应该执行哪个控制器。_controller字符串称为逻辑名。它遵循规则指向一个特定的php类和方法,AppBundleControllerBlogController::showAction方法。

恭喜!你刚刚创建了一个路由并把它连接到控制器。现在,当你访问/blog/my-postshowAction控制器将被执行并且$slug变量就等于my-post

Mempunyai fleksibiliti adalah lebih penting. Apakah yang perlu anda lakukan untuk menukar URL halaman daripada /blog kepada /news? Berapa banyak pautan yang anda perlukan untuk menjejaki dan mengemas kini untuk membuat perubahan? Ini mudah jika anda menggunakan penghalaan Symfony.

Penghala Symfony membolehkan anda mentakrifkan URL kreatif yang memetakan ke kawasan berbeza aplikasi anda. Pada penghujung bab ini, anda akan dapat: 🎜
  • 🎜Membuat laluan kompleks yang akan dipetakan kepada pengawal🎜
  • 🎜Menghasilkan URL dalam templat dan pengawal🎜< li>🎜Muatkan sumber penghalaan daripada Bundle (atau dari tempat lain)🎜
  • 🎜Nyahpepijat penghalaan🎜

Contoh penghalaan

🎜Satu laluan merujuk kepada laluan URL (laluan) ke pemetaan pengawal (pengawal). Sebagai contoh, anda ingin memadankan beberapa URL: /blog/my-post dan /blog/all-about-symfony dan menghantar laluan ke "can query and memberikan catatan blog itu" pada pengawal. Penghalaan adalah sangat mudah: 🎜
GET /blog/my-blog-post
YAML:# app/config/config.yml
framework:   
# ...
router: { resource: '%kernel.root_dir%/config/routing.yml' }
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:framework="http://symfony.com/schema/dic/symfony"    xsi:schemaLocation="http://symfony.com/schema/dic/services        http://symfony.com/schema/dic/services/services-1.0.xsd        http://symfony.com/schema/dic/symfony        http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">     <framework:config>
        <!-- ... -->
        <framework:router resource="%kernel.root_dir%/config/routing.xml" />
    </framework:config></container>
PHP:// app/config/config.php$container->loadFromExtension('framework', array(
   // ...    'router' => array(        'resource' => '%kernel.root_dir%/config/routing.php',    ),));
🎜 Tentukan corak penghalaan blog_show, yang digunakan untuk memadankan URL seperti /blog/* dan gunakan slug untuk parameter yang berkaitan atau kod bebas> mewakili dan dihantar masuk. Untuk URL seperti /blog/my-blog-post, pembolehubah slug mendapat nilai my-blog-post dan memberikannya kepada penggunaan pengawal anda. blog_show ialah nama dalaman Ia tidak mempunyai makna praktikal dan hanya pengecam unik. Kemudian, anda boleh menggunakannya untuk menjana beberapa URL. 🎜🎜Jika anda tidak mahu menggunakan anotasi kerana anda tidak menyukainya, atau kerana anda tidak mahu bergantung pada SensioFrameworkExtraBundle, anda juga boleh menggunakan YAML, XML atau PHP. Dalam format ini, parameter _controller ialah kunci khas yang memberitahu symfony pengawal yang harus dilaksanakan untuk URL yang ditentukan oleh laluan. Rentetan _controller dipanggil nama logik. Ia mengikut peraturan dan menunjuk kepada kelas dan kaedah PHP tertentu, kaedah AppBundleControllerBlogController::showAction. 🎜🎜Tahniah! Anda baru sahaja mencipta laluan dan menyambungkannya kepada pengawal. Sekarang, apabila anda melawati /blog/my-post, pengawal showAction akan dilaksanakan dan pembolehubah $slug akan sama dengan saya- pos. 🎜🎜Matlamat penghalaan Symfony: Petakan URL yang diminta kepada pengawal. Mengikuti matlamat ini, anda akan mempelajari pelbagai teknik yang menjadikan pemetaan walaupun URL yang paling kompleks mudah. 🎜

Penghalaan: Pandangan lebih dekat

Apabila permintaan dihantar ke aplikasi anda, ia mengandungi alamat "sumber" yang tepat bagi permintaan pelanggan. Alamat ini dipanggil URL (atau URI), dan ia boleh menjadi /contact, /blog/read-me atau apa-apa sahaja. Berikut ialah contoh permintaan HTTP: /contact/blog/read-me或其它任何东西。下面是一个HTTP请求的例子:

Annotations:// src/AppBundle/Controller/MainController.php // ...class MainController extends Controller{
    /**
     * @Route("/")
     */
    public function homepageAction()
    {
        // ...
    }}

symfony路由系统的目的是解析url,并确定调用哪个控制器。整个过程是这样的:

  1. 由Symfony的前端控制器(如app.php)来处理请求。

  2. symfony的核心(Kernel内核)要求路由器来检查请求。

  3. 路由将输入的URL匹配到一个特定的路由,并返回路由信息,其中包括要执行的控制器信息。

  4. Symfony内核执行控制器并最终返回Response对象。

1466599518_84162_47822_request-flow-1.png

路由是将一个输入URL转换成特定的工具来执行控制器。

创建路由 

Symfony从一个单一的路由配置文件中加载所有的路由到你的应用程序。美观路由配置文件通常是app/config/routing.yml

YAML:# app/config/routing.yml_welcome:
    path:      /
    defaults:  { _controller: AppBundle:Main:homepage }

Tujuan sistem penghalaan symfony adalah untuk menghuraikan URL dan menentukan pengawal yang hendak dipanggil. Keseluruhan prosesnya adalah seperti ini:
  1. Permintaan diproses oleh pengawal bahagian hadapan Symfony (seperti app.php).


  2. Inti symfony (Kernel) memerlukan penghala untuk menyemak permintaan.

Laluan itu sepadan dengan URL input ke laluan tertentu dan mengembalikan maklumat laluan, termasuk maklumat pengawal yang akan dilaksanakan.
  • 🎜Inti Symfony melaksanakan pengawal dan akhirnya mengembalikan objek Respons. . -flow-1.png"/>🎜🎜 Penghalaan menukar URL input kepada alat khusus untuk melaksanakan pengawal. 🎜🎜Buat Laluan ¶🎜🎜🎜Symfony memuatkan semua laluan ke dalam aplikasi anda daripada satu fail konfigurasi penghalaan. Fail konfigurasi penghalaan yang cantik biasanya app/config/routing.yml, tetapi anda juga boleh meletakkan fail itu di mana-mana sahaja melalui fail konfigurasi aplikasi (termasuk fail konfigurasi dalam format xml atau php). 🎜
    XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/routing        http://symfony.com/schema/routing/routing-1.0.xsd">     <route id="_welcome" path="/">
            <default key="_controller">AppBundle:Main:homepage</default>
        </route> </routes>
    🎜🎜
    PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('_welcome', new Route('/', array(
        '_controller' => 'AppBundle:Main:homepage',))); return $collection;
    Annotations:// src/AppBundle/Controller/BlogController.php // ...class BlogController extends Controller{
        /**
         * @Route("/blog/{slug}")
         */
        public function showAction($slug)
        {
            // ...
        }}
    🎜Walaupun semua laluan boleh dimuatkan daripada fail, adalah amalan biasa untuk memasukkan sumber laluan tambahan. Untuk melakukan ini, anda perlu mengkonfigurasi fail penghalaan luaran ke dalam fail penghalaan utama. Untuk maklumat terperinci, sila lihat bab ini: Mengandungi sumber penghalaan luaran. 🎜🎜🎜🎜

    Konfigurasi penghalaan asas ¶

    Menentukan laluan adalah mudah, aplikasi biasa juga harus mempunyai banyak laluan. Laluan asas terdiri daripada dua bahagian: path padan dan lalaiArray:path 匹配和defaults数组:

    YAML:# app/config/routing.ymlblog_show:
        path:      /blog/{slug}
        defaults:  { _controller: AppBundle:Blog:show }
    XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/routing        http://symfony.com/schema/routing/routing-1.0.xsd">     <route id="blog_show" path="/blog/{slug}">
            <default key="_controller">AppBundle:Blog:show</default>
        </route></routes>
    PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('blog_show', new Route('/blog/{slug}', array(
        '_controller' => 'AppBundle:Blog:show',))); return $collection;
    Annotations:// src/AppBundle/Controller/BlogController.php // ...class BlogController extends Controller{
        /**
         * @Route("/blog/{page}", defaults={"page" = 1})
         */
        public function indexAction($page)
        {
            // ...
        }     /**
         * @Route("/blog/{slug}")
         */
        public function showAction($slug)
        {
            // ...
        }}

    该路由匹配首页(/)并将它映射到AppBundle:Main:homepage 控制器。_controller字符串被Symfony转换成PHP函数去执行。美观过程在本章(控制器命名模式)中被简短提及。

    带参数的路由 ¶

    路由系统支持很多有趣的路由写法。许多的路由都可以包含一个或者多个“参数或通配符”占位符:

    YAML:# app/config/routing.ymlblog:
        path:      /blog/{page}
        defaults:  { _controller: AppBundle:Blog:index, page: 1 }blog_show:
        path:      /blog/{slug}
        defaults:  { _controller: AppBundle:Blog:show }
    XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/routing        http://symfony.com/schema/routing/routing-1.0.xsd">     <route id="blog" path="/blog/{page}">
            <default key="_controller">AppBundle:Blog:index</default>
            <default key="page">1</default>
        </route>     <route id="blog_show" path="/blog/{slug}">
            <default key="_controller">AppBundle:Blog:show</default>
        </route></routes>
    PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('blog', new Route('/blog/{page}', array(
        '_controller' => 'AppBundle:Blog:index',
        'page'        => 1,))); $collection->add('blog_show', new Route('/blog/{show}', array(
        '_controller' => 'AppBundle:Blog:show',))); return $collection;
    Annotations:// src/AppBundle/Controller/ArticleController.php // ...class ArticleController extends Controller{
        /**
         * @Route(
         *     "/articles/{_locale}/{year}/{title}.{_format}",
         *     defaults={"_format": "html"},
         *     requirements={
         *         "_locale": "en|fr",
         *         "_format": "html|rss",
         *         "year": "\d+"
         *     }
         * )
         */
        public function showAction($_locale, $year, $title)
        {
        }}


    美观路径将匹配任何/blog/*的URL。更妙的是,美观{slug}占位符将自动匹配到控制器中。换句话说,如果该URL是/blog/hello-world,控制器中$slug变量的值就是hello-world。这可以用来,匹配博客文章标题的字符串。

    然而这种方式路由将不会匹配/blog这样的URL,因为默认情况下,所有的占位符都是必填的。当然这也是可以变通的,可以在defaults数组中添加占位符(参数)的值来实现。

    添加{通配符}的条件 

    快速浏览一下已经创建的路由:

    YAML:# app/config/routing.ymlarticle_show:
      path:     /articles/{_locale}/{year}/{title}.{_format}
      defaults: { _controller: AppBundle:Article:show, _format: html }
      requirements:
          _locale:  en|fr
          _format:  html|rss
          year:     \d+
    XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/routing        http://symfony.com/schema/routing/routing-1.0.xsd">     <route id="article_show"        path="/articles/{_locale}/{year}/{title}.{_format}">         <default key="_controller">AppBundle:Article:show</default>
            <default key="_format">html</default>
            <requirement key="_locale">en|fr</requirement>
            <requirement key="_format">html|rss</requirement>
            <requirement key="year">\d+</requirement>     </route></routes>
    PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add(
        'article_show',
        new Route('/articles/{_locale}/{year}/{title}.{_format}', array(
            '_controller' => 'AppBundle:Article:show',
            '_format'     => 'html',
        ), array(
            '_locale' => 'en|fr',
            '_format' => 'html|rss',
            'year'    => '\d+',
        ))); return $collection;
    // src/AppBundle/Controller/BlogController.phpnamespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class BlogController extends Controller{
        public function showAction($slug)
        {
            // ...
        }}


    你能发现问题吗?两个路由都匹配类似/blog/*的URL。Symfony路由总是选择它第一个匹配的(blog)路由。换句话说,该blog_show路由永远被匹配。相反,像一个/blog/my-blog-post的URL会匹配第一个(blog)路由,并返回一个my-blog-post的值给{page}参数。

    Penghalaan dengan parameter ¶

    Sistem penghalaan menyokong banyak cara menarik untuk menulis laluan. Banyak laluan boleh mengandungi satu atau lebih ruang letak "parameter atau kad bebas":

    var url = Routing.generate(
        'blog_show',
        {"slug": 'my-blog-post'});
    $this->get('router')->generate('blog', array(
        'page' => 2,
        'category' => 'Symfony'));// /blog/2?category=Symfony
    Twig:<a href="{{ path('blog_show', {'slug': 'my-blog-post'}) }}">
      Read this blog post.
    </a>
    php:<a href="<?php echo $view['router']->path('blog_show', array(
        'slug' => 'my-blog-post',)) ?>">
        Read this blog post.
    </a>


    Laluan cantik akan sepadan dengan mana-mana URL /blog/* . Lebih baik lagi, pemegang tempat {slug} yang cantik akan dipadankan secara automatik ke dalam pengawal. Dalam erti kata lain, jika URL ialah /blog/hello-world, nilai pembolehubah $slug dalam pengawal ialah hello-world . Ini boleh digunakan untuk memadankan rentetan dalam tajuk catatan blog.

    Walau bagaimanapun, penghalaan dengan cara ini tidak akan sepadan dengan URL seperti /blog, kerana secara lalai, semua ruang letak diperlukan. Sudah tentu, ini juga boleh diubah suai dengan menambahkan nilai pemegang tempat (parameter) pada tatasusunan defaults.

    Tambahkan {wildcard} syarat

    Semak imbas Laluan yang dibuat dengan cepat:< /p>

    use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
     $this->generateUrl('blog_show', array('slug' => 'my-blog-post'), UrlGeneratorInterface::ABSOLUTE_URL);
    // http://www.example.com/blog/my-blog-post
    Twig:<a href="{{ url('blog_show', {'slug': 'my-blog-post'}) }}">
      Read this blog post.
    </a>
    php:<a href="<?php echo $view['router']->url('blog_show', array(
        'slug' => 'my-blog-post',)) ?>">
        Read this blog post.
    </a>

    当生成一个绝对URL链接时,所使用的主机自动检测当前使用的Request对象。当生成从web环境外的绝对URL(例如一个控制台命令)这是行不通的。请参见 如何从控制台生成URL 来学习如何解决这个问题。



    Bolehkah anda melihat masalahnya? Kedua-dua laluan sepadan dengan URL seperti /blog/*. Penghalaan Symfony sentiasa memilih laluan padanan (blog) pertama yang dipadankan. Dalam erti kata lain, laluan blog_show akan sentiasa dipadankan. Sebaliknya, URL seperti /blog/my-blog-post akan sepadan dengan laluan (blog) pertama dan mengembalikan my-blog-post< Nilai daripada /code> diberikan kepada parameter {page}.

    URLRouteParameters
    /blog/2blog_list$page = 2
    /blog/my-blog-postblog_show$slug = my-blog-post
    public function showAction($slug){
      // ...}
    $params = $this->get('router')->match('/blog/my-blog-post');
    // array(
    //     'slug'        => 'my-blog-post',
    //  '_controller' => 'AppBundle:Blog:show',
    // ) 
    $uri = $this->get('router')->generate('blog_show', array(
      'slug' => 'my-blog-post'));
    // /blog/my-blog-post
    class MainController extends Controller{
        public function showAction($slug)
        {
            // ...         $url = $this->generateUrl(
                'blog_show',
                array('slug' => 'my-blog-post')
            );
        }}
    $url = $this->container->get('router')->generate(
        'blog_show',
        array('slug' => 'my-blog-post'));

    Laluan ini sepadan dengan halaman utama (/) dan petakannya ke pengawal AppBundle:Main:homepage. Rentetan _controller ditukar oleh Symfony kepada fungsi PHP untuk pelaksanaan. Proses estetik disebut secara ringkas dalam bab ini (Pola Penamaan Pengawal).

    URL LaluanParameter
    /blog/2
    blog_list🎜$page = 2🎜🎜/blog/my-blog-post🎜blog_show🎜$slug = my-blog-post🎜🎜🎜 🎜

    Berikan {wildcard} nilai lalai

    Contoh penghalaan lanjutan

    Dalam Symfony anda boleh mencapai semua yang anda perlukan dengan mencipta struktur penghalaan yang berkuasa. Berikut ialah contoh untuk menunjukkan betapa fleksibelnya sistem penghalaan:

    rrreeerrreeerrreeerrreee

    Seperti yang anda lihat, penghalaan yang cantik hanya sepadan dengan sebahagian daripada URL yang memenuhi {_locale} sebagai (en atau fr) dan {year} ialah angka. Laluan ini juga menunjukkan kepada anda bahawa anda boleh menggunakan tempoh untuk memisahkan dua ruang letak. URL yang dipadankan dengan laluan di atas adalah seperti berikut:
    {_locale}为(en或者fr)和 {year}是数字的。该路由还向你展示了你可以使用一个句号来分割两个占位符。上面路由匹配的URL如下:

    • /articles/en/2010/my-post

    • /articles/fr/2010/my-post.rss

    • /articles/en/2013/my-latest-post.html

    特殊的_format路由参数

    这个示例也突显了特殊的_format路由参数。当使用这个参数时,匹配值将成为Request对象的“request format”(请求格式)。

    最终,请求格式被用在“设置响应的Content-Type”这种地方(如一个json请求格式将转换成application/jsonContent-Type)。它也可以在控制器中使用,根据不同的_format值去渲染不同的模板。_format参数是一种非常强大的方式,把相同的内容以不同格式来渲染(译注:即输出)。

    在symfony3.0之前的版本中,可以覆写request(对象)中的格式参数(_format),通过添加名为“_format”的query参数即可(例:/foo/bar?_format=json

    • /articles/en/2010/my-post
  • < code>/articles /fr/2010/my-post.rss
  • /articles/en/2013/my-latest-post.html

    < /li>< /ul>

    Parameter laluan _format khas
    🎜Contoh ini turut menyerlahkan parameter laluan _format khas. Apabila parameter ini digunakan, nilai padanan menjadi "format permintaan" objek Request. 🎜🎜Akhirnya, format permintaan digunakan di tempat seperti "menetapkan respons Content-Type" (contohnya, format permintaan json akan ditukar kepada aplikasi /json's Content-Type). Ia juga boleh digunakan dalam pengawal untuk memaparkan templat berbeza berdasarkan nilai _format yang berbeza. Parameter _format ialah cara yang sangat berkuasa untuk memaparkan kandungan yang sama dalam format yang berbeza. 🎜🎜Dalam versi sebelum symfony3.0, anda boleh mengatasi parameter format (_format) dalam permintaan (objek) dengan menambahkan parameter pertanyaan bernama "_format" Itu sahaja ( contohnya: /foo/bar?_format=json). Penyalahgunaan tingkah laku ini dianggap sebagai amalan buruk dan akan menjadikan peningkatan program anda kepada symfony3 "sangat rumit". 🎜🎜🎜🎜🎜🎜Kadangkala, anda ingin menjadikan bahagian tertentu "konfigurasi global" penghalaan anda. Symfony boleh melakukan ini menggunakan parameter bekas perkhidmatan. Lihat Cara menggunakan parameter kontena perkhidmatan dalam penghalaan untuk mengetahui lebih lanjut. 🎜🎜🎜

    Parameter penghalaan khas ¶

    Seperti yang anda lihat, setiap parameter penghalaan atau nilai lalai boleh digunakan sebagai parameter kaedah pengawal. Selain itu, tiga parameter adalah istimewa: Setiap satu menambah fungsi unik pada aplikasi anda:

    • _controller
    • _controller
    • 正如你所看到的,这个参数是用来决定“当路由匹配时”要执行哪个控制器的。
    • _format
    • 用于设置请求格式(request format。了解详情)。
    • _locale
    • 用于设置请求的locale (了解详情).

    控制器命名模式 

    如果你使用YAML,XML或PHP的路由配置,那么每个路由都必须有一个_controller参数,用于指示当路匹配时应执行哪个控制器。这个参数使用一个简单的字符串pattern,叫做控制器逻辑名(logical controller name),Symfony用它来映射一个特定的PHP方法或类。此pattern有三个部分,用冒号隔开:

    bundle:controller:action

    假设,一个_controller值是一个AppBundle:Blog:show那么意味着:

    _format digunakan untuk menetapkan format permintaan (format permintaan. Ketahui lebih lanjut). _locale
    BundleController ClassMethod Name
    AppBundleBlogControllershowActionAs anda boleh lihat, parameter ini digunakan untuk menentukan pengawal mana yang hendak dilaksanakan "apabila laluan sepadan".
    digunakan untuk menetapkan tempat yang diminta (ketahui lebih lanjut).
  • < h2 >Corak penamaan pengawal #🎜🎜#Jika anda menggunakan konfigurasi penghalaan YAML, XML atau PHP, maka Setiap route mesti mempunyai parameter _controller yang menunjukkan pengawal yang harus dilaksanakan apabila laluan sepadan. Parameter ini menggunakan corak rentetan ringkas yang dipanggil nama pengawal logik, yang Symfony gunakan untuk memetakan kaedah atau kelas PHP tertentu. Corak ini mempunyai tiga bahagian, dipisahkan oleh titik bertindih: #🎜🎜#
    #🎜🎜#bundle:controller:action#🎜🎜#
    #🎜🎜#Anggap, a< The nilai code>_controller ialah AppBundle:Blog:show yang bermaksud: #🎜🎜#< colgroup >#🎜🎜# < /thead>
    HimpunanKelas PengawalNama Kaedah
    AppBundle#🎜🎜#BlogController#🎜🎜#showAction#🎜🎜##🎜🎜##🎜🎜##🎜🎜#

    Pengawal mungkin kelihatan seperti ini:

    rrreee

    Perhatikan bahawa Symfony menambah rentetan Controller sebagai nama kelas pada Blog ( Blog=>BlogController), tambah rentetan Action sebagai nama kaedah (show=> showAction ). Blog上添加了字符串Controller作为类名(Blog=>BlogController),添加字符串Action作为方法名(show=>showAction)。

    你也可以使用它的FQCN类名及方法来指定这个类:AppBundleControllerBlogController::showAction。但如果你遵循一些简单的命名约定,逻辑名将更加简洁也更加灵活。

    除了使用逻辑名和FQCN类名之外,Symfony也支持第三种指定控制器的方式。这种方式只使用一个冒号分隔(如service_name:indexAction),并将控制器作为一个服务来引用(参见如何把控制器定义为服务)。

    路由参数和控制器参数 ¶

    路由参数(如{slug}是非常重要的,因为它(们)都被用作控制器方法的参数:

    rrreee

    现实中,defaults集将参数值一起合并成一个表单数组。该数组中的每个键都被做为控制器的参数。

    换句话说,对于控制器方法的每个参数,Symfony2都会根据该名称来查找路由参数,并将其值指向到控制器作为参数。在上面的高级示例当中,下列变量的任何组合(以任意方式)都被用作showAction()方法的参数:

    • $_locale

    • $year

    • $title

    • $_format

    • $_controller

    • $_route

    占位符和defaults集被合并在一起,就就算是$_controller变量也是可用的。更多细节的讨论,请参见作为 控制器–把路由参数传入控制器。

    你也可以使用指定的$_route

    Anda juga boleh menentukan kelas ini menggunakan nama dan kaedah kelas FQCNnya: AppBundleControllerBlogController::showAction. Tetapi jika anda mengikuti beberapa konvensyen penamaan yang mudah, nama logik akan menjadi lebih mudah dan lebih fleksibel.
    Selain menggunakan nama logik dan nama kelas FQCN, Symfony turut menyokong spesifikasi ketiga cara pengawal. Pendekatan ini hanya menggunakan pembatas bertindih (seperti service_name:indexAction) dan merujuk pengawal sebagai perkhidmatan (lihat Cara mentakrifkan pengawal sebagai perkhidmatan). #🎜🎜##🎜🎜##🎜🎜#

    Parameter penghalaan dan parameter pengawal ¶

    #🎜🎜#Parameter penghalaan (seperti {slug} adalah sangat penting kerana Ia adalah semua digunakan sebagai parameter untuk kaedah pengawal: #🎜🎜#rrreee#🎜🎜#Sebenarnya, set lalai menggabungkan nilai parameter bersama-sama ke dalam tatasusunan bentuk untuk setiap item dalam tatasusunan digunakan sebagai parameter pengawal pengawal sebagai argumen Dalam contoh lanjutan di atas, sebarang gabungan pembolehubah berikut (dalam apa jua cara) digunakan sebagai argumen kepada kaedah showAction(): #🎜🎜#
      < li> #🎜🎜#$_locale#🎜🎜#
    • #🎜🎜#$year#🎜🎜#
    • #🎜🎜#$title#🎜🎜#
    • #🎜🎜#$_format#🎜🎜#
    • #🎜🎜#$_controller#🎜🎜#
    • #🎜🎜#$_route#🎜🎜#
    • < /ul>#🎜🎜# Pemegang tempat dan set default digabungkan bersama, malah pembolehubah $_controller tersedia. Butiran lanjut dibincangkan parameter ke dalam pengawal #🎜🎜#
      #🎜🎜#Anda juga boleh melakukan ini menggunakan $ yang ditentukan _route pembolehubah, yang nilainya ialah nama laluan yang dipadankan #🎜🎜##🎜🎜##🎜🎜#.

      Anda juga boleh menentukan maklumat tambahan dalam laluan anda dan mengaksesnya dalam pengawal anda. Untuk maklumat lanjut sila baca Cara menghantar maklumat tambahan dari laluan ke pengawal

      Jana URL ¶

      Sistem penghalaan juga digunakan untuk menjana URL. Pada hakikatnya, penghalaan ialah sistem dua hala: memetakan URL kepada pengawal + parameter dan laluan pemetaan + parameter kembali ke URL. Kaedah match() dan generate() membentuk sistem dua hala ini. Menggunakan contoh blog_show sebelumnya: match()generate()方法构成了这个双向系统。使用之前的blog_show的例子:

      rrreee

      要生成一个URL,你需要指定路由的名称(如blog_show)以及任意的通配符(如slug = my-blog-post)。有个这些信息,任何URL就可以很容易的生成了:

      rrreee

      在控制器中你没有继承symfony的父类Controller,那么你不可以使用generateUrl()快捷方法,但你可以使用router的generate()服务方法:

      rrreee

      在即将到来的部分中,你将学会如何在模板中生成URL地址。

      如果你的应用程序前端使用的是ajax请求,你可能希望根据你的路由配置,在JavaScript中生成URL。通过使用FOSJsRoutingBundle,你就可以做到:

      rrreee

      更多信息请阅读这个bundle文档。

      生成带有Query Strings的URL 

      这个generate方法采用通配符数组来生成URL。但是如果在其中添加了额外的键值对,他们将会被添加成Query Strings来生成一个新的URL:

      rrreee

      在模板里生成URL 

      在应用程序页面之间进行连接时,最常见的地方就是从模板中生成URL。这样做其实和以前一样,但是使用的是一个模板助手函数:

      rrreeerrreee

      生成绝对的URL 

      默认情况下,路由器会产生相对的URL(如/blog)。在控制器中,很简单的把generateUrl()方法的第三参数设置成UrlGeneratorInterface::ABSOLUTE_URL即可。

      rrreee

      在模板引擎Twig中,要使用url()函数(生成一个绝对的URL),而不是path()rrreee

      Untuk menjana URL, anda perlu menentukan nama laluan (seperti blog_show) dan sebarang kad liar (seperti slug = catatan-blog saya). Dengan maklumat ini, sebarang URL boleh dijana dengan mudah:

      rrreee

      Dalam pengawal, jika anda tidak mewarisi Pengawal kelas induk symfony, maka anda tidak boleh menggunakan kaedah pintasan generateUrl(), tetapi anda boleh menggunakan kaedah perkhidmatan generate() penghala:

      rrreee

      Dalam bahagian yang akan datang, anda akan belajar cara menjana alamat URL dalam templat.

      Jika bahagian hadapan aplikasi anda menggunakan permintaan ajax, anda mungkin mahu menjana URL dalam JavaScript berdasarkan konfigurasi penghalaan anda. Dengan menggunakan FOSJsRoutingBundle, anda boleh melakukan:

      rrreee

      Sila baca dokumen bundle ini untuk mendapatkan maklumat lanjut.

      Jana URL dengan Rentetan Pertanyaan

      🎜Ini menjana< The / code> kaedah menggunakan tatasusunan kad bebas untuk menjana URL. Tetapi jika pasangan nilai kunci tambahan ditambahkan padanya, ia akan ditambahkan sebagai Rentetan Pertanyaan untuk menjana URL baharu: 🎜rrreee

      Jana URL dalam templat

      🎜Tempat yang paling biasa untuk menyambung antara halaman aplikasi ialah menjana URL daripada templat. Melakukan ini sebenarnya sama seperti sebelumnya, tetapi menggunakan fungsi pembantu templat: 🎜rrreeerrreee

      Jana URL mutlak < / h3>🎜Secara lalai, penghala akan menjana URL relatif (seperti /blog). Dalam pengawal, adalah sangat mudah untuk menetapkan parameter ketiga kaedah generateUrl() kepada UrlGeneratorInterface::ABSOLUTE_URL. 🎜rrreee🎜Dalam enjin templat Twig, gunakan fungsi url() (hasilkan URL mutlak) dan bukannya fungsi path() (hasilkan URL relatif) . Dalam php, anda perlu lulus dalam UrlGeneratorInterface::ABSOLUTE_URL:🎜rrreeerrreeerrreee🎜 dalam generateUrl(). Ia membolehkan anda menentukan URL yang cantik dan "menyahkan" fungsi aplikasi daripada URL. Penghalaan ialah mekanisme dua hala, bermakna ia juga boleh digunakan untuk menjana URL. 🎜🎜Teruskan Teruskan ¶🎜🎜Laluan, disahkan! Sekarang, pergi dan nyahsekat kuasa pengawal. 🎜🎜