[Накопление добродетелей] Как писать меньше «плохого» PHP-кода

задняя часть PHP
[Накопление добродетелей] Как писать меньше «плохого» PHP-кода

Написано для детской обуви, которая не боится тигров, начальник может забрать их по желанию Эта глава основана на PHP Laravel.

предисловие

часто спрашивают

  • Как лучше оформить каталог?
  • Как распространяется код?
  • Как написать поддерживаемый проект?

О "плохих" проектах я тоже писал.Далее основано на конспекте статей и личном опыте разработки крупных интернет-гигантов.

Controller

clipboard.png

Контроллер, как следует из названия, является контроллером. Когда вы начинаете работать с PHP, вы знаете, что Контроллер представляет уровень C в MVC. Сама концепция MVC заключается в разделении кода. Он учит вас разделять бизнес. столкнувшись с непрерывным развитием бизнеса и сложностью кода, с улучшением связи между функциями становятся сложными, и, наконец, ваш MVC становится следующей фигурой, поэтому полагаться только на идею дизайна MVC больше не может поддерживать непрерывный развитие бизнеса.

Теперь мы переопределяем задачи и возможности контроллера, контроллер управляет только запросом Http Reqeust, что соответствует принципу единственной функции SOLID.

clipboard.png

Написание бизнес-кода непосредственно в контроллере сделает код чрезвычайно раздутым и сложным в обслуживании и расширении.

<?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

Сам сервис транслируется в сервис

  • Внедрить внешние методы, публичные методы в сервис
  • Внедрить сервис в контроллер

clipboard.pngкак на картинке выше

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-совместимая инверсия зависимостей

clipboard.png

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

clipboard.png

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;
		}
	}

Логика приведенного выше кода показана на рисунке ниже.clipboard.pngПомимо HTML, JS и т. д., таких как шаблон (V), требуются какие-то другие правила или способы реализации разделения некоторых кодов.Следующие примеры кода не приводятся.

Common

В переводе как общедоступный, обычно используемый, в некоторых разработках могут понадобиться некоторые общедоступные методы (не общедоступные классы, такие как отправка почты и т. д., его использование не подходит), такие как запрос баланса пользователя, запрос о том, является ли пользователь зарегистрированы или онлайн. , генерировать номер заказа и т. д. Использование Common еще проще. Он больше похож на общедоступную библиотеку функций

clipboard.png

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 поиск【Понять в одной статье】Распространяйте положительную энергию технологий и продолжайте осваивать новые знания.