web-dev-qa-db-ja.com

Laravel 5でモジュール式アプリを構築する方法は?

アプリケーションをモジュールに分割したいと思います。たとえば、基本的なログイン機能、アプリのレイアウト/フォーマット(CSSなど)、ユーザー管理、および日記を含む「コア」モジュールがあります。

後で、アプリケーションに簡単に追加または削除できる連絡先マネージャーなどの他のモジュールを作成することがあります。

アプリのナビゲーションには、存在するモジュールを判別し、それらへのリンクを表示/非表示にするためのロジックがいくつかあります。

ディレクトリ構造、名前空間、その他必要なものに関してこれを行うにはどうすればよいですか?


私はcreolab/laravel-modulesを見ていますが、Laravel 4。

ドキュメントには、各モジュールディレクトリ内にモデル、コントローラー、ビューを配置するように記載されていますが、これはルートでどのように機能しますか?理想的には、各モジュールに独自のroutes.phpファイルを持たせたいと思います。このすべてがhttpおよびresourcesディレクトリにあるものでどのように機能しますか?


私はこのようなことを考えていました:

Module idea

しかし、私はそれをどのように機能させるかわからない。


私はここでチュートリアルを試しました:

http://creolab.hr/2013/05/modules-in-laravel-4/

追加のライブラリなどがなく、純粋なLaravel 5。

エラーメッセージでレンガの壁にぶつかったようです。

_FatalErrorException in ServiceProvider.php line 16:
Call to undefined method Illuminate\Config\Repository::package()
_

以下に関して:

_<?php namespace App\Modules;

abstract class ServiceProvider extends \Illuminate\Support\ServiceProvider
{

    public function boot()
    {
        if ($module = $this->getModule(func_get_args())) {
            $this->package('app/' . $module, $module, app_path() . '/modules/' . $module);
        }
    }

    public function register()
    {
        if ($module = $this->getModule(func_get_args())) {
            $this->app['config']->package('app/' . $module, app_path() . '/modules/' . $module . '/config');

// Add routes
            $routes = app_path() . '/modules/' . $module . '/routes.php';
            if (file_exists($routes)) require $routes;
        }
    }

    public function getModule($args)
    {
        $module = (isset($args[0]) and is_string($args[0])) ? $args[0] : null;

        return $module;
    }

}
_

これは何が原因で、どのように修正できますか?


これについてもう少し頭を下げました。パッケージ/モジュールのルートとビューが機能するのは素晴らしいことです:

_abstract class ServiceProvider extends \Illuminate\Support\ServiceProvider
{

    public function boot()
    {
        if ($module = $this->getModule(func_get_args())) {
            include __DIR__.'/'.$module.'/routes.php';
        }
        $this->loadViewsFrom(__DIR__.'/'.$module.'/Views', 'core');
    }

    public function register()
    {
        if ($module = $this->getModule(func_get_args())) {

        }
    }

    public function getModule($args)
    {
        $module = (isset($args[0]) and is_string($args[0])) ? $args[0] : null;

        return $module;
    }

}
_

最後の質問があります。loadViewsFrom()メソッドがどのように機能するかと同様に、パッケージ内からすべてのコントローラーをどのようにロードしますか?

66
imperium2335

私はそれをすべて理解したようです。

他の初心者に役立つ場合に備えて、ここに投稿します。名前空間を正しくすることです。

Composer.jsonには次のものがあります。

...
"autoload": {
    "classmap": [
        "database",
        "app/Modules"
    ],
    "psr-4": {
        "App\\": "app/",
        "Modules\\": "Modules/"
    }
}

私のディレクトリとファイルは次のようになりました:

enter image description here

名前空間を指定するグループでそのモジュールのコントローラーをラップすることにより、Coreモジュールrouter.phpを動作させました。

Route::group(array('namespace' => 'Modules\Core'), function() {
    Route::get('/test', ['uses' => 'TestController@index']);
});

パッケージのモデルを作成するとき、名前空間を正しくするのと似たようなケースになると思います。

あなたのすべての助けと忍耐に感謝します!

34
imperium2335

解決:

ステップ1:「app /」内にフォルダー「Modules」を作成する


ステップ2:モジュールフォルダーでモジュールを作成します(Module1(adminモジュールと仮定))

 Inside admin module : create the following folder 

 1. Controllers  (here will your controller files)
 2. Views  (here will your View files)
 3. Models  (here will your Model files)
 4. routes.php (here will your route code in this file)

同様に、複数のモジュールを作成できます

