2012-10-17 22 views
7

xin lỗi vì tiếng xấu của tôi, tôi từ NgaLàm việc với các đối tượng Zend View Helper Url, từ bộ điều khiển

bắt đầu học Zend Framework 2 ... mẫu trong bộ điều khiển, readAction():

use Zend\View\Helper\Url; 

.... 

$helperUrl = new Url(); 
$address = $helperUrl('news', array('action' => 'index')); 

kết quả là, ném ngoại lệ:

Zend\View\Exception\RuntimeException 

File: 
    W:\home\zf2\vendor\zendframework\ 
     zendframework\library\Zend\View\Helper\Url.php:80 
Message: 
    No RouteStackInterface instance provided 

Xin vui lòng, giúp tôi. những gì tôi đang làm sai?

Trả lời

12

Bạn không thể sử dụng khung nhìn trong bộ điều khiển - và bạn không cần. Ngoài ra còn có một plugin điều khiển Url hoạt động khá giống nhau.

plugin điều khiển các lớp học invokable, bạn có thể sử dụng chúng như (bối cảnh hành động điều khiển của) này:

$url = $this->url()->fromRoute($route, $params, $options, $reuseMatchesParams); 

Tất cả các thông số là không bắt buộc. Để biết thêm thông tin, hãy kiểm tra mã trong Zend\Mvc\Controller\Plugin\Url hoặc đọc docs.

+3

không đúng sự thật. bạn có thể sử dụng trợ giúp xem trong bộ điều khiển, nhưng ofc không phải là ý tưởng hay: $ uVH = $ this-> getServiceLocator() -> get ('viewhelpermanager') -> get ('url'); $ routeUrl = $ uvh ('tên tuyến đường', mảng ('param1' => 'param1')); v.v. –

3

Trợ giúp và plugin, trong khi chúng có thể được khởi tạo trực tiếp, thường không nên, vì chúng thường được quản lý bởi Trình quản lý plugin. PluginManager là một phân lớp của ServiceManager, và, như vậy, cung cấp nhiều chức năng xung quanh việc tạo plugin, bao gồm việc tiêm các cộng tác viên chuẩn, sử dụng các nhà máy để cung cấp sự tiêm phụ thuộc và hơn thế nữa.

Trong trường hợp của trình trợ giúp Url, có một nhà máy đảm bảo bộ định tuyến đã được định cấu hình được tiêm - nếu bạn khởi tạo trực tiếp, bạn sẽ không có điều này và sẽ không thể thực hiện công việc của mình , như bạn đã nhận thấy!

Như Daniel đã lưu ý, bạn cũng muốn đảm bảo rằng bạn đang nhận được một plugin phù hợp với ngữ cảnh. Nếu bạn đang ở trong một bộ điều khiển, hãy kiểm tra xem có plugin điều khiển nào sẽ thực hiện công việc cho bạn hay không. Daniel liên kết với các tài liệu trong bài viết của mình.

+0

u đã cứu tôi khỏi đau đầu :-) –

0

Tôi biết đã có câu trả lời được chấp nhận nhưng tôi vẫn đăng bài này để giảm bớt gánh nặng cho người mới bắt đầu như tôi.

Tôi sử dụng thông minh làm trình xem hình ảnh và trong thông minh bạn không thể sử dụng mã php trong chế độ xem, do đó, mọi thứ phải được thực hiện trong bộ điều khiển, phân bổ chúng trong biến rồi chuyển chúng sang chế độ xem.

Bạn có thể sử dụng này:

$url = $this->url()->fromRoute('route',array('name'=>'route-name')); 

Nếu bạn đang theo dõi hướng dẫn của zend 2, nó sẽ là như thế này:

$url = $this->url()->fromRoute('album',array('action'=>'add')); 
$url = $this->url()->fromRoute('album',array('action'=>'edit')); 
$url = $this->url()->fromRoute('album',array('action'=>'delete')); 

này sẽ có giá trị là:

/zf2/index.php/album/add 
/zf2/index.php/album/edit 
/zf2/index.php/album/delete 

Như bạn có thể thấy, bạn cần phải thêm tên máy chủ vào đó, bạn có thể thực hiện bằng cách sử dụng chúng trước khi tạo tuyến đường url:

$url = $uri = $this->getRequest()->getUri(); 
$url = sprintf('%s://%s', $uri->getScheme(), $uri->getHost()); 

Nhìn chung, đoạn mã sẽ giống như thế này:

$url = $uri = $this->getRequest()->getUri(); 
$url = sprintf('%s://%s', $uri->getScheme(), $uri->getHost()); 
$url .= $this->url()->fromRoute('album',array('action'=>'add')); 

Để sản xuất:

http://yourservername/zf2/index.php/album/add 

Hope this helps người mới bắt đầu sử dụng zf2

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