私はLaravelが初めてです。アプリを整理しておくために、コントローラーをコントローラーフォルダーのサブフォルダーに入れたいと思います。
controllers\
---- folder1
---- folder2
コントローラーにルーティングしようとしましたが、laravelが見つかりません。
Route::get('/product/dashboard', 'folder1.MakeDashboardController@showDashboard');
私は何を間違えていますか?
上記のLaravel 5.3の場合:
php artisan make:controller test/TestController
これにより、test
フォルダーが存在しない場合は作成され、その後TestController
フォルダーが作成されます。
TestController
は次のようになります。
<?php
namespace App\Http\Controllers\test;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class TestController extends Controller
{
public function getTest()
{
return "Yes";
}
}
その後、この方法でルートを登録できます。
Route::get('/test','test\TestController@getTest');
フォルダーにコントローラーを追加します。
controllers\
---- folder1
---- folder2
フォルダーを指定せずにルートを作成します。
Route::get('/product/dashboard', 'MakeDashboardController@showDashboard');
走る
composer dump-autoload
そしてさらに試みる
Laravel 5を使用する場合は、サブディレクトリ内でコントローラーの名前空間を設定する必要があります(Laravel 5はまだ開発中であり、変更は毎日行われています)
次のようなフォルダー構造を取得するには:
Http
----Controllers
----Admin
PostsController.php
PostsController.php
名前空間Admin\PostsController.phpファイルは次のようになります。
<?php namespace App\Http\Controller\Admin;
use App\Http\Controllers\Controller;
class PostsController extends Controller {
//business logic here
}
次に、このためのルートは次のとおりです。
$router->get('/', 'Admin\PostsController@index');
そして最後に、composerまたは職人ダンプのいずれかを取得しないでください。
composer dump-autoload
または
php artisan dump
1.次のようにサブフォルダーを作成します。
app
----controllers
--------admin
--------home
2. app/routes.phpでコードを設定します
<?php
// index
Route::get('/', 'Home\HomeController@index');
// admin/test
Route::group(
array('prefix' => 'admin'),
function() {
Route::get('test', 'Admin\IndexController@index');
}
);
?>
3. app/controllers/admin/IndexController.phpにsthを書き込みます。例:
<?php
namespace Admin;
class IndexController extends \BaseController {
public function index()
{
return "admin.home";
}
}
?>
4.サイトにアクセスします。例:localhost/admin/testページに「admin.home」が表示されます
pS:私の貧しい英語を無視してください
** Laravel 5またはLaravel 5.1 LTS両方**の場合、Adminフォルダーに複数のコントローラーがある場合、Route::group
が本当に役立ちます。例えば:
Update:Laravel 5.4で動作
私のフォルダ構造:
Http
----Controllers
----Api
----V1
PostsApiController.php
CommentsApiController.php
PostsController.php
PostAPIController:
<?php namespace App\Http\Controllers\Api\V1;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class PostApiController extends Controller {
...
My Route.phpで、namespace
グループをApi\V1
に設定すると、全体的に次のようになります。
Route::group(
[
'namespace' => 'Api\V1',
'prefix' => 'v1',
], function(){
Route::get('posts', ['uses'=>'PostsApiController@index']);
Route::get('posts/{id}', ['uses'=>'PostssAPIController@show']);
});
サブフォルダを作成するための移動の詳細については、こちらをご覧ください リンク 。
php artisan make:controller admin/CategoryController
ここで、adminはapp/Http/Controllersの下のサブディレクトリで、CategoryControllerはディレクトリ内に作成するコントローラです
方法を見つけました:
/app/start/global.phpにパスを追加するだけです
ClassLoader::addDirectories(array(
app_path().'/commands',
app_path().'/controllers',
app_path().'/controllers/product',
app_path().'/models',
app_path().'/database/seeds',
));
Laravel 4.2を使用しています。ここで私がそれを行う方法:
私はこのようなディレクトリ構造を持っています:
アプリ
-コントローラー
---- admin
------ AdminController.php
コントローラを作成した後、composer.jsonに新しい管理ディレクトリへのパスを追加しました。
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/controllers/admin",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
]
},
次に走りました
composer dump-autoload
その後
php artisan dump-autoload
次に、routes.phpに次のようにコントローラーを含めます。
Route::controller('admin', 'AdminController');
そして、すべてが正常に動作します。
Laravel 5.6では、サブフォルダーの名前がApi
であると仮定します。
コントローラーでは、次の2行が必要です。
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
そして、ルートファイルapi.php
には、次のものが必要です。
Route::resource('/myapi', 'Api\MyController');
Laravel 5.3以降を使用している場合、他の回答で述べられているように複雑さを感じる必要はありません。デフォルトのartisanコマンドを使用して、新しいコントローラーを生成するだけです。たとえば、User
フォルダーにUser
コントローラーを作成する場合。入力します
php artisan make:controller User/User
ルートでは、
Route::get('/dashboard', 'User\User@dashboard');
これを実行するだけで問題はなくなり、localhost/dashboardでページが存在するようになりました。
お役に立てれば。
AdminとFrontのコントローラーを別々のフォルダーに保存すると、名前空間がうまく機能すると思います。
以下のLaravelディレクトリ構造を見てください。これは私にとっては問題ありません。
app
--Http
----Controllers
------Admin
--------DashboardController.php
------Front
--------HomeController.php
「routes/web.php」ファイルのルートは次のようになります
/* All the Front-end controllers routes will work under Front namespace */
Route::group(['namespace' => 'Front'], function () {
Route::get('/home', 'HomeController@index');
});
管理セクションでは、次のようになります
/* All the admin routes will go under Admin namespace */
/* All the admin routes will required authentication,
so an middleware auth also applied in admin namespace */
Route::group(['namespace' => 'Admin'], function () {
Route::group(['middleware' => ['auth']], function() {
Route::get('/', ['as' => 'home', 'uses' => 'DashboardController@index']);
});
});
お役に立てれば!!
最近laravel 5.8でこの問題が発生しましたが、以下のように正しい方法でコントローラーを定義する必要があることを理解しています。
php artisan make:controller SubFolder\MyController // true
これは好きではありません:
php artisan make:controller SubFolder/MyController // false
次のようにroutes/web.phpでコントローラーにアクセスできます:
Route::get('/my', 'SubFolder\MyController@index');
それはあなたのアプリを整理する方法です:
すべてのルートファイル(web.php
、api.php
...)は、ファイル内のmap()
メソッドで宣言されます
\app\Providers\RouteServiceProvider.php
ルートファイルをマッピングするとき、->namespace($this->namespace)
を設定できます。例の中にあります。
より多くのファイルを作成して、プロジェクトをより構造化できることを意味します!
そして、それぞれに異なる名前空間を設定します。
しかし、empty string
名前空間に""
を設定することを好みます
コントローラをネイティブphpの方法でルーティングするように設定できます。例を参照してください。
Route::resource('/users', UserController::class);
Route::get('/agents', [AgentController::class, 'list'])->name('agents.list');
IDEのコントローラー名をダブルクリックして、すばやく便利にアクセスできるようになりました。