Module2( suppose API )
-Controllers
-Views
-Models
-routes.php

ステップ3:「Modules /」フォルダー内にModulesServiceProvider.phpを作成します


ステップ4:ModulesServiceProvider.php内に次のコードを貼り付けます

<?php

namespace App\Modules;

/**
 * ServiceProvider
 *
 * The service provider for the modules. After being registered
 * it will make sure that each of the modules are properly loaded
 * i.e. with their routes, views etc.
 *
 * @author kundan Roy <[email protected]>
 * @package App\Modules
 */

use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class ModulesServiceProvider extends ServiceProvider {

    /**
     * Will make sure that the required modules have been fully loaded
     *
     * @return void routeModule
     */
    public function boot() {
        // For each of the registered modules, include their routes and Views
        $modules=config("module.modules");

        while (list(,$module)=each($modules)) {

            // Load the routes for each of the modules

            if (file_exists(DIR.'/'.$module.'/routes.php')) {

                include DIR.'/'.$module.'/routes.php';
            }

            if (is_dir(DIR.'/'.$module.'/Views')) {
                $this->loadViewsFrom(DIR.'/'.$module.'/Views',$module);
            }
        }
    }

    public function register() { }

}

ステップ5:「config/app.php」ファイル内に次の行を追加します

App\Modules\ModulesServiceProvider::class,

ステップ6:「config」フォルダ内にmodule.phpファイルを作成します

ステップ7:module.php内に次のコードを追加します(パス=>「config/module.php」)

<?php

return [
    'modules'=>[
        'admin',
        'web',
        'api'
    ]
];

注:作成したモジュール名を追加できます。ここにモジュールがあります。

ステップ8:このコマンドを実行する

composer dump-autoload
9
Kundan roy

少し遅れましたが、将来のプロジェクトでモジュールを使用する場合は、モジュールジェネレーターを作成しました。 php artisan make:module nameを介してモジュールを生成します。また、いくつかのモジュールをapp/Modulesフォルダーにドロップするだけで、すぐに使用/作業できます。ご覧ください。時間を節約してください;)

l5-modular

6
Gordon Freeman

Kundan roy:あなたのソリューションは気に入ったのですが、StackOverflowからコードをコピーしました。引用符と半引用符を変更して動作させる必要がありました。SOFはこれらを置き換えると思います。また、base_path()のDirをLaravelの(新しい)形式とよりインラインになるように変更しました。

namespace App\Modules;

/**
* ServiceProvider
*
* The service provider for the modules. After being registered
* it will make sure that each of the modules are properly loaded
* i.e. with their routes, views etc.
*
* @author kundan Roy <[email protected]>
* @package App\Modules
*/

use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class ModulesServiceProvider extends ServiceProvider
{

/**
* Will make sure that the required modules have been fully loaded
* @return void routeModule
*/
   public function boot()
{
    // For each of the registered modules, include their routes and Views
    $modules = config("module.modules");

    while (list(,$module) = each($modules)) {

        // Load the routes for each of the modules
        if(file_exists(base_path('app/Modules/'.$module.'/routes.php'))) {
            include base_path('app/Modules/'.$module.'/routes.php');
        }

        // Load the views                                           
        if(is_dir(base_path('app/Modules/'.$module.'/Views'))) {
            $this->loadViewsFrom(base_path('app/Modules/'.$module.'/Views'), $module);
        }
    }
}

public function register() {}

}
2
gabrielkolbe

pingpong-labs を使用することもできます

ドキュメント ここ

ここに例があります。

プロセスをインストールして確認するだけです。

注:広告を掲載していません。モジュールがサポートされているLaravelで構築されたcmsをチェックしただけです。

2
Jnanaranjan

pingpong/modulesは、モジュールを使用して大規模なlaravelアプリを管理するために作成されたlaravelパッケージです。モジュールは簡単な構造のためのlaravelパッケージのようなもので、いくつかのビュー、コントローラー、またはモデルがあります。

Laravel 4とLaravel 5の両方で動作しています。

Composerを介してインストールするには、次をcomposer.jsonファイルに配置するだけです:

{
    "require": {
        "pingpong/modules": "~2.1"
    }
}

そして、composer installを実行してパッケージを取得します。

新しいモジュールを作成するには、単に次のコマンドを実行します:

php artisan module:make <module-name>

-必須。モジュールの名前が作成されます。新しいモジュールを作成する

php artisan module:make Blog

複数のモジュールを作成します

php artisan module:make Blog User Auth

より多くの訪問のために: https://github.com/pingpong-labs/modules

0