2011-10-01 38 views
6

Tôi gặp sự cố với các tuyến đường Codeigniter. Tôi muốn tất cả người dùng đã đăng ký trên trang web của mình có "thư mục" riêng của mình, ví dụ: www.example.com/username1, www.example.com/username2. "Thư mục" này sẽ ánh xạ tới bộ điều khiển "polica", phương thức "ogled", tham số "username1".Tuyến đường trong Codeigniter - Tự động

Nếu tôi làm như vậy, thì mỗi bộ điều khiển được ánh xạ tới tuyến đường này: "polica/ogled/parameter". Đó không phải là OK:

$route["(:any)"] = "polica/ogled/$1"; 

này hoạt động, nhưng tôi đã luôn tự điền thông tin trong routes.php:

$route["username1"] = "polica/ogled/username1"; 

Làm thế nào để làm như vậy rằng điều này sẽ được tự động?

CẬP NHẬT: Ví dụ: tôi có bộ điều khiển có tên ads. Ví dụ: nếu bạn truy cập vào www.example.com/ads/ sẽ có quảng cáo được liệt kê. Nếu bạn truy cập vào www.example.com/username1, quảng cáo được liệt kê theo người dùng username1. Ngoài ra còn có bộ điều khiển user, profile, latest ...

My Current routes.php:

$route['oglasi'] = 'oglasi'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

tôi giải quyết vấn đề với mã này:

$route['oglasi/(:any)'] = 'oglasi/$1'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

Kính trọng, Mario

+0

Brilliant! Tôi chỉ làm điều này với bộ điều khiển mặc định và nó hoạt động ở đó là tốt. –

Trả lời

23

Các vấn đề với tuyến đường của bạn là bằng cách sử dụng: bất kỳ bạn phù hợp, thực sự ... BẤT CỨ tuyến đường, vì vậy bạn đang khá nhiều bị mắc kẹt ở đó. Tôi nghĩ rằng bạn có thể có hai giải pháp:

1) Bạn có thể chọn lọc tái định tuyến tất cả điều khiển trang web riêng lẻ, như:

$route['aboutus'] = "aboutus"; 
$route['where-we-are'] = "whereweare"; 
//And do this for all your site's controllers 
//Finally: 
$route['(:any)'] = "polica/ogled/$1"; 

Tất cả các đường bay phải đến TRƯỚC ANY, kể từ khi họ được đọc trong thứ tự chúng được trình bày, và nếu bạn đặt: bất kỳ lúc nào nó sẽ vui vẻ bỏ qua tất cả các thứ còn lại.

EDIT sau khi bình luận:

Những gì tôi có nghĩa là, nếu bạn đang đi để phù hợp với bất kỳ phân đoạn, điều này có nghĩa rằng bạn không thể sử dụng bất kỳ bộ điều khiển ở tất cả (đó là, theo mặc định, các URI đầu tiên phân đoạn), vì bộ định tuyến sẽ luôn định tuyến lại bạn bằng cách sử dụng định luật của bạn. Để cho phép CI thực thi các bộ điều khiển khác (bất kể chúng là gì, tôi chỉ sử dụng một số trang web phổ biến, nhưng có thể là tất cả mọi thứ), bạn cần cho phép chúng bằng cách loại trừ chúng khỏi định tuyến lại. Và bạn có thể đạt được điều này bằng cách đặt chúng trước quy tắc BẤT CỨ của bạn, để mọi CI truyền qua các quy tắc định tuyến của bạn, nó phân tích cú pháp đầu tiên bạn đã "thoát" và CHỈ nếu chúng không khớp với bất kỳ thứ gì được tìm thấy trên URL, vào quy tắc: ANY.

Tôi biết rằng đây là độ dài mã nhưng dù sao, chúng chắc chắn sẽ nhỏ hơn 6K như bạn đã nói. Vì tôi không biết cấu trúc thực tế của URL và ứng dụng web của bạn nên đó là giải pháp duy nhất có trong đầu tôi.Nếu bạn cung cấp thêm thông tin, chẳng hạn như làm thế nào được định hình các url thường xuyên của ứng dụng của bạn, sau đó tôi có thể cập nhật câu trả lời của tôi

/kết thúc chỉnh sửa

Đây không phải là nhiều giải pháp thiết thực, bởi vì nó sẽ đòi hỏi một rất nhiều mã, nhưng nếu bạn muốn có một thiết kế như thế thì đó là cách duy nhất có trong đầu tôi. Ngoài ra, hãy xem xét bạn có thể sử dụng regexes làm chỉ mục $ route, nhưng tôi không nghĩ rằng nó có thể hoạt động ở đây, vì tên người dùng của bạn không phù hợp trong thời trang này, nhưng tôi chỉ muốn chỉ ra khả năng.

HOẶC

2) Bạn có thể thay đổi mẫu thiết kế của mình một chút, và gán một con đường để tên người dùng, một cái gì đó dọc theo dòng

$route['user/(:any)'] = "polica/ogled/$1"; 

này sẽ tạo ra khá khá (và ngữ nghĩa) URL tuy nhiên, và sẽ tránh được mọi rắc rối khi thoát khỏi các tuyến đường khác.

+0

Cảm ơn bạn đã trả lời. Tôi không thể sử dụng giải pháp thứ hai của bạn vì khách hàng của tôi muốn có tên người dùng sau tên miền.Tôi không hiểu giải pháp đầu tiên của bạn. Bạn có thể giải thích cho tôi về trường hợp của tôi không? Mục tiêu của tôi là, để giải quyết vấn đề này với ít mã hơn. Bây giờ, tôi có trong tập tin 'routes.php' của tôi khoảng 6000 hàng - Tôi không thích điều này:/ – Puzo

+0

@Puzo Tôi đã cập nhật câu trả lời của mình với một số giải thích về giải pháp đầu tiên. Và có, 6000 tuyến đường chắc chắn là quá nhiều. –

+0

Tôi đã cập nhật bài đăng đầu tiên - câu hỏi của mình .. Bạn có cần thêm thông tin không? Loại nao? – Puzo

1

Tôi đã đấu tranh với cùng một vấn đề này rất gần đây. Tôi đã tạo ra thứ gì đó phù hợp với tôi theo cách này:

Xác định bộ điều khiển "chuyển hướng" bằng phương pháp remap. Điều này sẽ cho phép bạn thu thập các yêu cầu được gửi đến contoller với bất kỳ chuỗi biến tiếp tục nào thành một hàm. Vì vậy, nếu yêu cầu được thực hiện cho http://yoursite/jeff/ hoặc http://yoursite/jamie, nó sẽ không trúng các phương pháp đó mà thay vào đó, hãy nhấn http://yoursite/ chức năng remap. (ngay cả khi các phương thức/tên đó không tồn tại và ngay cả khi bạn có hàm chỉ mục, nó cũng thay thế nó). Trong phương thức _Remap, bạn có thể định nghĩa một công tắc có điều kiện, sau đó làm việc với phần còn lại của mã của bạn để chuyển hướng người dùng theo bất kỳ cách nào bạn muốn.

Sau đó, bạn cần xác định điều khiển lại trực tiếp này là một trong những mặc định và thiết lập các tuyến đường của bạn như vậy:

$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

Đây là lúc đầu một chút của một vấn đề bởi vì này về cơ bản sẽ buộc tất cả mọi thứ phải được tái -directed để điều khiển này không có vấn đề gì và cuối cùng thông qua chuyển đổi _remap này.

Nhưng những gì bạn có thể làm là xác định các quy tắc/tuyến đường mà bạn không muốn tuân thủ điều kiện này phía trên các tuyên bố tuyến đường đó.

tức là

$route['myroute'] = "myroute"; 
$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

tôi thấy rằng điều này tạo ra một hệ thống tốt đẹp, nơi tôi có thể có nhiều người sử dụng biến như được định nghĩa ở đâu tôi có thể chuyển hướng chúng một cách dễ dàng dựa trên những gì họ đại diện cho thông qua một bộ điều khiển.

+0

Hmm .. Vì vậy, nếu tôi hiểu chính xác, tôi nên xác định tất cả các bộ điều khiển của tôi trong tệp 'routes.php' và sau đó ở phía dưới, tôi xác định quy tắc chuyển hướng? Ảnh hưởng đến hiệu suất của trang này? – Puzo

+0

@Puzo Đọc bình luận của bạn, đó là khá nhiều những gì tôi đã cố gắng để nói trong câu trả lời của tôi .. –

+0

@Chamilyan Làm thế nào tôi có thể thay thế # bằng/trong url với định tuyến – Bugfixer

1

Một cách khác sẽ được khai báo một mảng với bộ điều khiển intenal của bạn và chuyển hướng mọi thứ khác với bộ điều khiển sử dụng như thế này trong tập tin của bạn từ routes.php CodeIgniter:

$controllers=array('admin', 'user', 'blog', 'api'); 
if(array_search($this->uri->segment(1), $controllers)){ 
    $route['.*'] = "polica/ogled/$1"; 
} 
Các vấn đề liên quan