Advertisement
deyanivanov966

Упражнение CRUD 25-26.11.2021 (инструкции)

Jan 9th, 2022
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.13 KB | None | 0 0
  1. Стъпка 0. Подготовка
  2. Използваме подход “Learning by Doing”.
  3.  
  4. 0.1. Инсталиране на XAMPP
  5. Проверяваме дали имаме вече инсталиран XAMPP - проверяваме имаме ли директория C:\xampp или D:\xampp. Ако имаме, прескачаме към следваща стъпка.
  6.  
  7. Инсталиране на XAMPP в C:\xampp .
  8.  
  9. Сваляме примерно https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/8.0.12/xampp-windows-x64-8.0.12-0-VS16.zip/download
  10.  
  11. и разархивираме на C:\
  12.  
  13. 0.2. Стартиране на Apache & MySQL/MariaDB.
  14. \xampp\apache_start.bat
  15.  
  16. \xampp\mysql_start.bat
  17.  
  18. или чрез визуалния контролен панел:
  19.  
  20. xampp-control.exe
  21.  
  22. Тестване: http://127.0.0.1/
  23.  
  24. 0.3. Инсталиране на composer
  25. Проверяваме дали имаме вече инсталиран composer:
  26.  
  27. Стартираме cmd (Command Prompt).
  28.  
  29. Ако xampp е инсталиран на D:, първо сменяме устройството:
  30.  
  31. D:
  32.  
  33. Съвет: При работа в команден ред, с клавиши “стрелка нагоре”/“стрелка надолу” може да се извикват предишни команди, за да не се набират отново.
  34.  
  35.  
  36. Въвеждаме:
  37.  
  38. composer -v
  39.  
  40. Ако се изведе нещо подобно, прескачаме на следваща стъпка.
  41.  
  42. ______
  43.  
  44. / ____/___ ____ ___ ____ ____ ________ _____
  45.  
  46. / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
  47.  
  48. / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
  49.  
  50. \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
  51.  
  52. /_/
  53.  
  54. Composer version 2.1.12 2021-11-09 16:02:04
  55.  
  56.  
  57. Ако се изведе “'composer' is not recognized as an internal or external command,
  58.  
  59. operable program or batch file.” то най-вероятно няма инсталиран.
  60.  
  61. Сваляне на composer.phar и разполагане в директорията \xampp
  62.  
  63. От:
  64.  
  65. https://getcomposer.org/download/latest-stable/composer.phar
  66.  
  67. Тестване:
  68.  
  69. \xampp\php\php \xampp\composer.phar -v
  70.  
  71. Добавяне на пътя до интерпретатора на PHP в променливата на средата PATH:
  72.  
  73. PATH=%PATH%;C:\xampp\php
  74.  
  75. или
  76.  
  77. PATH=%PATH%;D:\xampp\php
  78.  
  79. Тестване:
  80.  
  81. php \xampp\composer.phar -v
  82.  
  83. 0.4. Инсталиране на начален проект на laravel в \xampp\htdocs\laravel8
  84. Сменяме текущата директория:
  85.  
  86. cd \xampp\htdocs
  87.  
  88.  
  89. Ако xampp и composer са били инсталирани с инсталираща програма:
  90.  
  91. composer create-project --prefer-dist laravel/laravel laravel8
  92.  
  93.  
  94. Ако ние сами сме си инсталирали xampp и composer по указанията, дадени по-горе:
  95.  
  96. php \xampp\composer.phar create-project --prefer-dist laravel/laravel laravel8
  97.  
  98.  
  99. Изчакваме търпеливо да се свалят всички файлове.
  100.  
  101. Тестване:
  102.  
  103. http://127.0.0.1/laravel8/public/
  104.  
  105. Евентуално си правим архив/копие на директорията /xampp/htdocs/laravel8 с цел бързо да си създаваме нови проекти или да започнем отначало.
  106.  
  107. 0.5. Настройки на БД
  108. Зареждаме http://127.0.0.1/phpmyadmin/
  109.  
  110. Вариант 1:
  111.  
  112. Създаване само на БД с име laravel:
  113.  
  114. Databases → Create database → laravel → Create
  115.  
  116.  
  117. Вариант 2:
  118.  
  119. Ако имаме права за създаване на нови потребители на БД.
  120.  
  121. Чрез PHPMyAdmin създаваме потребител laravel8/123456 и БД със същото име:
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131. Започваме да следваме ръководството:
  132. https://appdividend.com/2020/10/13/laravel-8-crud-tutorial-example-step-by-step-from-scratch/
  133.  
  134. (Но прескачаме цялата част Step 1 и npm install в Step 6, тъй като за интерфейса на уеб страниците ще използваме BootstrapCDN. Добре е да се ползва ABP или подобна, защото рекламите пречат).
  135.  
  136. Ръководството описва създаване на каталог за игри: име на игра, цена. Функционалност: CRUD.
  137.  
  138.  
  139. Step 1: Installing Laravel 8 - ПРЕСКАЧАМЕ
  140.  
  141.  
  142. Step 2: Configure the MySQL Database
  143.  
  144. Отваряме файла .env и правим съответни промени:
  145.  
  146. Ако не сме създали потребител, оставяме нещата както са си:
  147.  
  148. DB_DATABASE=laravel
  149.  
  150. DB_USERNAME=root
  151.  
  152. DB_PASSWORD=
  153.  
  154.  
  155. Ако сме създали потребител по стъпките, описани по-горе:
  156.  
  157. DB_DATABASE=laravel
  158.  
  159. DB_USERNAME=laravel8
  160.  
  161. DB_PASSWORD=123456
  162.  
  163.  
  164. Сменяне на текущата директория:
  165.  
  166. cd \xampp\htdocs\laravel8
  167.  
  168. Ако се изведе съобщение “The system cannot find the path specified.”, проверяваме кое е текущото устройство в командния ред (C: или D:) и при нужда го сменяме.
  169.  
  170.  
  171. Създаване на таблици в БД:
  172.  
  173. За повече информация: https://laravel.com/docs/8.x/migrations
  174.  
  175. php artisan migrate
  176.  
  177. Ако всичко е нормално, се извежда:
  178.  
  179.  
  180.  
  181.  
  182. Ако се изведе: “Could not open input file: artisan”, проверяваме коя е текущата директория - трябва да е \xampp\htdocs\laravel8
  183.  
  184. Ако се изведат други съобщения за грешки, проверяваме във файла .env дали настройките за връзка с БД са зададени правилно.
  185.  
  186.  
  187.  
  188. Step 3: Create a model and custom migration
  189.  
  190. php artisan make:model Game -m
  191.  
  192. В резултат се създават 2 файла:
  193.  
  194. \xampp\htdocs\laravel8\database\migrations\2021_11_NN_NNNNN_create_games_table.php и \xampp\htdocs\laravel8\app\Models\Game.php
  195.  
  196.  
  197. Отваряме
  198.  
  199. \xampp\htdocs\laravel8\database\migrations\2021_11_NN_NNNNN_create_games_table.php
  200.  
  201. Добавяме нови полета към структурата на таблицата games от БД:
  202.  
  203. public function up()
  204.  
  205. {
  206.  
  207. Schema::create('games', function (Blueprint $table) {
  208.  
  209. $table->id();
  210.  
  211. $table->string('name');
  212.  
  213. $table->integer('price');
  214.  
  215. $table->timestamps();
  216.  
  217. });
  218.  
  219. }
  220.  
  221. php artisan migrate
  222.  
  223. В резултат в БД се създава нова таблица games със зададената структура.
  224.  
  225.  
  226. Отваряме (това е част от Step 8)
  227.  
  228. \xampp\htdocs\laravel8\app\Models\Game.php
  229.  
  230. Добавяме
  231.  
  232. <?php
  233.  
  234. // Game.php
  235.  
  236. namespace App\Models;
  237.  
  238. use Illuminate\Database\Eloquent\Factories\HasFactory;
  239.  
  240. use Illuminate\Database\Eloquent\Model;
  241.  
  242. class Game extends Model
  243.  
  244. {
  245.  
  246. use HasFactory;
  247.  
  248. protected $fillable = ['name', 'price'];
  249.  
  250. }
  251.  
  252. Така се указва, че данните в тези полета ще се попълват от уеб форма. Данните в останалите 3 полета - id (AUTO_INCREMENT), created_at (timestamp) и updated_at (timestamp) ще се попълват автоматично.
  253.  
  254.  
  255. Step 4: Create a Laravel 8 controller
  256.  
  257. За повече информация: https://laravel.com/docs/8.x/controllers
  258.  
  259. php artisan make:controller GameController --resource
  260.  
  261. В резултат се създава файл с контролер клас с 7 празни метода (виж коментарите пред методите): \xampp\htdocs\laravel8\app\Http\Controllers\GameController.php
  262.  
  263.  
  264. Отваряме:
  265.  
  266. \xampp\htdocs\laravel8\app\Providers\RouteServiceProvider.php
  267.  
  268. В метода boot() правим промяна:
  269.  
  270. Route::middleware('web')
  271.  
  272. ->namespace($this->namespace)
  273.  
  274. ->namespace('App\Http\Controllers')
  275.  
  276. ->group(base_path('routes/web.php'));
  277.  
  278.  
  279.  
  280. Step 5: Define routes
  281.  
  282. Отваряме:
  283.  
  284. \xampp\htdocs\laravel8\routes\web.php
  285.  
  286. Добавяме най-отдолу:
  287.  
  288. Route::resource('games', 'GameController');
  289.  
  290. Така задаваме всички заявки към URI games да се обработват от класа GameController
  291.  
  292. За повече информация: https://laravel.com/docs/8.x/routing
  293.  
  294.  
  295. Разглеждане на списъка с маршрути (пътища):
  296.  
  297. php artisan route:list
  298.  
  299.  
  300.  
  301.  
  302. Step 6: Configure Bootstrap in Laravel 8 - Пропускаме
  303.  
  304. Засега я пропускаме,защото иска NPM (Node.js Package Manager).
  305.  
  306. Ще използваме в Step 7 BootstrapCDN - https://www.bootstrapcdn.com/
  307.  
  308. https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css
  309.  
  310. https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js
  311.  
  312.  
  313.  
  314. Step 7: Create Views in Laravel 8
  315.  
  316. За повече информация: https://laravel.com/docs/8.x/blade
  317.  
  318. Създаваме файл:
  319.  
  320. \xampp\htdocs\laravel8\resources\views\layout.blade.php
  321.  
  322. Поставяме вътре (използваме BootstrapCDN):
  323.  
  324. <!DOCTYPE html>
  325.  
  326. <html lang="en">
  327.  
  328. <head>
  329.  
  330. <meta charset="UTF-8">
  331.  
  332. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  333.  
  334. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  335.  
  336. <title>Laravel 8 CRUD Tutorial</title>
  337.  
  338. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
  339.  
  340. </head>
  341.  
  342. <body>
  343.  
  344. <div class="container">
  345.  
  346. @yield('content')
  347.  
  348. </div>
  349.  
  350. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" type="text/js"></script>
  351.  
  352. </body>
  353.  
  354. </html>
  355.  
  356.  
  357. Създаваме файл:
  358.  
  359. \xampp\htdocs\laravel8\resources\views\create.blade.php
  360.  
  361. Поставяме вътре:
  362.  
  363. @extends('layout')
  364.  
  365. @section('content')
  366.  
  367. <style>
  368.  
  369. .uper {
  370.  
  371. margin-top: 40px;
  372.  
  373. }
  374.  
  375. </style>
  376.  
  377. <div class="card uper">
  378.  
  379. <div class="card-header">
  380.  
  381. Add Games Data
  382.  
  383. </div>
  384.  
  385. <div class="card-body">
  386.  
  387. @if ($errors->any())
  388.  
  389. <div class="alert alert-danger">
  390.  
  391. <ul>
  392.  
  393. @foreach ($errors->all() as $error)
  394.  
  395. <li>{{ $error }}</li>
  396.  
  397. @endforeach
  398.  
  399. </ul>
  400.  
  401. </div><br />
  402.  
  403. @endif
  404.  
  405. <form method="post" action="{{ route('games.store') }}">
  406.  
  407. <div class="form-group">
  408.  
  409. @csrf
  410.  
  411. <label for="game_name">Game Name:</label>
  412.  
  413. <input type="text" class="form-control" name="name"/>
  414.  
  415. </div>
  416.  
  417. <div class="form-group">
  418.  
  419. <label for="cases">Price :</label>
  420.  
  421. <input type="text" class="form-control" name="price"/>
  422.  
  423. </div>
  424.  
  425. <button type="submit" class="btn btn-primary">Add Game</button>
  426.  
  427. </form>
  428.  
  429. </div>
  430.  
  431. </div>
  432.  
  433. @endsection
  434.  
  435.  
  436.  
  437. Отваряме файл:
  438.  
  439. \xampp\htdocs\laravel8\app\Http\Controllers\GameController.php
  440.  
  441. Добавяме:
  442.  
  443. public function create()
  444.  
  445. {
  446.  
  447. return view('create');
  448.  
  449. }
  450.  
  451. Този метод се извиква при заявки по метод GET и показва уеб форма за въвеждане на данни.
  452.  
  453.  
  454. Тестване:
  455.  
  456. http://127.0.0.1/laravel8/public/games/create
  457.  
  458.  
  459.  
  460.  
  461. Step 8: Add Validation rules and store the data
  462.  
  463. Отваряме файл:
  464.  
  465. \xampp\htdocs\laravel6\app\Http\Controllers\GameController.php
  466.  
  467. Добавяме:
  468.  
  469. <?php
  470.  
  471. namespace App\Http\Controllers;
  472.  
  473. use Illuminate\Http\Request;
  474.  
  475. use App\Models\Game;
  476.  
  477.  
  478. За повече информация: https://laravel.com/docs/8.x/validation
  479.  
  480. Добавяме в същия файл:
  481.  
  482. public function store(Request $request)
  483.  
  484. {
  485.  
  486. $validatedData = $request->validate([
  487.  
  488. 'name' => 'required|max:255',
  489.  
  490. 'price' => 'required|integer',
  491.  
  492. ]);
  493.  
  494. $game = Game::create($validatedData);
  495.  
  496. return redirect('/games')->with('success', 'Game is successfully saved');
  497.  
  498.  
  499. }
  500.  
  501. Този метод се извиква при заявки по метод POST и записва данните, изпратени от уеб формата.
  502.  
  503.  
  504. Тестване:
  505.  
  506. http://127.0.0.1/laravel8/public/games/create
  507.  
  508.  
  509.  
  510.  
  511. Въвеждаме валидни данни и проверяваме в PHPMyAdmin дали са се записали
  512.  
  513. http://127.0.0.1/phpmyadmin/sql.php?db=laravel8&table=games&pos=0
  514.  
  515.  
  516.  
  517. Step 9: Display the games
  518.  
  519. Отваряме файл:
  520.  
  521. \xampp\htdocs\laravel8\app\Http\Controllers\GameController.php
  522.  
  523. Добавяме:
  524.  
  525. public function index()
  526.  
  527. {
  528.  
  529. $games = Game::all();
  530.  
  531. return view('index',compact('games'));
  532.  
  533. }
  534.  
  535.  
  536. Създаваме файл:
  537.  
  538. \xampp\htdocs\laravel8\resources\views\index.blade.php
  539.  
  540. Поставяме вътре:
  541.  
  542. @extends('layout')
  543.  
  544. @section('content')
  545.  
  546. <style>
  547.  
  548. .uper {
  549.  
  550. margin-top: 40px;
  551.  
  552. }
  553.  
  554. </style>
  555.  
  556. <div class="uper">
  557.  
  558. @if(session()->get('success'))
  559.  
  560. <div class="alert alert-success">
  561.  
  562. {{ session()->get('success') }}
  563.  
  564. </div><br />
  565.  
  566. @endif
  567.  
  568.  
  569. <a href="{{ route('games.create')}}" class="btn btn-success">ADD</a>
  570.  
  571. <table class="table table-striped">
  572.  
  573. <thead>
  574.  
  575. <tr>
  576.  
  577. <td>ID</td>
  578.  
  579. <td>Game Name</td>
  580.  
  581. <td>Game Price</td>
  582.  
  583. <td colspan="2">Action</td>
  584.  
  585. </tr>
  586.  
  587. </thead>
  588.  
  589. <tbody>
  590.  
  591. @foreach($games as $game)
  592.  
  593. <tr>
  594.  
  595. <td>{{$game->id}}</td>
  596.  
  597. <td>{{$game->name}}</td>
  598.  
  599. <td>{{$game->price}}</td>
  600.  
  601. <td><a href="{{ route('games.edit', $game->id)}}" class="btn btn-primary">Edit</a></td>
  602.  
  603. <td>
  604.  
  605. <form action="{{ route('games.destroy', $game->id)}}" method="post">
  606.  
  607. @csrf
  608.  
  609. @method('DELETE')
  610.  
  611. <button class="btn btn-danger" type="submit">Delete</button>
  612.  
  613. </form>
  614.  
  615. </td>
  616.  
  617. </tr>
  618.  
  619. @endforeach
  620.  
  621. </tbody>
  622.  
  623. </table>
  624.  
  625. <div>
  626.  
  627. @endsection
  628.  
  629.  
  630. Тестване:
  631.  
  632. http://127.0.0.1/laravel8/public/games/
  633.  
  634.  
  635.  
  636.  
  637.  
  638. Step 11: Create Delete Functionality
  639.  
  640. Отваряме файл:
  641.  
  642. \xampp\htdocs\laravel8\app\Http\Controllers\GameController.php
  643.  
  644. Добавяме:
  645.  
  646. public function destroy($id)
  647.  
  648. {
  649.  
  650. $game = Game::findOrFail($id);
  651.  
  652. $game->delete();
  653.  
  654. return redirect('/games')->with('success', 'Game Data is successfully deleted');
  655.  
  656. }
  657.  
  658.  
  659.  
  660. Step 10: Complete Edit and Update
  661.  
  662. Отваряме файл:
  663.  
  664. \xampp\htdocs\laravel6\app\Http\Controllers\GameController.php
  665.  
  666. Добавяме:
  667.  
  668. public function edit($id)
  669.  
  670. {
  671.  
  672. $game = Game::findOrFail($id);
  673.  
  674. return view('edit', compact('game'));
  675.  
  676. }
  677.  
  678.  
  679. public function update(Request $request, $id)
  680.  
  681. {
  682.  
  683. $validatedData = $request->validate([
  684.  
  685. 'name' => 'required|max:255',
  686.  
  687. 'price' => 'required|numeric'
  688.  
  689. ]);
  690.  
  691. Game::whereId($id)->update($validatedData);
  692.  
  693. return redirect('/games')->with('success', 'Game Data is successfully updated');
  694.  
  695. }
  696.  
  697.  
  698. Създаваме файл:
  699.  
  700. \xampp\htdocs\laravel8\resources\views\edit.blade.php
  701.  
  702. Поставяме вътре: (с цвят ………. са маркирани разликите спрямо create.blade.php)
  703.  
  704. @extends('layout')
  705.  
  706.  
  707. @section('content')
  708.  
  709. <style>
  710.  
  711. .uper {
  712.  
  713. margin-top: 40px;
  714.  
  715. }
  716.  
  717. </style>
  718.  
  719. <div class="card uper">
  720.  
  721. <div class="card-header">
  722.  
  723. Edit Game Data
  724.  
  725. </div>
  726.  
  727. <div class="card-body">
  728.  
  729. @if ($errors->any())
  730.  
  731. <div class="alert alert-danger">
  732.  
  733. <ul>
  734.  
  735. @foreach ($errors->all() as $error)
  736.  
  737. <li>{{ $error }}</li>
  738.  
  739. @endforeach
  740.  
  741. </ul>
  742.  
  743. </div><br />
  744.  
  745. @endif
  746.  
  747. <form method="post" action="{{ route('games.update', $game->id) }}">
  748.  
  749. <div class="form-group">
  750.  
  751. @csrf
  752.  
  753. @method('PATCH')
  754.  
  755. <label for="game_name">Game Name:</label>
  756.  
  757. <input type="text" class="form-control" name="name" value="{{ $game->name }}"/>
  758.  
  759. </div>
  760.  
  761. <div class="form-group">
  762.  
  763. <label for="cases">Game Price:</label>
  764.  
  765. <input type="text" class="form-control" name="price" value="{{ $game->price }}"/>
  766.  
  767. </div>
  768.  
  769. <button type="submit" class="btn btn-primary">Update Data</button>
  770.  
  771. </form>
  772.  
  773. </div>
  774.  
  775. </div>
  776.  
  777. @endsection
  778.  
  779.  
  780.  
  781. Тестване:
  782.  
  783. http://127.0.0.1/laravel8/public/games/
  784.  
  785.  
  786. Задача
  787. Да се добави ново поле ratings - число от 1 до 5. Какви промени и къде трябва да се направят?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement