Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <?php |
||
| 29 | class SpecialUserLogout extends UnlistedSpecialPage { |
||
| 30 | function __construct() { |
||
| 33 | |||
| 34 | public function doesWrites() { |
||
| 37 | |||
| 38 | function execute( $par ) { |
||
|
|
|||
| 39 | /** |
||
| 40 | * Some satellite ISPs use broken precaching schemes that log people out straight after |
||
| 41 | * they're logged in (bug 17790). Luckily, there's a way to detect such requests. |
||
| 42 | */ |
||
| 43 | if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&' ) !== false ) { |
||
| 44 | wfDebug( "Special:UserLogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" ); |
||
| 45 | throw new HttpError( 400, $this->msg( 'suspicious-userlogout' ), $this->msg( 'loginerror' ) ); |
||
| 46 | } |
||
| 47 | |||
| 48 | $this->setHeaders(); |
||
| 49 | $this->outputHeader(); |
||
| 50 | |||
| 51 | // Make sure it's possible to log out |
||
| 52 | $session = MediaWiki\Session\SessionManager::getGlobalSession(); |
||
| 53 | View Code Duplication | if ( !$session->canSetUser() ) { |
|
| 54 | throw new ErrorPageError( |
||
| 55 | 'cannotlogoutnow-title', |
||
| 56 | 'cannotlogoutnow-text', |
||
| 57 | [ |
||
| 58 | $session->getProvider()->describe( RequestContext::getMain()->getLanguage() ) |
||
| 59 | ] |
||
| 60 | ); |
||
| 61 | } |
||
| 62 | |||
| 63 | $user = $this->getUser(); |
||
| 64 | $oldName = $user->getName(); |
||
| 65 | |||
| 66 | $user->logout(); |
||
| 67 | |||
| 68 | $loginURL = SpecialPage::getTitleFor( 'Userlogin' )->getFullURL( |
||
| 69 | $this->getRequest()->getValues( 'returnto', 'returntoquery' ) ); |
||
| 70 | |||
| 71 | $out = $this->getOutput(); |
||
| 72 | $out->addWikiMsg( 'logouttext', $loginURL ); |
||
| 73 | |||
| 74 | // Hook. |
||
| 75 | $injected_html = ''; |
||
| 76 | Hooks::run( 'UserLogoutComplete', [ &$user, &$injected_html, $oldName ] ); |
||
| 77 | $out->addHTML( $injected_html ); |
||
| 78 | |||
| 79 | $out->returnToMain(); |
||
| 80 | } |
||
| 81 | |||
| 82 | protected function getGroupName() { |
||
| 85 | } |
||
| 86 |
Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable: