Gam*_*mer 18 javascript design-patterns multipage laravel vue.js
我一直在四处寻找,但没有得到任何召集.
在laravel中实现Vue MPA架构的最佳方法和实践是什么.
搜索了很多.但没有什么能给你一个清晰的想法.你的回答很有帮助,请简要说明.
回答这一点也很有帮助:
Edu*_*art 22
我已经使用过的一些选项:
基本上laravel将呈现Vue应用程序,并且每个请求都通过API.
这可能需要更多时间,因为您需要设置额外的服务器,准备跨源等.
您可以使用Laravel渲染页面中组件/元素的所有视图+ vuejs.
-
所有选项都是可测试的+可扩展的.
这也取决于你如何开始(我应该担心将来如何解开应用程序?Laravel + Vue会很好吗?),你的团队将如何工作(前端团队是否真的需要设置laravel或者他们只需要担心前端代码?)等
不确定我是否回答了您的问题,如果没有,请发表评论.
你还没有找到任何明确的东西,因为除了"对你的理解和项目需求感觉合适"之外,没有什么可说的.如果你发现自己非常不确定,可以随意潜入对你有意义的事情,然后在获得更多经验时重新调整结构.
另外,阅读有关系统架构的书籍,这些将有很大帮助.
使用laravel作为数据API是一个好主意,并将Vue与Laravel分开?
通过这个,我假设你的意思是SPA?老实说,如果你的申请很小,那么我觉得这很好.
如果是SPA,则较大的应用程序往往难以维护.
阅读:https://medium.com/@NeotericEU/single-page-application-vs-multiple-page-application-2591588efe58
如果你最终使用Laravel作为API端点,那么使用它的精简版Lumen,因为它没有Blade和其他一些东西.Lumen被剥离版本作为API端点.
实现SPA和MPA混合的最佳方法.
根据我尝试将4个以上项目构建为混合项目的经验,以下是我发现的最佳结构:
我的例子是关于保存"帖子"的应用程序.
这个可以让您在维护代码和维护代码中的DRY(不要重复自己)概念时遇到很多麻烦.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
对于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');
}
}
Run Code Online (Sandbox Code Playgroud)
...
<?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();
}
}
Run Code Online (Sandbox Code Playgroud)
...
<?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',
//
]);
}
}
Run Code Online (Sandbox Code Playgroud)
在我们的PostsRepository中,我们实际上调用了保存数据的方法.例如Post::insert($request);.
Route::prefix('api/v1')->middleware('auth')->group(function() {
Route::post('posts/store', 'Api\PostsController@store')->name('api.posts.store');
});
Run Code Online (Sandbox Code Playgroud)
->name()在进行phpunit测试时,为API路由提供帮助.
这些都应该简单明了.
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
Run Code Online (Sandbox Code Playgroud)
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端点.