Laravel视图中的命名空间

时间:2015-04-15 17:52:17

标签: php laravel namespaces laravel-5

我正在创建一个“模块化”Laravel应用程序,其中相关类被分组到它们自己的目录和命名空间中,这反映了app/目录和\App命名空间的结构。服务提供者注册视图并定义每个模块的路由。

这种结构非常适合划分所有内容,但问题在于引用视图中的控制器。在主应用程序模块中,要根据控制器操作创建URL,我可以使用{{ action('MyController@index') }}之类的内容,因为所有内容都与\App\Http\Controllers命名空间相关。在模块视图中,我必须执行类似{{ action('\Modules\MyModule\Http\Controllers\MyModuleController@index') }}的工作,但是可以输入和读取很多东西,如果我重命名模块,我需要替换每个实例。

有没有办法让所有视图作为模块的一部分加载使用正确的命名空间?这是我的模块服务提供商的boot()功能中的内容:

foreach($this->modules as $module) { // Module names in CamelCase
    $this->loadViewsFrom(base_path('modules/' . $module . '/Resources/Views'), strtolower($module));
}

可让我引用view('mymoduleinlowercase::folder.viewname')

等视图

我似乎无法在API文档中找到对loadViewsFrom()函数的任何引用。

1 个答案:

答案 0 :(得分:1)

所以看起来它已经基本上自动地使用命名路线。我的ModuleServiceProvider类的路由部分如下所示:

// $this->modules = ['Module1CamelCase', 'Module2CamelCase', ...];
foreach($this->modules as $module) {

    $routefile = base_path('modules\\' . $module . '\\Http\\routes.php');

    if(file_exists($routefile)) {

        $router->group(['namespace' => 'Modules\\' . $module . '\\Http\\Controllers', 'prefix' => strtolower($module)], function($router) use ($routefile) {
            require $routefile;
        });

    }
}

modules/MyModule/Http/routes.php看起来像:

$router->get('/', 'HomeController@index');
$router->resource('myresource', 'MyResourceController');
...

因为我在为每个模块指定路由组的选项时使用了'namespace' => 'Modules\\...,所以我可以在HomeController@index文件中键入routes.php而不是\Modules\MyModule\Http\Controllers\HomeController@index

我还在选项中使用了'prefix' => 'mymodule',所以现在我有mymodule的{​​{1}}和HomeController@index的{​​{1}}。要建立链接,我只需在模板文件中使用mymodule.myresource.show

我没有意识到它已经为我自动命名我的路线了。通过从命令行运行MyResourceController@show,很容易看到。