2013-01-03 25 views
7
if ($u = $this->generateUrl('_'.$specific.'_thanks')) 
    return $this->redirect($u); 
else 
    return $this->redirect($this->generateUrl('_thanks')); 

Tôi không thể chuyển hướng đến địa chỉ _specific_thanks khi tồn tại. Vì vậy, Làm thế nào để kiểm tra xem một url tồn tại?Kiểm tra url trước khi chuyển hướng symfony2

Khi tôi đã làm điều đó, tôi đã có lỗi này:

Route "_specific_thanks" does not exist.

Trả lời

11

Tôi không nghĩ rằng có một cách trực tiếp để kiểm tra xem một con đường tồn tại. Nhưng bạn có thể tìm kiếm sự tồn tại của tuyến đường thông qua dịch vụ bộ định tuyến.

$router = $this->container->get('router'); 

Sau đó bạn có thể nhận được một bộ sưu tập tuyến đường và gọi get() cho một tuyến đường nhất định, mà trả về null nếu nó không tồn tại.

$router->getRouteCollection()->get('_'. $specific. '_thanks'); 
+0

Hoàn hảo nó làm việc cho tôi! Chỉ cần '$ this-> container-> get ('router');' với symfony 2.1.4 – Harold

+0

Tuyệt vời! Tôi cập nhật câu trả lời để nó phù hợp với sf 2.1.4 :) $ this-> get ('router') cũng hoạt động tôi nghĩ. –

-3

Hãy thử điều này:

if ($u == $this->generateUrl('_'.$specific.'_thanks')) 
+0

tôi thực sự không biết làm thế nào điều này có thể giải quyết vấn đề ... Bạn có thực sự hiểu mật mã? – j0k

+0

Tôi không có kinh nghiệm với symfony2. Tôi nhìn thấy bên trong nếu điều kiện anh ta đặt một nhiệm vụ, vì vậy tôi nghĩ rằng nó có thể là vấn đề. Tôi không biết hàm $ this-> generateUrl() trả về cái gì. – gezimi005

+0

Bạn có thấy rằng nhiệm vụ được sử dụng trong điều kiện không? Vì vậy, bằng cách sử dụng '===' loại bỏ các nhiệm vụ ... – j0k

1

Hãy thử một cái gì đó như thế này, kiểm tra các tuyến đường tồn tại trong mảng của tất cả các tuyến đường:

$router = $this->get('router'); 

    if (array_key_exists('_'.$specific.'_thanks',$router->getRouteCollection->all())){ 
     return $this->redirect($this->generateUrl('_'.$specific.'_thanks')) 
    } else { 
     return $this->redirect($this->generateUrl('_thanks')); 
    } 
+0

Chỉ cần quá nhanh. Nhưng thay vì 'in_array ('', array_keys())' Bạn chỉ có thể làm 'if (array_key_exists ('_'. $ Specific .'_ thanks ', $ router-> getRouteCollection() -> all())' – Touki

+0

' -> all() 'là kẻ giết người hiệu suất –

+0

@AlainTiemblo Tôi không chắc chắn nó thực sự là một kẻ giết người hiệu suất, giải pháp của @ ahmedSiouani là neater nhưng mã gần như cùng một điều, chỉ' isset' chứ không phải là 'array_key_exists'. //github.com/symfony/symfony/blob/2.8/src/Symfony/Component/Routing/RouteCollection.php#L93 cho cách 'all' hoạt động. Kẻ giết người thực sự thực sự là' getRouteCollection' khi nó tải các tuyến đường nếu chúng chưa được tải https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/Routing/Router.php#L190 điều này đã gây ra cho chúng tôi một số vấn đề hiệu năng thực sự trong một dự án :) – Luke

0

Bạn có kiểm tra dàn diễn viên của bạn? Và bạn có chắc chắn về tuyến đường không? thường bắt đầu tuyến đường với

'WEBSITENAME_'.$specific.'_thanks'

8

Sử dụng getRouteCollection() khi chạy là không đúng giải pháp. Thực hiện phương pháp này sẽ yêu cầu bộ nhớ cache được xây dựng lại. Điều này có nghĩa là bộ nhớ cache định tuyến sẽ được xây dựng lại theo yêu cầu mỗi yêu cầu, làm cho ứng dụng của bạn chậm hơn nhiều so với yêu cầu.

Nếu bạn muốn kiểm tra xem một con đường tồn tại hay không, sử dụng cấu trúc try ... catch:

use Symfony\Component\Routing\Exception\RouteNotFoundException; 

try { 
    dump($router->generate('some_route')); 
} catch (RouteNotFoundException $e) { 
    dump('Oh noes, route "some_route" doesn't exists!'); 
} 
Các vấn đề liên quan