Написано для детской обуви, которая не боится тигров, начальник может забрать их по желанию Эта глава основана на PHP Laravel.
предисловие
часто спрашивают
- Как лучше оформить каталог?
- Как распространяется код?
- Как написать поддерживаемый проект?
О "плохих" проектах я тоже писал.Далее основано на конспекте статей и личном опыте разработки крупных интернет-гигантов.
Controller
Контроллер, как следует из названия, является контроллером. Когда вы начинаете работать с PHP, вы знаете, что Контроллер представляет уровень C в MVC. Сама концепция MVC заключается в разделении кода. Он учит вас разделять бизнес. столкнувшись с непрерывным развитием бизнеса и сложностью кода, с улучшением связи между функциями становятся сложными, и, наконец, ваш MVC становится следующей фигурой, поэтому полагаться только на идею дизайна MVC больше не может поддерживать непрерывный развитие бизнеса.
Теперь мы переопределяем задачи и возможности контроллера, контроллер управляет только запросом Http Reqeust, что соответствует принципу единственной функции SOLID.
Написание бизнес-кода непосредственно в контроллере сделает код чрезвычайно раздутым и сложным в обслуживании и расширении.
<?php
namespace App\Http\Controller;
class UserController extends Controller{
public function register(Request $request){
$user = new User();
$user->username = $request->input('username');
$user->password = $request->input('password');
$result = $user->save();
return $result;
}
}
В это время мы должны подумать о том, как разделить бизнес-код.Вводим понятие службы
Service
Сам сервис транслируется в сервис
- Внедрить внешние методы, публичные методы в сервис
- Внедрить сервис в контроллер
как на картинке выше
UserController
<?php
namespace App\Http\Controller;
class UserController extends Controller{
public $request;
protected $userService;
public function __construct(Request $request, UserService $userService)
{
$this->request = $request;
$this->userService = $userService;
}
public function register()
{
//... validation
return $this->userService->register ($this->request->all());
}
}
UserService
<?php
namespace App\Service;
class UserService{
public function register($data)
{
$username = $data['username'];
$password = $data['password'];
$password = encrypt ($password);
$user = new User();
$user->username = $username;
$user->password = $password;
$result = $user->save();
return $result;
}
}
К настоящему времени мы, по крайней мере, полностью отделили бизнес от запроса. Но это все равно неудовлетворительно.Если все дело и CURD прописать в Сервисе, он просто перенесет навороты Контроллера в Сервис, то Сервис не будет иметь смысла. Следовательно, нам нужно продолжать делить службу и отделять R-операцию базы данных, потому что CUD-операция в основном одинакова, а R-операция меняется в зависимости от сложности бизнеса. Итак, независимая операция R. На этот раз мы обращаемся к концепции репозитория.
Repository
Мы используем вспомогательную модель репозитория для инкапсуляции соответствующей логики запроса в различные репозитории, чтобы облегчить обслуживание логического кода.
- Соответствует единому принципу SOLID
- SOLID-совместимая инверсия зависимостей
UserController
<?php
namespace App\Http\Controller;
class UserController extends Controller{
public $request;
protected $userService;
public function __construct(Request $request, UserService $userService)
{
$this->request = $request;
$this->userService = $userService;
}
public function getUserInfo()
{
//... validation
return $this->userService->getUserInfo ($this->request->all());
}
}
UserService
<?php
namespace App\Service;
class UserService{
public $userRepository;
public function __construct(UserRepository $userRepository){
$this->userRepository = $userRepository;
}
public function getUserInfo()
{
return $this->userRepository->getUserInfo($data);
}
}
UserRepository
<?php
namespace App\Repository;
class UserRepository{
public function getUserInfo($data)
{
$userId = $data['user_id'];
$result = User::where('id',$userId)->first();
return $result;
}
}
После решения проблемы с R кто-то спросил, можно ли его собрать, потому что CUD относительно унифицирован и прост? Ответ НЕТ, мы ссылаемся на новое существительное Действие.
Action
Я узнал об этом, прочитав статью @Charlie_Jade
Отдельный каждый файл операции, такой как CreateUser, DeleteUser, UpdateUser
- Соответствует единому принципу SOLID
UserController
<?php
namespace App\Http\Controller;
class UserController extends Controller{
public $request;
protected $userService;
public function __construct(Request $request, UserService $userService)
{
$this->request = $request;
$this->userService = $userService;
}
public function register(){
//... validation
return $this->userService->register($this->request->all());
}
public function getUserInfo()
{
return $this->userService->getUserInfo ($this->request->all());
}
}
UserService
<?php
namespace App\Service;
class UserService{
public function getUserInfo(UserRepository $userRepository)
{
return $this->userRepository->getUserInfo($data);
}
public function register(){
$result = (new CreateUser())->execute($this->request->all());
return $result;
}
}
UserRepository
<?php
namespace App\Repository;
class UserRepository{
public function getUserInfo($data)
{
$userId = $data['user_id'];
$result = User::where('id',$userId)->first();
return $result;
}
}
CreateUser
<?php
namespace App\Action;
use App\Model\Member;
class CreateUser extends CreateUserWallet
{
public function execute(array $data)
{
$models = new Member();
$models->tel = $data['tel'];
$models->password = $data['password'];
$result = $models->save ();
return $result;
}
}
Логика приведенного выше кода показана на рисунке ниже.Помимо HTML, JS и т. д., таких как шаблон (V), требуются какие-то другие правила или способы реализации разделения некоторых кодов.Следующие примеры кода не приводятся.
Common
В переводе как общедоступный, обычно используемый, в некоторых разработках могут понадобиться некоторые общедоступные методы (не общедоступные классы, такие как отправка почты и т. д., его использование не подходит), такие как запрос баланса пользователя, запрос о том, является ли пользователь зарегистрированы или онлайн. , генерировать номер заказа и т. д. Использование Common еще проще. Он больше похож на общедоступную библиотеку функций
Event
Вы можете использовать его, когда вас не волнует результат выполнения, но прослушивание события также предоставляет очередь.
Exception
Не используйте возврат, чтобы вернуть все ваши запросы ошибок. Во многих случаях ваш возврат не может быть вашим возвратом.
Спасибо
Спасибо за чтение этой статьи, если у вас есть новые идеи, пожалуйста, обсудите их в комментариях.
Справочная статья
Архитектура среднего и крупного проекта Laravel:Уууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууу/Ла Равель/арка…
Идеи дизайна архитектуры программы Laravel используют классы действий:сегмент fault.com/ah/119000001…
Как использовать сервисный режим? :oh oh mu lei.IO/la Ravel/Sell…
SOLID принципы объектно-ориентированного проектирования:блог woo woo woo.cn на.com/shanyou/arc…
общаться
Жизнь бесконечна, кодирование бесконечно.
WeChat поиск【Понять в одной статье】Распространяйте положительную энергию технологий и продолжайте осваивать новые знания.