Silverstripe类似Twitter的url结构

Silverstripe类似Twitter的url结构,silverstripe,Silverstripe,我正在尝试使用silverstripe获得类似twitter的url结构,其中帐户在url根上有自己的url,如: 但也有其他应该可用的路由,比如,不在用户上映射的路由 在控制器上执行类似操作相当容易,但随后您会得到如下结果: 是否有可行的方法在站点的根目录上实现此目的?您需要为此定义路由。第一步是定义所有“特殊”的路由,如搜索等。第二步是捕获所有剩余的请求,并将它们转发给处理成员配置文件页面的控制器。例如: --- Name: customroutes After: framework/ro

我正在尝试使用silverstripe获得类似twitter的url结构,其中帐户在url根上有自己的url,如:

但也有其他应该可用的路由,比如,不在用户上映射的路由

在控制器上执行类似操作相当容易,但随后您会得到如下结果:


是否有可行的方法在站点的根目录上实现此目的?

您需要为此定义路由。第一步是定义所有“特殊”的路由,如搜索等。第二步是捕获所有剩余的请求,并将它们转发给处理成员配置文件页面的控制器。例如:

---
Name: customroutes
After: framework/routes#coreroutes
---
Director:
    rules:
        'search' : 'SearchController'    
        '$Action' : 'MemberProfilesController'    
如果您正在使用MemberProfiles模块


未经测试

您可以使用
https://github.com/silverstripe-australia/silverstripe-linkmapping
模块。它将设置重定向,使url如
http://twitter.com/MyAccountName
将重定向到
http://twitter.com/account/MyAccountName

这不是一个完美的解决方案,但会奏效

我在一个网站上使用过它,所以url
http://designersplace.com.au/heather-levi-interiors
将重定向到
http://designersplace.com.au/designers/profile/heather-levi-interiors

我设置了一个每小时一次的任务来创建/删除这些链接映射。你可以修改它来为你工作

<?php
class ProfileLinkMappingHourlyTask extends HourlyTask {



    function process(){

        //create link mapping records.
        $profiles = DataList::create('Profile')->filter(array('IsPublished' => true));
        foreach ($profiles as $p) {

            //check if mapping record exists.
            if (DataList::create('LinkMapping')->filter(array('MappedLink' => $p->URLSegment))->count() == 0) {
                $linkMapping = new LinkMapping();
                $linkMapping->MappedLink = $p->URLSegment;
                $linkMapping->RedirectType = 'Link';
                $linkMapping->RedirectLink = sprintf('designers/profile/%s', $p->URLSegment);
                $linkMapping->write();

                Debug::dump('Create link mapping: ' . $p->URLSegment);
            }
        }

        //delete un-used link mappings.
        $linkMappings = DataList::create('LinkMapping');
        foreach ($linkMappings as $lm) {
            if (DataList::create('Profile')->filter(array('URLSegment' => $lm->MappedLink))->count() == 0) {
                $query = sprintf('DELETE FROM LinkMapping WHERE ID=%d', Convert::raw2sql($lm->ID));
                DB::query($query);

                Debug::dump('Deleted link mapping: ' . $lm->URLSegment);
            }
        }

    }



}

当然,问题在于系统中有很多默认路由。例如,登录管理员或站点树中定义的页面。这些功能保持正常吗?你可以在yml中设置。e、 g.“之后:cms/modelascontrollerroutes”。您只需确保您的个人资料名称不会与cms的$URLSector谢谢您的想法相冲突。我现在使用一个类似的解决方案,我想摆脱重定向。顾客(和我)不喜欢它。它有一些搜索引擎优化和性能问题。几周前,该系统必须在几分钟内处理90000个请求。也就是说,我们现在正在研究一些改进:-)也许您可以使用linkmappings模块作为工作基础,而不是在找到url时重定向,您可以呈现页面。