Laravel 4-动态多域路由打破了模型绑定和链接

问题描述 投票:0回答:1

我在Laravel中有一个应用程序堆栈,我们将继续并切换到SaaS模型。为了做到这一点,我只是假设我可以将所有路由包装在具有动态域属性的组中,触发过滤器,然后观察$ route参数以使其发生。

我应该注意到这实际上是一个多租户应用程序,但我们实际上已经决定将这些数据库分开。

所以我们走了:

在我的routes.php文件中,我有以下内容:

Route::group(array('domain' => '{domain}.{tld}', 'before' => 'database.setup'), function()
{
    Route::group(array('prefix' => 'backend', 'before' => 'auth'), function () {
        //all of my routes
    });
});

从上面可以看出,当请求任何路由时,它将转到我在database.setup中定义的filters.php过滤器:

Route::filter('database.setup', function($route, $request){
    $domain = $route->getParameter('domain').'.'.$route->getParameter('tld');

    $details = DB::table('my_table')->where('domain', '=', $domain)->first();
    if($details){

        Config::set('database.connections.account', [
            'driver' => 'mysql',
            'host' => 'my_host',
            'database' => Encryption::decrypt($details->db_hash, 'my_salt'),
            'username' => 'my_username',
            'password' => 'my_password',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'charset'   => 'utf8',
        ]);


        //these are things I was doing to get the URL-permalink working.
        Config::set('app.url', 'http://' . $domain);
        Config::set('app.domain', $domain);
        Config::set('session.domain', '.' . $domain);

        //This actually works exactly as I've intended
        Config::set('database.connections.default', 'account');
        DB::setDefaultConnection('account');
    }
});

现在我最初认为这个工作正常。从表中提取了正确的记录,并且在销毁前一个实例时数据库在运行时没有问题。大。

但是,我注意到我在路线中丢失了所有模型绑定关系。

像这样的路线:

Route::get('/shipping/packages/{package}', 'PackageController@get');

使用如下定义的模型:

Route::model('package', 'Package');

不幸的是总是导致这个:

No query results for model [Package].

现在,如果我从Route中删除我的过滤器,一切正常,但默认数据库将用于我的应用程序的大nono。

最后,所有固定链接结构似乎都完全被打破了。当我将鼠标悬停在链接上时,而不是看到我的域名,例如:

http://example.com/shipping/packages/package

我反而看到:

%7Bdomain%7D.%7Btld%7D/shipping/packages/package

我不知道为什么会这样。

我已经尝试重载响应对象,更改过滤器中的站点配置的设置,以及许多其他事情,但我总是以某种方式遇到相同的问题。

如果有人对如何解决这个问题有任何线索,我将非常感激。

php laravel laravel-4
1个回答
0
投票

好的,我已经弄清楚问题是什么了。

我显然没有充分阅读文档。如果你走过路由器组调用它最终会调用mergeGroup(),在这个特定的函数中,你可以观察到以下代码:

$new['where'] = array_merge(array_get($old, 'where', []), array_get($new, 'where', []));

在这里,我们可以看到他们只是使用堆栈来跟踪这些值,因此{domain}.{tld}的字面解释被推入堆栈。

这最初工作正常,因为我的过滤器实际上明确抓住了它们:

$domain = $route->getParameter('domain').'.'.$route->getParameter('tld');

要解决这个问题,我只需要创建自己的辅助函数来获取$ host(这是一个非常基本的实现,但应该有助于清晰)

$domain = get_domain();

Route::group(array('domain' => $domain, 'before' => 'database.setup'), function()

然后在我的帮助文件中,我添加了get_domain()函数:

if ( ! function_exists('get_domain'))
{
    function get_domain()
    {
        $url_parts = parse_url(Request::root());

        return $url_parts['host'];
    }
}

然后我也可以在我的过滤器中调用get_domain(),它将始终保持同步:

Route::filter('database.setup', function($route, $request){
$domain = get_domain();

这现在完美地运作。

© www.soinside.com 2019 - 2024. All rights reserved.