Public function index php

PHP classes with functions used for building a web application

The following class is set of functions I use for web development(examples below) and I was wondering how to structure it. Examples:

//Checking if user isn't admin so that he can access login page $helper = new Base(); if ($helper->is_admin()) < $helper->location("index.php"); > //Encoding output to prevent XSS $html = ""; echo "

". $helper->clean_html($html) ."

"; //Redirect to another webpage and exit $helper->location("error.php");
 public function location($dir = "index.php") < header("Location: ".$dir); exit(); >public function is_logged_in() < return (isset($_SESSION['logged_in']) && $_SESSION['logged_in']); >public function is_admin() < return (isset($_SESSION['admin']) && $_SESSION['admin']); >/* * Clean functions para prevenir XSS */ public function clean_html($html) < return htmlspecialchars($html, ENT_QUOTES, 'utf-8'); >public function clean_json($json) < return json_encode($json, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); >/* * Check functions */ public function check_token($token, $dir) < if ($token != $_SESSION["csrf_token"]) < $this->location($dir); > > public function check_login($dir) < if (!$this->is_logged_in()) < $this->location($dir); > > public function check_admin($dir) < if (!$this->is_admin()) < $this->location($dir); > > public function check_input($required, $erro) < foreach ($required as $field) < if (!empty($_POST[$field])) < $this->location($erro); > > > > 

Or since the check functions build on previous functions should I structure it the following way:
Base class:

 public function location($dir = "index.php") < header("Location: ".$dir); exit(); >public function is_logged_in() < return (isset($_SESSION['logged_in']) && $_SESSION['logged_in']); >public function is_admin() < return (isset($_SESSION['admin']) && $_SESSION['admin']); >/* * Clean functions para prevenir XSS */ public function clean_html($html) < return htmlspecialchars($html, ENT_QUOTES, 'utf-8'); >public function clean_json($json) < return json_encode($json, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); >> 
base = new Base; > public function check_token($token, $dir) < if ($token != $_SESSION["csrf_token"]) < $this->base->location($dir); > > public function check_login($dir) < if (!$this->base->is_logged_in()) < $this->base->location($dir); > > public function check_admin($dir) < if (!$this->base->is_admin()) < $this->base->location($dir); > > public function check_input($required, $erro) < foreach ($required as $field) < if (!empty($_POST[$field])) < $this->base->location($erro); > > > > 
/* * Miscellaneous functions */ class Base < public static function location($dir = "index.php") < header("Location: ".$dir); exit(); >public static function check_input($required, $error) < foreach ($required as $field) < if (empty($_POST[$field])) < Base::location($error); >> > > 
/* * Session handling class */ class Session < public function __construct() < session_start(); >public function initialize_user_session($admin, $user_id) < $_SESSION["admin"] = $admin; $_SESSION["loggedIn"] = true; $_SESSION["user_id"] = $user_id; $_SESSION["csrf_token"] = bin2hex(random_bytes(32)); >public function logout() < session_destroy(); exit(); >public function is_logged_in() < return (!empty($_SESSION['logged_in'])); >public function is_admin() < return (!empty($_SESSION['admin'])); >/* * Check functions */ public function check_token($token, $dir) < if ($token != $_SESSION["csrf_token"]) < Base::location($dir); >> public function check_login($dir) < if (empty($_SESSION['logged_in'])) < Base::location($dir); >> public function check_admin($dir) < if (empty($_SESSION['admin'])) < Base::location($dir); >> > 
/* * Functions to prevent XSS */ class Input_Encoding < public static function clean_html($html) < return htmlspecialchars($html, ENT_QUOTES, 'utf-8'); >public static function clean_json($json) < return json_encode($json, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); >> 

Источник

Читайте также:  Php include settings file

Ресурсные контроллеры в CRUD приложении Laravel

Привет, Хабр. В этой статье я хочу поделиться своим опытом использования ресурсных контроллеров в CRUD приложении на фреймворке Laravel — простенькой CRM. Итак начнём.

Задача

Создать веб-приложение для учёта бизнес-клиентов: карточки организаций и их представителей, заявки, события, договора по принципу CRUD.

Ингредиенты

Будем использовать свободное программное обеспечение. В качестве PHP — фреймворка будем использовать Laravel и Bootstrap в качестве его компонента для построения страниц HTML. И поскольку это обычное CRUD приложение, то будем использовать ресурсные контроллеры для базовых действий: создание (create), чтение (read), модификация (update), удаление (delete).

Приступаем

Создаём проект Laravel, используя Composer:

composer create-project laravel/laravel crm.example.com cd crm.example.com

Подключаем Bootstrap, делаем форму входа для пользователей и собираем через npm:

composer require laravel/ui php artisan ui bootstrap php artisan ui bootstrap --auth npm install npm run dev

Создаём модель для бизнес-клиентов, а также заодно к ней миграцию, фабрику, наполнитель, политику, контроллер и запрос формы:

php artisan make:model Client --all

Остальные модели также. Генерируем миграции для сессий и очередей:

php artisan session:table php artisan queue:table

Создайте по необходимости в папке database/seeder файлы для наполнения базы данных первичными данными, например для создания пользователя-админа:

insert([ [ 'name' => 'admin', 'email' => 'admin@example.com', 'access_level' => 2, 'password' => Hash::make('твой_пароль') ] ]); > >

Настраиваем миграции. Таблица для клиентов будет выглядеть примерно так:

