Je regarde autour de moi depuis un bon moment, mais je n'ai rien eu de convoquant.
Quelle sera la meilleure approche et pratique pour implémenter Vue MPA architecture dans laravel.
Cherché un peu. Mais il n'y a rien qui vous donnera une idée claire. Votre réponse vous aidera beaucoup, veuillez être brève.
Il sera également utile de répondre au point:
Quelques options que j'ai déjà utilisées:
Fondamentalement, laravel rendra l'application Vue et chaque demande passe par une API.
Cela peut prendre plus de temps, car vous devrez configurer un serveur supplémentaire, préparer une origine croisée, etc.
Vous pouvez utiliser Laravel pour rendre toutes les vues + vues pour les composants/éléments de la page.
-
Toutes les options sont testables + évolutives.
Cela dépend aussi de la façon dont vous démarrez ( Dois-je m'inquiéter de la façon dont je vais découpler l'application à l'avenir? Laravel + Vue sera pour bon? ), comment votre équipe fonctionnera ( L'équipe front-end a-t-elle vraiment besoin de configurer laravel ou doit-elle seulement se soucier de le code frontal? ), etc.
Je ne sais pas si j'ai répondu à votre question, sinon, veuillez laisser un commentaire.
Vous n'avez rien trouvé de clair car il n'y a vraiment rien d'autre à dire que "ce qui vous convient et les besoins du projet ". Si vous vous êtes retrouvé très incertain, n'hésitez pas à vous lancer dans tout ce qui vous semble logique, puis réajustez la structure lorsque vous gagnez en expérience.
Lisez également des livres sur l'architecture du système, ceux-ci vous aideront beaucoup.
Est-ce une bonne idée d'utiliser juste laravel comme API de données, et de garder Vue séparé de Laravel?
Par cela, je suppose que vous voulez dire un SPA? Honnêtement, si votre demande est petite, je vois que ça va.
Les applications plus importantes ont tendance à être difficiles à maintenir si elles étaient SPA.
Lire: https://medium.com/@NeotericEU/single-page-application-vs-multiple-page-application-2591588efe58
Si vous finissez par utiliser Laravel comme point de terminaison de l'API, alors utilisez la version simplifiée de celui-ci, Lumen , car il est livré sans lame et quelques autres trucs. Lumen est version allégée pour agir comme un point de terminaison API.
Meilleure approche pour la mise en œuvre hybride de SPA et MPA.
D'après mon expérience ayant tenté de construire plus de 4 projets en tant qu'hybrides, voici ce que j'ai trouvé la structure la plus optimale:
Mon exemple portera sur une application qui enregistre les "publications".
Celui-ci vous évitera beaucoup de maux de tête dans la maintenance de votre code et maintiendra un concept DRY (Ne vous répétez pas)) sur votre code.
App\Repositories\
Créez une nouvelle classe PostsRepository
. Celui-ci sera celui qui communique avec la base de données et contient l'essentiel de la logique.
App\Services\
Créez une nouvelle classe PostsService
. Celui-ci aura le PostsRepository
dans son constructeur.
La classe de service sera une manipulation prenant la saisie de l'utilisateur, que ce soit à partir du contrôleur Web ou du contrôleur API.
<?php
namespace App\Service;
use App\Repositories\PostsRepository;
class PostsService;
{
protected $repository;
public function __construct(PostsRepository $repository)
{
$this->repository = $repository;
}
}
Pour les contrôleurs Web, vous créez le contrôleur comme d'habitude:
php artisan make:controller PostsController
Pour les contrôleurs API, vous créez le contrôleur pour qu'il se trouve dans un dossier Api.
php artisan make:controller Api\PostsController
La dernière commande va créer le répertoire App\Http\Controllers\Api et y placer le contrôleur.
Récapitulation
Nous avons maintenant différents contrôleurs pour renvoyer des résultats appropriés au point de départ (web/api).
Nous avons des services que les deux contrôleurs (web/api) envoient leurs données à valider (et font prendre les mesures par le référentiel).
Exemples:
<?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',
//
]);
}
}
Dans notre PostsRepository, nous appelons en fait des méthodes qui enregistrent les données. Par exemple. Post::insert($request);
.
Route::prefix('api/v1')->middleware('auth')->group(function() {
Route::post('posts/store', 'Api\PostsController@store')->name('api.posts.store');
});
Donner à l'API route une ->name()
aide lorsque vous effectuez des tests de phpunit.
Celles-ci devraient être simplifiées.
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
Donc, ces composants Vue pourraient vivre dans resources/assets/js/components/posts/
Où à l'intérieur de /posts/
J'aurais des dossiers intitulés par exemple IndexPage
, CreateModal
, EditModal
avec chaque dossier ayant son .vue
et README.md
.
J'utiliserais le <posts-index-page>
Dans index.blade.php
Et je déposerais le <post-create-modal>
Et <edit-post-modal>
Quand je veux.
Tous les composants vue utiliseront le point de terminaison API que nous avons spécifié dans notre fichier Routes.