2013-01-15 26 views
6

Tôi muốn tải các mẫu Twig nhất định từ cơ sở dữ liệu trong ứng dụng Symfony2 của tôi, trong khi vẫn giữ khả năng sử dụng trình tải gốc để hiển thị các mẫu trong các vị trí hệ thống tệp chuẩn. Làm thế nào để đạt được điều này?Làm thế nào để đăng ký một bộ nạp Twig (tùy chỉnh) khác trong môi trường Symfony2?

Theo như tôi đã hiểu, không có khả năng đăng ký nhiều trình tải lên môi trường Twig. Tôi đã suy nghĩ hai cách (hiện tại):

  • Replace the default loader với lớp proxy tùy chỉnh. Khi các mẫu được tham chiếu với ký hiệu @ Bundle-standard, proxy sẽ chuyển yêu cầu tới trình tải mặc định. Trong trường hợp khác, yêu cầu sẽ được chuyển đến bộ tải tùy chỉnh (cơ sở dữ liệu) của tôi; HOẶC
  • Xây dựng môi trường Twig hoàn toàn mới. Phương pháp này đòi hỏi phải đăng ký phần mở rộng cành tùy chỉnh cho cả hai môi trường và nó không cho phép các mẫu tham khảo chéo từ các nguồn khác nhau (một số từ @Bundles, một số từ cơ sở dữ liệu)

Cập nhật 1:

Có vẻ như Twig hỗ trợ lớp Twig_Loader_Chain có thể được sử dụng trong tùy chọn đầu tiên của tôi. Tuy nhiên, trình tải mặc định có thể truy cập được và được chuyển đến chuỗi làm tùy chọn đầu tiên.

Trả lời

6

Để sử dụng Twig_Loader_Chain bạn cần Symfony 2.2 https://github.com/symfony/symfony/pull/6131
Sau đó, bạn chỉ đơn giản là có thể tinh chỉnh bộ tải của bạn:

services: 
    twig.loader.filesystem: 
     class: %twig.loader.filesystem.class% 
     arguments: 
      - @templating.locator 
      - @templating.name_parser 
     tags: 
      - { name: twig.loader } 
    twig.loader.string: 
     class: %twig.loader.string.class% 
     tags: 
      - { name: twig.loader } 

Cập nhật:
Dường như vẫn còn một số vấn đề (các trình tải tệp hệ thống tệp không thể tìm thấy mẫu somtimes) nhưng tôi đã tìm thấy điều này:
http://forum.symfony-project.org/viewtopic.php?t=40382&p=131254

Dường như làm việc tuyệt vời!

+0

sự cố này đã được khắc phục trong Symfony 2.3 chưa? – Dayson

+3

Tôi nhận ra đây là một chủ đề cũ, nhưng việc thêm cấu hình trên ngăn chặn các mẫu gỡ rối hồ sơ web được hiển thị - trong đó vị trí chuỗi sau được hiển thị ở dưới cùng của màn hình: @ WebProfiler/Profiler/toolbar_js.html.twig How tôi có thể sửa cái này không? – Tocacar

0

Đây là một cách rẻ tiền và vui vẻ để tạm thời thay đổi bộ nạp trong env tiêu chuẩn của bạn:

// Keep the current loader 
    $oldLoader = $env->getLoader(); 

    // Temporarily set a string loader 
    $env->setLoader(new \Twig_Loader_String()); 

    // Resolve the template - but don't render it yet. 
    $template = $env->resolveTemplate($template); 

    // Restore the old loader 
    $env->setLoader($oldLoader); 

    // Render the template. This will pass the old loader into any subtemplates and make sure your string based template gets into the cache. 
    $result = $template->render($context); 

Tôi cho rằng điều này sẽ làm việc với bộ tải tùy chỉnh khác.

+0

Có vẻ tuyệt vời, nhưng làm thế nào để bạn có được môi trường Twig trong Symfony? – Stan

Các vấn đề liên quan