【问题标题】:Passing variables from route group to route functions in Laravel 4在 Laravel 4 中将变量从路由组传递到路由函数
【发布时间】:2014-01-06 19:27:16
【问题描述】:

我安装了一个 Laravel,希望在其上运行 3 个站点(插件域)。我正在使用 Laravel 的路由分组方法来抓取每个域。但是,我需要能够知道我在每个组中使用哪个域。做这个的最好方式是什么?我有以下代码:

Route::group(array('domain' => 'domainone.com'), function($domain = 'domainone')
{
    Route::get('/', function($domain) {
         //
    });
});

^ 这不起作用。

notes 建议在 URL 中使用通配符,例如。

Route::group(array('domain' => '{domain}.com'), function()
{
    Route::get('/', function($domain) {
         //
    });
});

但是,我更喜欢一种不同的方法,因为在本地服务器上的开发过程中我不能真正使用它。有什么方法更像我的第一种方法,我可以手动为每个域声明一个密钥?

编辑:然后我还需要将该域变量传递给控制器​​,我也在努力弄清楚该怎么做?

谢谢。


编辑 2

我的问题是我没有使用子域,我使用的是域;我有 3 个独立的域,用于 3 个在 Laravel 的同一安装上运行的姐妹站点。所以我有 3 个路由组,每个域一个。此外,我不想每次都使用{domain}.com request 域变量,我想在每种情况下告诉 Laravel 域,然后将该域作为变量到每个组内的适当控制器。这是我的示例代码:

$domain1 = 'domain1.com';
$domain2 = 'domain2.com';
$domain3 = 'domain3.com';

Route::group(array('domain' => $domain1), function(){
    Route::get('/', 'PrimaryController@somefunction1');  // <-- I want to access $domain1 in my controller
});
Route::group(array('domain' => $domain2), function(){
    Route::get('/', 'PrimaryController@somefunction2');  // <-- ...and $domain2
});
Route::group(array('domain' => $domain3), function(){
    Route::get('/', 'PrimaryController@somefunction3');  // <-- ...and $domain3
});

【问题讨论】:

    标签: php laravel laravel-4 laravel-routing


    【解决方案1】:

    这是您的第一种方法的一个选项:

    $domain = 'domainone';
    Route::group(array('domain' => $domain.'.com'), function() use ($domain)
    {
        Route::get('/', function() use ($domain) {
             echo "$domain";
        });
    });
    

    你可以通过组将你喜欢的水传递给你的控制器,你只需要再添加一个级别。

    $subdomain = 'atlanta';
    $domain = 'domainone';
    
    Route::group(array('domain' => "$subdomain.$domain.com"), function()
    {
        Route::group(array('domain' => '{subdomain}.{domain}.com'), function()
        {
            Route::get('testdomain', function($subdomain, $domain) {
                dd("closure: subdomain: $subdomain - domain: $domain");
            });
    
            Route::get('testdomaincontroller', 'FooController@index');
        });
    });
    

    通过这样做,您必须了解传递给控制器​​操作的前两个变量将始终是 $subdomain 和 $subdomain。这是一个显示它的控制器,您也可以使用它来测试这些路由:

    class FooController extends Controller {
    
        public function index($subdomain, $domain)
        {
            dd("controller: subdomain: $subdomain - domain: $domain");
        }
    }
    

    你将有两条不同的路线:

    http://yourdomain.dev/testdomain
    http://yourdomain.dev/testdomaincontroller
    

    【讨论】:

    • 对不起,这似乎抛出了一个错误:Missing argument 1 for {closure}() 指的是Route::get('/', function($domain) {这一行
    • 你需要对第二个做同样的事情。已编辑。
    • 太好了,谢谢,安东尼奥,现在正在工作。总结一下,你知道我如何将这个变量传递给控制器​​,即如果我有Route::get('/', 'PrimaryController@index'); 我将如何将域变量发送到这个控制器函数?谢谢。
    • 要在控制器中使用这些,您只需在控制器方法中放置一个参数。 public function controller_method($variable) 将捕获第一个参数组的值并将其分配给控制器函数中名为 $variable 的变量。
    • @James 嗨,我又回到了这个问题......在你的例子中,Route::get() 部分使用带有简单回声的闭包。但我想使用Route::get('/', 'PrimaryController@index'); 发送到我的控制器。在这种情况下,我如何也发送$domain 变量?
    【解决方案2】:

    我通过以下两个步骤完成此操作:

    首先,使用 Laravel 文档示例,我拉下子域并将其分配给 {account}。

    Route::group(array('domain' => '{account}.myapp.com'), function()
    

    从这里开始,您分配给 此组内 路由的任何控制器都将能够将此 {account} 数据注入其功能。

    注意:您不能在构造函数中访问它。 Controller 中需要使用这些数据的每个函数都需要为其创建一个参数。像这样:

    /**
     * The $subdomain variable below will capture the data stored in  
     * {account} in your route group.  Note that you can name this variable 
     * anything you'd like.
     */
    public function showCreateBankAccount($subdomain) { 
    
       echo "This is your subdomain: " . $subdomain;
    
    }
    

    【讨论】:

    • 感谢您的快速回复。不幸的是,它并没有解决我的问题。请参阅我原来的问题的 EDIT 2。
    • 如果你看上面安东尼奥的回答,我想做他所做的,除了将$domain变量传递给控制器​​,而不是他使用的闭包函数。
    • 我明白你现在的情况了。在环境之间配置数据时,我会做类似的事情。您是否考虑过在配置文件中创建新变量,然后在整个应用程序中使用 ''Config::get('app.variable_name') 简单地调用它们?
    • 我不知道配置文件!谢谢你。完美。
    • 不管怎样,您可以使用几乎任何您想存储变量的配置文件。要引用您选择的文件,只需将“app.variable_name”示例中的“app”替换为,例如,如果您使用数据库配置文件,则使用“database.variable_name”。
    猜你喜欢
    • 2015-02-22
    • 2015-03-16
    • 2016-03-03
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多