За последние 24 часа нас посетил 36781 программист и 7753 робота. Сейчас ищут 1722 программиста ...

Дублирование вызываемого метода

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 14 мар 2023.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Надо что бы метод вызывался только под админом. Каждый раз я вызывал метод внутри другого метода, на проверку на админа:

    PHP:
    1. <?php
    2.  
    3. namespace MyProject\Controllers;
    4.  
    5. use MyProject\Views\View as View;
    6. use MyProject\Models\Admin\Main as Main;
    7. use MyProject\Models\Users\UsersAuthService;
    8.  
    9. class AdminController {
    10.  
    11.     public $db;
    12.     public $view;
    13.     public $user;
    14.     public $main;
    15.  
    16.     public function __construct(View $view) {
    17.         $this->view = $view;
    18.         $this->user = UsersAuthService::getUserByToken();
    19.         $this->main = new Main();
    20.     }
    21.    
    22.     private function checkAdminUser() {
    23.         if (!isset($this->user) || $this->user->user_role !== 'admin') {
    24.             $this->view->render('/errors/404.php', [], 404);
    25.             exit;
    26.         }
    27.     }
    28.  
    29.     public function index() {
    30.  
    31.         $this->checkAdminUser();
    32.         $mode = $this->main->getStatusTestMode();
    33.         $this->view->render('/admin/index.php', ['mode' => $mode[0]]);
    34.     }
    35.  
    36.     public function updateStatusModePay() {
    37.         $this->checkAdminUser();
    38.         $this->main->updateStatusPay($_POST);
    39.         header('Location: /admin');
    40.         exit;
    41.     }
    42.  
    43. }

    Решил убрать дублирование, помести вызов метода $this->checkAdminUser(); в конструктор, это нормальный способ, каким ещё можно?

    PHP:
    1. <?php
    2.  
    3. namespace MyProject\Controllers;
    4.  
    5. use MyProject\Views\View as View;
    6. use MyProject\Models\Admin\Main as Main;
    7. use MyProject\Models\Users\UsersAuthService;
    8.  
    9. class AdminController {
    10.  
    11.     public $db;
    12.     public $view;
    13.     public $user;
    14.     public $main;
    15.  
    16.     public function __construct(View $view) {
    17.         $this->view = $view;
    18.         $this->user = UsersAuthService::getUserByToken();
    19.         $this->main = new Main();
    20.         $this->checkAdminUser();
    21.     }
    22.  
    23.     public function checkAdminUser() {
    24.         if (!isset($this->user) || $this->user->user_role !== 'admin') {
    25.             $this->view->render('/errors/404.php', [], 404);
    26.             exit;
    27.         }
    28.     }
    29.  
    30.     public function index() {
    31.         $mode = $this->main->getStatusTestMode();
    32.         $this->view->render('/admin/index.php', ['mode' => $mode[0]]);
    33.     }
    34.  
    35.     public function updateStatusModePay() {
    36.         $this->main->updateStatusPay($_POST);
    37.         header('Location: /admin');
    38.         exit;
    39.     }
    40.  
    41. }
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    Да, так делается в каждом методе. А вдруг ты захотел, чтобы удаление чего-то там разрешено было только админу, а все остальное для модераторов и т.д.
    PHP:
    1.     public function update( int $id ): CommitRepository
    2.     {
    3.         if ( ! $this-> access( 'panel.index.view', 'panel.roles.update' ) )
    4.         {
    5.             return $this -> accessDenied();
    6.         }
    7.    
    8.         if ( ! isXHR() || ! roles() -> isRole( $id ) )
    9.         {
    10.             return $this -> redirect( routerPathByName( 'admin-panel-roles-view' ) );
    11.         }
    12.    
    13.         $this -> setThreadTitles( 'Список ролей', 'Панель управления' );
    14.    
    15.         $roles = $this -> model( \Admin\Panel\Roles :: class );
    16.    
    17.         try
    18.         {
    19.             $roles -> validation();
    20.        
    21.             $this -> model( \Admin\Panel\Roles\Update :: class ) -> update( $id );
    22.         }
    23.         catch ( ViolationsException $e )
    24.         {
    25.             return $this -> customJson( RestApi :: success() -> errorMessages( ...$e -> getErrors() ) );
    26.         }
    27.    
    28.         return $this -> permissionView( $roles );
    29.     }
    Убери в коде натив header exit, если используешь ooп связку $this->view->render.

    Используй фасад $this->user->isRole( 'admin' ) $this->user->isNotRole( 'admin' ) вместо нативного $this->user->user_role !== 'admin'

    дабы разрабы в IDE понимали твой код и для удобства набирали $this->user->i и тут же подсвечивался список методов + выбор и опа, вместо того чтобы ручками вот это !== === "'ололололо" писать
     
    Dimon2x нравится это.
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    а в мидлвар не вариант?
     
    mkramer нравится это.