2010-06-07 35 views
11

Tôi đang cố gắng đối sánh tên miền phụ với id khách hàng trong symfony.Tên miền phụ động của Symfony

tức là tôi có customer1.example.com và customer2.example.com

Tên miền được lưu trữ trong bảng.

Khi người dùng truy cập customer1.example.com, tôi muốn nhận tên miền phụ, tra cứu tên miền trong cơ sở dữ liệu, khi đã khớp, sau đó sẽ triển khai cấu hình ứng dụng cho khách hàng đó và sau đó lưu trữ customer_Id trong một thuộc tính toàn cầu vì vậy tôi biết chính xác khách hàng nào tôi đang xử lý với việc cung cấp toàn bộ ứng dụng. Máy chủ ảo sẽ có tên máy chủ ký tự đại diện có liên quan.

Bạn đã đạt được điều này chưa và nếu có thì làm cách nào? Nếu không, bất kỳ ý tưởng nào cũng sẽ là một trợ giúp tuyệt vời!

Tôi đang nghĩ đến việc sử dụng bộ lọc để thực hiện.

:-)

+1

+1 câu hỏi hay :-) – richsage

+0

Cảm ơn bạn! Hy vọng rằng ai đó biết câu trả lời! :-) – Flukey

Trả lời

3

cũng sẽ cần yo đặt miền của bạn làm miền ký tự đại diện, nếu không bạn sẽ cần phải tạo từng tên miền phụ theo cách thủ công cho mỗi khách hàng.

một giải pháp mà không phải là quá phụ thuộc bản giao hưởng được sử dụng một .htaccess

<IfModule mod_rewrite.c> 
    Options +FollowSymLinks 
    Options +Indexes 
    RewriteEngine On 
    RewriteBase/
    RewriteCond %{HTTP_HOST} !www.domain.com$ [NC] 
    RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).domain.com [NC] 
    RewriteRule (.*) $1?sub=%2&page=$1&domain=%{HTTP_HOST} [QSA,L] 
<IfModule> 

mã mà về cơ bản sẽ gửi đến trang bạn yêu cầu tên miền phụ, tên miền và các trang yêu cầu. sau đó trong php, bạn có thể kiểm tra xem nó có bằng tên người dùng của khách hàng hay không. và cho phép bạn cũng sử dụng tên miền trỏ hướng cho khách hàng của bạn cùng một lúc.

tôi hy vọng điều đó sẽ hữu ích.

0

Vì bạn muốn tải ứng dụng, bộ lọc khác nhau sẽ không hữu ích. Chỉ cần sử dụng frontcontroller (index.php) để giải nén subdomain, và nếu thư mục app tồn tại, hãy tải ứng dụng (else 404). Bạn thậm chí có thể lưu trữ id trong cấu hình ứng dụng.

+0

Hey Marek. Tôi không triển khai một ứng dụng khác, tôi chỉ muốn sử dụng tên miền sudomain làm biến tham số. Ví dụ: Thay vì có http://example.com/company1/admin, tôi muốn có http://company1.example.com/admin Ứng dụng tương tự cho mọi khách hàng, nhưng tôi đang sử dụng tên miền phụ để có được các công ty dữ liệu có liên quan. Tôi đã thành công trong đêm qua. Tôi đã tạo một bộ lọc (domainMatchFilter.class.php). – Flukey

+0

Tôi đã lấy tên miền phụ, đã thực hiện tìm kiếm trên bảng khách hàng để khớp với tên miền (trường tên miền trong bảng có chỉ mục trên đó). Sau khi tìm thấy nó thiết lập một biến cấu hình với đối tượng khách hàng từ tập kết quả. tức là sfConfig :: set ("khách hàng", $ khách hàng). Nếu không tìm thấy khách hàng nào, nó sẽ chuyển hướng đến trang chủ (example.com). Bạn có nghĩ rằng sẽ tốt hơn khi chuyển hướng đến một trang cho biết khách hàng này không tồn tại, v.v. không? Bộ lọc này chạy trên mọi yêu cầu trang chậm một chút vì nó truy vấn cơ sở dữ liệu mọi lúc, tuy nhiên, đó là cách duy nhất tôi biết cách thực hiện. – Flukey

+0

Tôi muốn nó hoạt động như uservoice.com. Bạn đăng ký và bạn có tên miền riêng của mình, tức là company1.uservoice.com, v.v. đẹp hơn nhiều so với uservoice.com/company1 – Flukey

0

Tôi đang làm một việc tương tự. Lưu ý, tôi chưa thử thiết lập chính xác này.

$tokens = explode('.', $_SERVER['SERVER_NAME'], 2); 
$app = $tokens[0] == 'www' ? 'default' : $tokens[0]; //assumes you aren't allowing www.app.example.com, change if you are 

try 
{ 
    $appConfiguration = ProjectConfiguration::getApplicationConfiguration($app, 'prod', false); 
} 
catch(InvalidArgumentException $e) //thrown if app doesn't exist 
{ 
    $fallbackConfiguration = ProjectConfiguration::getApplicationConfiguration('default', 'prod', false); 
    $context = sfContext::createInstance($fallbackConfiguration); 
    $request = $context->getRequest(); 
    $request->setParameter('module', 'default'); //set what route you want an invalid app to go to here 
    $request->setParameter('action', 'invalidApplication'); 
    $context->dispatch(); 
} 
if (isset($appConfiguration)) 
{ 
    sfContext::createInstance($appConfiguration)->dispatch(); 
} 
0

Hãy xem sfDomainRoutePlugin - nó thực hiện những gì bạn muốn. Tuy nhiên, trong phiên bản hiện tại, bạn không nhận được chức năng Propel hoặc DoctrineRoute, điều đó có nghĩa là bạn phải tra cứu khách hàng theo cách thủ công dựa trên thông số tên miền phụ được trả về từ plugin. Ví dụ:

app/frontend/config/routing.yml

# pick up the homepage 
homepage: 
    url:  /
    class:  sfDomainRoute 
    param:  { module: homepage, action: index } 
    requirements: 
    sf_host: [www.example.com, example.com] 

# catch subdomains for customers 
customer_subdomain: 
    url:  /
    class:  sfDomainRoute 
    param:  { module: customer, action: index } 

app/frontend/modules/khách hàng/actions.class.php

public function executeIndex(sfWebRequest $request) 
{ 
    // get the subdomain parameter 
    $this->subdomain = $request->getParameter('subdomain'); 
    // retrieve customer (you have to create the retrieveBySubdomain method) 
    $this->customer = CustomerPeer::retrieveBySubdomain($this->subdomain); 
} 

Đây chỉ là một ví dụ, nhưng tôi sử dụng một cách tiếp cận tương tự bản thân mình, và các plugin hiện những gì được quảng cáo. Chúc may mắn.

Nếu bạn thích mạo hiểm, bạn có thể xem Chương 2 trong phần "Thêm với sách symfony". Điều này sẽ giúp bạn hiểu mã trong sfDomainRoutePlugin.

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