如何写出高质量的PHP代码-php教程

资源魔 25 0

写给初生牛犊没有怕虎的童鞋们,年夜佬可随便摘看 本章基于PHP Laravel

媒介

常常会有人问

  • 目次若何设计比拟好?
  • 代码若何散布好?
  • 怎样写一个可保护的名目?

“烂”名目我也没少写,如下是参考互联网各年夜佬的文章总结及集体开发经历而来.

Controller

clipboard.png

Controller望文生义是管制器,正在入门PHP的时分,就晓得Controller代表MVC中的C层,MVC自身的概念就代码别离,教你若何若何将营业离开,但面对着营业的一直倒退,代码的复杂度也随之进步,性能与性能之间的链接盘根错节,最初你的MVC就变为了下图,以是仅仅依靠MVC的设计思维曾经无奈撑持一直倒退的营业。

如今咱们将Controller的义务以及才能从新界说,管制器仅仅管制Http Reqeust的申请,这样就合乎了SOLID 繁多性能准则.

clipboard.png

间接将营业代码写正在Controller中,会使患上代码及其痴肥,不容易于保护以及扩大

<?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的概念

Service

Service自身译为效劳

  • 将内部办法,公共办法注入到Service
  • 将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全副写正在Service中,那只不外是将Controller的痴肥转移到了Service,那Service就不甚么存在乎义了。 以是咱们需求持续宰割Service,将对数据库的R操作自力进去,由于CUD的操作根本是一向没有变的,而R操作依据营业的复杂度则变的多姿多彩。以是自力R操作。这个时分咱们援用Repository的概念。

Repository

咱们应用Repository辅佐Model,将相干的查问逻辑封装到没有同的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比拟对立简略就能够放正在一同了吗?谜底是NO,咱们援用一个新的名词Action。

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

除了模版(V)等HTML,JS等,还需求一些其余的规定,或许说是形式去完成一些代码的解耦合,如下再也不提供代码案例。

Co妹妹on

译为公共的,罕用的,再局部开发中,你可能需求一些公共的办法(并不是公共的类,例如邮件发送等,用他其实不合适),比方查问用户余额,查问用户能否注册或许能否正在线,天生定单号等。应用Co妹妹on更要简略。他更像一个公共函数库的样子

clipboard.png

Event

没有关怀执行后果时能够选应用,不外Event的Listen也是提供了行列步队。

Exception

没有要将你的一切谬误提醒都应用Return前往,不少时分你的前往未必是你的前往

称谢

感激列位同窗看完这篇文章,假如你有新的设法主意欢送正在评论区探讨.

保举教程:《php教程》

以上就是若何写出高品质的PHP代码的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学 后端 Laravel MVC

抱歉,评论功能暂时关闭!