???????現在因為公司需求,需要新開一個Laravel框架的項目,毫無疑問,我又被借調過去了,最近老是被借調,有點陰郁,不過反觀來看,這也是好事,又可以復習和鞏固一下自己的知識點,接下來開始講解Laravel框架
1.安裝(我使用的是composer安裝)
安裝命令1:
composer create-project laravel/laravel:^11.0 example-app(框架所在文件夾:安裝時中午不必復制)
安裝命令2:
composer global require laravel/installer
laravel new example-app(框架所在文件夾:安裝時中午不必復制)
2.環境配置(.env文件)
應用名稱
APP_NAME=Laravel
應用運行環境
APP_ENV=local
是否開啟Debug模式
APP_DEBUG=true
數據庫配置
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root
3.框架啟動:
cd example-app(框架所在文件夾:安裝時中午不必復制)
php artisan serve
4.常用artisan命令:
1.顯示您的應用配置、驅動程序和環境:php artisan about
2.加密環境文件(作用在.env文件): php artisan env:encrypt
3.解密環境文件(作用在.env文件):php artisan env:decrypt
4.框架啟動:php artisan serve
5.這個命令會生成一個新的應用程序密鑰,并將其自動添加到 .env 文件中:php artisan key:generate
6.創建一個新的控制器:php artisan make:controller
7.創建一個新的 Eloquent 模型:php artisan make:model
8.創建一個新的策略類:php artisan make:policy
9.創建一個新的種子文件:php artisan make:seeder
10.運行數據庫遷移,創建或修改數據庫表以匹配最新的遷移文件:php artisan migrate
11.回滾最后一個數據庫遷移操作:php artisan migrate:rollback
12.重置并重新運行所有數據庫遷移:php artisan migrate:refresh
13.列出應用程序的所有路由:php artisan route:list
14.清除應用程序緩存:php artisan cache:clear
15.創建配置緩存文件以加速應用程序的啟動:php artisan config:cache
16.清除視圖緩存:php artisan view:clear
17.清除優化文件:php artisan optimize:clear
18.啟動一個與應用程序的交互式解釋器:php artisan tinker
19.在本地開發服務器上運行應用程序:php artisan serve
20.生成未定義監聽器的事件:php artisan event:generate
21.為通知表生成一個遷移文件:php artisan notification:table
22.為隊列遷移生成一個遷移文件:php artisan queue:table
23.為會話遷移生成一個遷移文件:php artisan session:table
24.列出所有路由:php artisan route:list -v
25.創建中間件:php artisan make:middleware 中間件名
?
5.框架目錄:
根目錄
--app :應用程序的核心代碼
--bootstrap :引導框架的 app.php 文件
--config :所有配置文件
--database :數據庫遷移、模型工廠和種子文件
--public :包含 index.php 文件,這是所有請求進入您應用程序的入口點,并配置自動加載?
--resources :視圖以及樣式文件和JS文件
--routes :所有路由定義文件
--storage :日志、編譯的 Blade 模板、基于文件的會話、文件緩存以及框架生成的其他文件
--tests :自動化測試
--vendor :Composer 依賴項
App目錄?:大部分代碼文件
--Broadcasting :所有廣播頻道類
--Console :所有自定義 Artisan 命令
--Exceptions :所有自定義異常
--Http :包含控制器、中間件和表單請求
--Jobs :包含應用程序的可隊列化作業
--Listeners :處理事件的類
--Mail :代表電子郵件的類
--Models :所有的 Eloquent 模型類
--Notifications :應用程序發送的所有“事務性”通知
--Policies :應用程序的授權策略類
--Providers :應用程序的所有服務提供者
--Rules :應用程序的自定義驗證規則對象
6.前端模
Blade
語法:
1.通過 {{ }} 渲染 PHP 變量(最常用)
2.通過 {!! !!} 渲染原生 HTML 代碼(用于富文本數據渲染)
3.通過以 @ 作為前綴的 Blade 指令執行一些控制結構和繼承、引入之類的操作
4.關鍵字:(關鍵字開始;關鍵字end結束)
????@if、@else、@elseif
????@unless(和 @if 條件相反的條)
????@isset、@empty
????@switch
????@for、@foreach 和 @while
Vue / React
react有函數式編碼和類編碼,這次講的是的類編碼,后面小編爭取出一個函數式編碼的文章
解決辦法:
1.使用Inertia橋接了Laravel應用程序和Vue或React 前端之間的連接,允許使用Vue或React構建成熟的現代前端框架
引入相關類(版本需要升級到laravel9,php版本需要升級到php8):composer require inertiajs/inertia-php
2.直接引入相關資源(主要的JS文件:這樣寫其實是:穿著Blade的外衣的 Vue / React)
路由:
route::get('/reactest',[TestController::class,'reactst']);
頭部:
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8" /><title>Hello React!</title><script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script><script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script><script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
頁面代碼(包含異步請求):
@include('head')
<body>
<div id="example"></div>
<script type="text/babel">//請求主方法class UserGist extends React.Component {//構造函數(和后端的構造函數類似)constructor(props) {//super關鍵字實現調用父類,super代替的是父類的構建函數super(props);//控制組件的內部狀態變化this.state = {username: '', lastGistUrl: ''};}//在組件掛載后立即調用(插入 DOM 樹中)componentDidMount() {this.serverRequest = $.get(this.props.source, function (result) {var lastGist = result[0];this.setState({username: lastGist.owner.login,lastGistUrl: lastGist.html_url});}.bind(this));}//當組件即將被卸載/銷毀時,會調用這個方法(和后端的析構函數類似)componentWillUnmount() {this.serverRequest.abort();}//渲染方法render() {return (<div>{this.state.username} 用戶最新的 Gist 共享地址:<a href={this.state.lastGistUrl}>{this.state.lastGistUrl}</a></div>);}}//請求主體ReactDOM.render(//調用主方法(賦值請求地址)<UserGist source="https://api.github.com/users/octocat/gists" />,document.getElementById('example'));
</script>
</body>
</html>
7.路由:
use App\Http\Controllers\TestController;//框架路由測試
Route::get('/test', [TestController::class, 'index']);//控制器方法
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;class TestController extends BaseController
{public function index(){return view('test');}
}
?>//框架路由測試
Route::get('/test', [TestController::class, 'index']);//依賴注入
Route::get('/tests', function (Request $request) {//todo or 模板
});//指定請求方法
Route::match(['get', 'post'], '/', function () {//todo or 模板
});Route::any('/', function () {//todo or 模板
});Route::get('/testrequest', function (Request $request) {//todo or 模板
});//路由重定向
Route::redirect('/page1', '/page2');//單參數綁定
Route::get('/page3/{id}', function (string $id) {return '標記 '.$id;
});//多參數綁定
Route::get('/page4/{id}/{ids}', function (string $id,string $ids) {return '標記 '.$id.';新標記'.$ids;
});//可選參數(設置默認值)
Route::get('/page5/{name?}', function (?string $name = null) {return $name;
});//正則表達式(where 添加正則表達式)
Route::get('/page6/{name}', function (string $name) {// ...
})->where('name', '[A-Za-z]+');//路由重命名
Route::get('/page7', function () {// ...
})->name('page7realname');//路由組+中間件
Route::group(['prefix' => 'admin'],function () {Route::get('/page8', function () {//訪問/admin/page8});Route::get('/page9', function () {//訪問/admin/page9});
});//中間件(前置中間件,后置中間件,全局中間件)
php artisan make:middleware EnsureTokenIsValid//使用中間件Route::get('/page10', function () {//todo or 模板
})->middleware(EnsureTokenIsValid::class);//排除中間件Route::group(['prefix' => 'admin'],function () {Route::get('/page11', function () {//todo or 模板})->withoutMiddleware([EnsureTokenIsValid::class]);
});
8.(MVC)php代碼:
M (Model)
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;class Users extends Model
{//表protected $table = 'users';//組件protected $primaryKey = 'id';//主鍵自增是否開啟public $incrementing = true;//主鍵 ID 的數據類型protected $keyType = 'int';//表示模型是否應該被打上時間戳public $timestamps = false;//數據庫鏈接模型protected $connection = 'mysql';//定義方法public function phone(){return $this->hasOne(Users_extend::class);}
}
C (Controller)
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Inertia\Inertia;
use Inertia\Response;class UserController extends Controller
{public function show(string $id): Response{return Inertia::render('Users/Profile', ['id' =>$id]);}
}?>
V (View)
<script setup>
import Layout from '@/Layouts/Authenticated.vue'
import { Head } from '@inertiajs/vue3'
const props = defineProps(['user'])
</script><template><Head title="User Profile" /><Layout><template #header><h2 class="text-xl font-semibold leading-tight text-gray-800">vue測試</h2></template><div class="py-12">標識: {{$id}}</div></Layout>
</template>
寫到這里,相信大家已經了解到了,控制器、視圖大家都已經學會了,后面我們開始進階的用法
數據庫(數據庫配置在.env文件中):
9.數據庫 (原生 + Eloquent)
//訪問路由
Route::get('/datacreate', [TestController::class, 'data_create']);
Route::get('/datafind', [TestController::class, 'data_find']);
Route::get('/datafinds', [TestController::class, 'data_finds']);
Route::get('/datafindspage', [TestController::class, 'data_finds_page']);
Route::get('/datafindshasone', [TestController::class, 'data_finds_hasone']);
Route::get('/dataup', [TestController::class, 'data_up']);
use Illuminate\Support\Facades\DB;
//數據庫連接
'mysql' => ['read' => ['host' => ['192.168.1.1','196.168.1.2',],],'write' => ['host' => ['196.168.1.3',],],'sticky' => true,'database' => env('DB_DATABASE', 'forge'),'username' => env('DB_USERNAME', 'forge'),'password' => env('DB_PASSWORD', ''),'unix_socket' => env('DB_SOCKET', ''),'charset' => env('DB_CHARSET', 'utf8mb4'),'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),'prefix' => '','prefix_indexes' => true,'strict' => true,'engine' => null,'options' => extension_loaded('pdo_mysql') ? array_filter([PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),]) : [],
],
//數據庫Eloquent組件
use Illuminate\Database\Eloquent\Model;//創建model
php artisan make:model Users//model方法
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
class Users extends Model
{//表protected $table = 'users';//組件protected $primaryKey = 'id';//主鍵自增是否開啟public $incrementing = true;//主鍵 ID 的數據類型protected $keyType = 'int';//表示模型是否應該被打上時間戳public $timestamps = false;//數據庫鏈接模型protected $connection = 'mysql';//定義方法public function phone(){return $this->hasOne(Users_extend::class);}
}//創建model
php artisan make:model Users_extend//model方法
namespace App;
use Illuminate\Database\Eloquent\Model;
class Users_extend extends Model
{//表protected $table = 'user_extend';//定義方法public function user(){return $this->belongsTo(Users::class);}
}//方法調用
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
//數據庫
use App\Users;class TestController extends BaseController
{//初始化public function __construct(){$this->student = new Users();}//數據創建public function data_create(){$this->student->username='數據測試';$this->student->sex="女";$this->student->age="30";$this->student->save();$userid = $this->student->id;var_dump($userid);die;}//數據查詢public function data_find(){$result = $this->student->where("id",5)->first();var_dump($result);die;}//數據查詢public function data_finds(){$result = $this->student::all();var_dump($result);die;}//數據分頁public function data_finds_page(){$result = $this->student::paginate(2);var_dump($result);die;}//數據一對一(hasone)public function data_finds_hasone(){$phone = $this->student::find(1)->phone;var_dump($phone);die;}//數據修改public function data_up(){$result = $this->student->where("id","=","5")->update(['username'=>"數據測試編號5"]);var_dump($result);die;}
}
10.關聯關系(相當于聯合查詢)
?一對一
return $this->hasOne();
return $this->belongsTo();
一對多
return $this->hasMany();
return $this->belongsTo();
多對多
return $this->belongsToMany();
return $this->belongsToMany();
11.文件上傳表單
<form id="uploadForm" enctype="multipart/form-data">
? ? <input type="file" name="file" />
? ? <input type="submit" value="上傳" />
</form>
//異步方法
<script>
?? ?$(document).ready(function (e) {
?? ??? ??? ?$('#uploadForm').on('submit', function(e) {
?? ??? ??? ??? ??? ?e.preventDefault(); // 阻止表單默認提交行為
?? ??? ??? ??? ??? ?var formData = new FormData(this); // 創建FormData對象
?? ??
?? ??? ??? ??? ??? ?$.ajax({
?? ??? ??? ??? ??? ??? ??? ?type: 'POST',
?? ??? ??? ??? ??? ??? ??? ?url: '/upload', // 這里是你的上傳處理路徑
?? ??? ??? ??? ??? ??? ??? ?data: formData,
?? ??? ??? ??? ??? ??? ??? ?contentType: false,
?? ??? ??? ??? ??? ??? ??? ?processData: false,
?? ??? ??? ??? ??? ??? ??? ?success: function(response) {
?? ??? ??? ??? ??? ??? ??? ??? ??? ?console.log(response); // 處理成功的回調
?? ??? ??? ??? ??? ??? ??? ?},
?? ??? ??? ??? ??? ??? ??? ?error: function() {
?? ??? ??? ??? ??? ??? ??? ??? ??? ?console.log('上傳失敗'); // 處理錯誤的回調
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?});
?? ??? ??? ?});
?? ?});
</script>
普通文件上傳
use Illuminate\Support\Facades\Route;
Route::post('/upload', function () {request()->file('file')->store('files', 'public');return '文件上傳成功!';
});
oss文件上傳
<?php
use App\Http\Controllers\Core\ApiController;
use App\Models\LoginLog;
use Illuminate\Http\Request;
use OSS\OssClient;//定義方法
class FileController extends ApiController
{//上傳主方法public function uploadFile(Request $request){//獲取上傳文件$file = $request->file();//上傳方法調用$ret = $this->_upload($file);//參數返回echo json_encode($ret);exit;}//上傳方法protected function _upload($file){//獲取上傳文件名字$dir_name = empty($_GET['dir']) ? 'image' : trim($_GET['dir']);//獲取路徑(配置文件中獲取)$storage_path = config('upload.storage');$webpath_path = config('upload.webpath');//重名民上傳文件$image_path = ?$dir_name . '/' . date("Y-m") . '/';//獲取路徑(配置文件中獲取)$app_url = env('APP_URL') . '/';//判斷上傳文件是否存在if (!$file) {return array('error'=>1,'message'=>"文件上傳失敗,請檢查后重試");}//獲取路徑(配置文件中獲取)$ossConfig = config('oss.' . config('upload.ossflag'));if($ossConfig['bucket_addr']) {$app_url = $ossConfig['bucket_addr'];}//文件上傳$tmpName = $file->getPathName();$fileExtension = $file->getClientOriginalExtension();$filePath = md5_file($tmpName) . '.' . $fileExtension;//判斷文件大小$file_size = $file->getSize();if($file_size > config('upload.maxSize')){return array('error'=>1,'message'=>"文件不可以超過50MB");}//判斷是否符合上傳類型if (!in_array(strtolower($fileExtension),config('upload.allowExts'))){return array('error'=>1,'message'=>"文件類型不支持");}//上傳成功后處理if(config('oss.' . 'oss_open') == 1) {//初始化OSS對象$oss = new OssClient($ossConfig['access_key_id'], $ossConfig['access_key_secret'], $ossConfig['endpoint']);//oss上傳$res = $oss->uploadFile($ossConfig['bucket'],$webpath_path . $image_path . $filePath,$v->getPathName());if ($res){$data['oss'] = 1;$data['attach_url'] = $ossConfig['bucket_addr'] . $webpath_path . $image_path . $filePath;} else {$data['attach_url'] = $app_url . $webpath_path . $image_path . $filePath;$data['oss'] = 0;}$data['time'] = time();} else {$data['oss'] = 0;$data['attach_url'] = $app_url. $webpath_path . $image_path . $filePath;$data['time'] = time();}if(!$data['oss'] || config('oss.' . 'is_delete') != 1){$file->move($storage_path . $image_path, $filePath); ? ?unset($data);}return array('error'=>0,'url'=>$data['attach_url']);}
}
????????講到這里基礎的部分就已經完成了,萬米高樓平地起,先復習到這里,先趕著做項目去了,后面高級一點的廣播、緩存、集合、上下文啥的,后面有機會再出一個學習文章供大家學習