Laravel命名空间路由

时间:2017-11-22 08:49:14

标签: php laravel routing

我的控制器位于与Laravel原生App\Http\Controllers不同的文件夹中。我正在使用自定义Lib\MyApp文件夹,里面有模块。每个模块都有自己的控制器,模型等。我添加到composer.json自动加载到app\lib

我所做的是更改RouteServiceProvider命名空间:

protected $namespace = 'App\Lib\MyApp';

我在所有事情之后都做了composer dump-autoload

内部MyApp是一个Landing\Controller文件夹,里面有实际的控制器类。

尝试1(理想):

我想这样称呼我的路线:

Route::get('/', 'Landing\Controller\LandingController@index');

但是这样我得到ReflectionException,即使

,也找不到该课程

尝试2:

Route::get('/', '\Landing\Controller\LandingController@index');

当我刷新页面时,尾随斜杠删除了命名空间部分,并且仍然说类不存在。

尝试3:

Route::get('/', 'MyApp\Landing\Controller\LandingController@index');

这只会复制MyApp文件夹,找不到类。

尝试4(工作,但不要那样)

Route::get('/', '\MyApp\Landing\Controller\LandingController@index');

这很好,虽然我想摆脱\MyApp\部分。

这样的事情可能吗?

3 个答案:

答案 0 :(得分:2)

Laravel 中添加命名空间的方法有很多种

Route::group(['prefix' => 'prefix','namespace'=>'Admin'], function () {
    // your routes with"App\Http\Controllers\Admin" Namespace
});

Route::namespace('Admin')->group(function () {
    // your routes with"App\Http\Controllers\Admin" Namespace
});

//single route
Route::namespace('Admin')->get('/todo', 'TaskController@index');

//single route
Route::get('/todo', 'Admin/TaskController@index');


// by ->namespace
Route::prefix('admin')->namespace('Admin')->group(function () {
    // route code
});

答案 1 :(得分:1)

您可以为此目的使用路由中的命名空间:

Route::namespace('Landing\Controller')->group(function () { 
    Route::get('/', 'LandingController@index'); 
    // + other routes in the same namespace 
});

并且不要忘记将命名空间添加到控制器:

<?php namespace App\Lib\MyApp\Landing\Controller;

PS:如果Lib在App文件夹中,则无需在composer文件中添加任何内容,因为App文件夹在psr-4中注册,并且这将加载所有此名称中的文件为您提供。

答案 2 :(得分:0)

对于“laravel 8” 这里我给出了一个带有命名空间和前缀的示例,但您也可以根据需要使用任何一个。

我使用命令在控制器目录中创建了控制器

<块引用>

php artisan make:controller Admin/StoriesController

Route::namespace('Admin')->prefix('admin')->group(function(){
    Route::get('/deleted_stories', 
    '\App\Http\Controllers\Admin\StoriesController@index')->name
    ('admin.stories.index');
});