democracyapps/domain-context

实用工具,便于将路由层次结构的一部分映射到单独的域名

dev-master 2015-03-25 11:36 UTC

This package is not auto-updated.

Last update: 2024-09-28 17:23:03 UTC


README

这是一个简单的Laravel实用工具,便于将路由层次结构的一部分映射到单独的域名。

例如,假设贵公司有一个名为coolmarketplace.com的网站,该网站允许其他公司注册以列出他们的产品。除了您提供的任何用于突出显示有趣或流行的产品的页面外,每个公司都有自己的页面,由他们选择的短代码标识。例如,Golly Gee Widgets的页面为http://coolmarketplace.com/golly

然而,他们还希望这个迷你网站出现在他们自己的域名下,例如http://market.gollygee.com,可能具有不同的样式、链接等。您将需要根据是作为coolmarketplace.com/golly还是market.gollygee.com访问,对同一个迷你网站进行不同的应用逻辑或展示。

该实用工具创建了一个单例DomainContext对象,可用于测试当前请求是否通过应该与默认设置不同的域名传入,并获取与该域名关联的内部对象的标识符。

使用说明

安装

首先通过Composer安装此包。

{
    "require": {
        "democracyapps/domain-context": "dev-master"
    }
}

将服务提供者添加到app.php

// app/config/app.php

'providers' => [
    '...',
    'DemocracyApps\DomainContext\DomainContextServiceProvider',
];

为了方便,您还可以将外观添加到app.php

'aliases' => [
    '...',
    'DomainContext' => 'DemocracyApps\DomainContext\DomainContextFacade',
    ];

配置参数

接下来,运行以下命令发布配置文件

php artisan vendor:publish

并编辑'config/domain-context.php'。该软件包中目前使用了四个配置设置。

mapped_domain_storage (默认: 'config')

您可以在配置文件或数据库表中指定要映射的域名。此参数确定使用哪个。默认情况下,映射的域名简单地添加到配置文件本身(请参阅mapped_domains参数)。如果mapped_domain_storage设置为'database',则将查找由mapped_domain_table_name参数指定的表。

mapped_domains (默认: 空数组)

如果mapped_domain_storage设置为'config',则此数组提供了正在映射的域名及其关联标识符的列表。标识符可以是任何类型。以下示例中,http://market.gollygee.com是一个映射的域名,并在内部与短代码'golly'关联。更常见的使用可能是将其与数据库模型ID关联,如第二行所示。

    'mapped_domains' => [
        'market.gollygee.com' => 'golly',
        'stdexample.com' => 133
    ]

mapped_domain_table_name (默认: 'mapped_domains')

如果mapped_domain_storage设置为'database',则将在由该参数指定的表中搜索映射域的信息。它期望表具有'domain_name'列和'identifier'列。它不对这些列执行任何操作 - 在请求时简单地返回它们(如下所示),并将当前域与表条目的匹配解释为表示该域已映射。

view_variable_name (默认: 'domainContext')

DomainContext对象自动通过默认的$domainContext变量对所有Laravel视图可用。可以使用此参数指定不同的变量名。

如何使用

让我们以本readme顶部的示例为例。

在实际中,您会在响应传入域名时实现逻辑或展示的变体,常见的地方有三个:routes.php 文件、控制器和视图。逻辑当然是您自己的。您只需要一个简单的方法来判断您是否在已映射的域名中,如果是,相关的客户端对象应该是什么。

通过三个方法,DomainContext 对象提供了这种功能:DomainContext::isMapped()、DomainContext::getDomain() 和 DomainContext::getDomainIdentifier()(当然,您也可以通过 app()->make 来获取对象)。

第一个是一个布尔值,表示当前域名是否已经映射。第二个告诉您域的名称(在上面的示例中,它将返回 'market.gollygee.com')。最后一个返回要使用的标识符,例如从表中加载客户端信息(如第一个示例中的 'golly')。

要在路由文件中使用它们,最简单的方法是使用外观。例如

if (\DomainContext::isMapped()) {
    require app_path().'/Http/Routes/mapped.php'; // all the routes associated with mapped domains
}
else {
    require app_path().'/Http/Routes/market.php'; // all the routes associated with the platform
}

当然,外观也可以在控制器或其他任何地方使用,但您也可以简单地将 DomainContext 对象注入到控制器方法中,例如

public function show($id, DomainContext $context)
{
    $short = $context->getDomainIdentifier();
    $tc = Company::where('short_name', '=', $short)->first();
    ...

最后,在视图中,DomainContext 总是可用作为 $domainContext(或者在配置文件中设置的变量名)。例如,您可能有一部分菜单取决于域名是否已映射

<li class="dropdown">
    @if ($domainContext->isMapped())
        <a href="/products" class="dropdown-toggle" >All Products</a>
    @else
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Market</a>
        <ul class="dropdown-menu">
            <li><a href="/market/products">Products</a></li>
            <li><a href="/market/companies">Companies</a></li>
        </ul>
    @endif
</li>

问题和计划

此模块正在用于几个正在积极开发的产品,并可能有所发展。如果您发现错误或对功能有请求,请在此处创建问题,在推特上找到我(@ejaxon)或提交一个拉取请求。