id(); $table->string('fulltitle', 512)->nullable(); $table->string('title', 128)->nullable(); /* . тут много полей для всяких реквизитов . */ $table->string('tel', 10)->nullable(); // Телефон $table->string('comment', 255)->nullable(); // Комментарий $table->foreignId('creater_id') // какой пользователь создал ->nullable() ->constrained('users') ->cascadeOnUpdate() ->nullOnDelete(); $table->foreignId('updater_id') // какой последний пользователь внёс изменения ->nullable() ->constrained('users') ->cascadeOnUpdate() ->nullOnDelete(); $table->timestamps(); >); > public function down() < Schema::dropIfExists('clients'); >>

После запускаем миграции с наполнением БД:

php artisan migrate:fresh --seed

:fresh — удалит существующие таблицы в БД.

Итак, в папке app/Http/Controllers будет нас ждать ресурсный контроллер ClientController . Там будут объявлены методы: index, create, store, show, edit, update, destroy.

Метод index должен отображать список клиентов. Напишем так, чтобы он выводил сначала новые записи, разбивая на страницы по 20 записей, используя для вывода Blade шаблон ‘client-index’:

 Client::orderByDesc('id')->paginate(20)]); >

Метод create должен вывести форму для заполнения данных о клиенте и кнопку для добавления его в БД. Мы используем Blade шаблон ‘client-edit’ и для добавления и для редактирования данных, чтобы шаблон понимал, какое именно из этих действий выполняется, мы будем передавать ему переменную edit , где значение 0 — для добавления нового, а 1 — для изменения существующего. Переменную client мы просто заполняем начальными данными из модели Client

Метод edit похож на метод create. Только здесь edit = 1, а переменная client заполняется моделью существующего клиента, переданного через маршрут:

Метод show отображает карточку клиента:

Метод store добавляет нового клиента в БД, а метод update обновляет данные у существующего в БД:

validated(); $client = Client::create($validated); return redirect()->route('clients.show', $client); > public function update(UpdateClientRequest $request, Client $client) < $validated = $request->validated(); $client->fill($validated); $client->updater_id = Auth::id(); $client->save(); return redirect()->route('clients.show', $client); >

Метод destroy удаляет запись из БД:

access_level == 2) < $client->delete(); return redirect()->route('clients.index'); > else < return null; >>

Теперь рассмотрим, что такое StoreClientRequest и UpdateClientRequest. Дело в том, что перед внесением записей в БД, мы должны проверить корректность данных и авторизовать действие пользователя, то есть пройти валидацию запроса. Они называются запросами формы и лежат в папке app/Http/Requests. Так будет примерно выглядеть StoreClientRequest, который проверяет данные нового клиента перед добавлением:

user()->access_level > 0); // имеет ли право пользоваель на это действие > public function rules() < return [ 'fulltitle' =>['nullable', 'string', 'max:512'], 'title' => ['nullable', 'string', 'max:128'], /* . тут проверяется много полей для всяких реквизитов . */ 'tel' => ['nullable', 'string', 'max:10'], 'comment' => ['nullable', 'string', 'max:255'] ]; > > 

UpdateClientRequest будет выглядеть примерно также.

Теперь настроим маршруты в routes/web.php:

 false, 'reset' => false,'verify' => false]); // ставим посредник auth, чтобы только авторизованные пользователи могли ходить по этим маршрутам Route::group(['middleware' => 'auth'], function() < Route::resources([ 'clients' =>ClientController::class, 'clients.representatives' => ClientRepresentativeController::class, /* тут ещё куча строк */ ]); >);

Маршруты для методов ресурсного контроллера создаются автоматически Laravel, не надо для каждого метода прописывать отдельный маршрут. Для объявления маршрутов ресурсного контроллера мы используем Route::resources , передавая массив ресурсных контроллеров. Так для клиентов Laravel создаст следующие маршруты:

  • clients.index
  • clients.show
  • clients.create
  • clients.edit
  • clients.store
  • clients.update
  • clients.destroy

Теперь о ‘clients.representatives’ => ClientRepresentativeController::class , это объявление маршрутов к методам контроллера вложенных ресурсов. В нашей CRM ведётся учёт представителей бизнес-клиентов. Модель представителей является дочерней для модели клиентов. И чтобы мы могли увидеть, например всех представителей для конкретного клиента по адресу вроде https://crm.example.com/clients/123/representatives , мы создадим контроллер вложенных ресурсов:

 $client, 'representatives' => Representative::where(['client_id' => $client->id])->orderByDesc('id')->paginate(20)]); > public function create(Client $client) < return view('representative-edit', ['edit' =>0, 'representative' => new Representative(['client_id' => $client->id])]); > public function store(StoreRepresentativeRequest $request, Client $client) < $validated = $request->validated(); $representative = new Representative(['client_id' => $client->id]); $representative->fill($validated); $representative->save(); return redirect()->route('representatives.show', $representative); > >

Метод index выведет список представителей для конкретного клиента. Метод create выведет форму для создания представителя, а также укажет для какого клиента он создаётся. Метод store сохранит запись о новом представителе с указанием id клиента.

А для остальных методов нам не нужен контроллер вложенных ресурсов, поскольку каждая существующая запись о представителях имеет уникальный идентификатор, и с ними мы можем взаимодействовать через обычный ресурсный контроллер RepresentativeController. А Laravel нам также создаст маршруты для методов контроллера вложенных ресурсов:

  • clients.representatives.index
  • clients.representatives.create
  • clients.representatives.store

Полностью посмотреть код, в том числе шаблоны Blade вы можете по ссылке.

Источник

Оцените статью