私はかなり長い間見回っていましたが、何も招集されませんでした。
実装するための最良のアプローチと実践は何ですかVue MPA laravelのアーキテクチャ
かなり検索しました。しかし、あなたに明確なアイデアを与えるものは何もありません。あなたの答えは大いに役立ちます。簡潔にしてください。
ポイントに答えることも役立ちます:
すでに使用したいくつかのオプション:
基本的にlaravelはVueアプリケーションをレンダリングし、すべてのリクエストはAPIを通過します。
追加のサーバーをセットアップしたり、クロスオリジンを準備したりする必要があるため、これには時間がかかります。
Laravelを使用して、ページ内のコンポーネント/要素のすべてのビュー+ vuejsをレンダリングできます。
-
すべてのオプションはテスト可能+スケーラブルです。
また、開始方法にも依存します(今後アプリをどのように分離するか心配する必要がありますか?Laravel + Vueは)、チームの仕組み(フロントエンドチームは本当にlaravelをセットアップする必要がありますか、それとも心配するだけですフロントエンドコード?)など.
質問に答えたかどうかわからない場合は、コメントを残してください。
「あなたの理解とプロジェクトのニーズに合ったもの」以外について話すことは本当に何もないので、あなたは明確な何かを見つけていません。自分自身veryがわからない場合は、自分にとって意味のあることを何でもしてください。さらに経験を積んだら、構造を再調整してください。
また、システムアーキテクチャに関する本を読んでください。それらは大いに役立ちます。
laravel=をデータAPIとして使用し、Vue Laravelとは別にしますか?
これにより、私はあなたがSPAを意味すると仮定していますか?正直なところ、アプリケーションが小さい場合は、これで問題ないと思います。
大規模なアプリケーションは、SPAである場合、保守が困難になる傾向があります。
読む: https://medium.com/@NeotericEU/single-page-application-vs-multiple-page-application-2591588efe58
APIエンドポイントとしてLaravel=を使用することになった場合、Bladeなどの付属品がないため、削除済みバージョンの Lumen を使用します。LumenはAPIエンドポイントとして機能するようにバージョンを削除しました。
SPAとMPAのハイブリッドを実装するための最良のアプローチ。
ハイブリッドとして4+プロジェクトを構築しようとした私の経験から、最適な構造を見つけました。
私の例は、「投稿」を保存するアプリについてです。
これにより、コードを維持する際の頭痛の種が大幅に減り、コードでDRY(Do n't Repeat Yourself))コンセプトが維持されます。
App\Repositories\
新しいクラスPostsRepository
を作成します。これはデータベースと通信するもので、ほとんどのロジックが含まれます。
App\Services\
を作成します新しいクラスPostsService
を作成します。これには、コンストラクターにPostsRepository
が含まれます。
サービスクラスは、WebコントローラーからでもAPIコントローラーからでもユーザーの入力を処理するものになります。
<?php
namespace App\Service;
use App\Repositories\PostsRepository;
class PostsService;
{
protected $repository;
public function __construct(PostsRepository $repository)
{
$this->repository = $repository;
}
}
Webコントローラーの場合、通常のようにコントローラーを作成します。
php artisan make:controller PostsController
APIコントローラーの場合、コントローラーをApiフォルダー内に作成します。
php artisan make:controller Api\PostsController
最後のコマンドは、ディレクトリApp\Http\Controllers\Apiを作成し、その中にコントローラーを配置します。
リキャッピング
これで、スタートポイント(web/api)に適した結果を返すさまざまなコントローラーができました。
両方の(web/api)コントローラーが検証対象のデータを送信する(およびリポジトリーがアクションを実行する)サービスがあります。
例:
<?php
namespace App\Http\Controllers;
use App\Service\PostsService;
class PostsController extends Controller
{
protected $service;
public function __construct(PostsService $service)
{
$this->service = $service;
}
public function index()
{
/**
* Instead of returning a Blade view and
* sending the data to it like:
*
* $posts = $this->service->all();
* return views('posts.index', compact('posts'));
*
* We go ahead and just return the boilerplate of
* our posts page (Blade).
*/
return view('posts.index');
}
}
...
<?php
namespace App\Http\Controllers\Api;
use App\Service\PostsService;
class PostsController extends Controller
{
protected $service;
public function __construct(PostsService $service)
{
$this->service = $service;
}
/**
* Returns all posts.
*
* A vue component calls this action via a route.
*/
public function index()
{
$posts = $this->service->all();
return $posts;
}
/**
* Notice we don't have a store() in our
* Web controller.
*/
public function store()
{
return $this->service->store();
}
}
...
<?php
namespace App\Services;
use App\Repositories\PostsRepository;
class PostsService extends Controller
{
protected $repository;
public function __construct(PostsRepository $repository)
{
$this->repository = $repository;
}
public function all()
{
$posts = $this->repository->all();
return $posts;
}
public function store()
{
$request = request()->except('_token');
$this->validation($request)->validate();
return $this->repository->store($request);
}
public function validation(array $data)
{
return Validator::make($data, [
'content' => 'required|string|max:255',
//
]);
}
}
PostsRepositoryでは、実際にデータを保存するメソッドを呼び出します。例えば。 Post::insert($request);
。
Route::prefix('api/v1')->middleware('auth')->group(function() {
Route::post('posts/store', 'Api\PostsController@store')->name('api.posts.store');
});
APIルーティングを->name()
にすると、phpunitテストを作成するときに役立ちます。
それらは単純に単純化する必要があります。
views/posts/index.blade.php
:
@extends('layouts.app', ['title' => trans('words.posts')])
@section('content')
<!-- Your usual grid columns and stuff -->
<div class="columns">
<div class="column is-6">
<!-- This comp. can have a modal included. -->
<new-post-button></new-post-button>
<div class="column is-6">
<posts-index-page></posts-index-page>
</div>
</div>
@endsection
https://github.com/pablohpsilva/vuejs-component-style-guide
したがって、これらのVueコンポーネントはresources/assets/js/components/posts/
に存在する可能性があり、/posts/
の中に、IndexPage
、CreateModal
、EditModal
などのタイトルのフォルダーがあり、各フォルダーには.vue
およびREADME.md
があります。
<posts-index-page>
でindex.blade.php
を使用し、必要なときに<post-create-modal>
と<edit-post-modal>
をドロップします。
すべてのvueコンポーネントは、Routesファイルで指定したAPIエンドポイントを使用します。