在本文中,我想为您提供有关如何在MacOS上设置开发环境并开始使用Laravel开发PHP应用程序的指南。
内容
- Setup Valet
- Create a Project
- Laravel Project Structure
- Blade Templates
- Database Handling
- Shared elements
设置代客
代客是MacOS的轻巧的Laravel开发环境,随附Nginx。它提供了代理,可以将所有请求指向已配置的域上,以指向本地计算机上的已安装站点。
安装与自制的组件
转到Homebrew并复制安装命令并在您的终端中运行。
# Update homebrew
brew update
# Install PHP
brew install php
# Install composer
brew install composer
运行以下命令,看看是否在任何地方说“作曲家”:
echo $PATH
如果没有,则必须在路径中添加作曲家。将以下行添加到外壳配置中。我使用 zsh 作为我的外壳,所以我可以将其添加到〜/.zshrc
export PATH=$PATH:$HOME/.composer/vendor/bin
刷新外壳配置:
# Refresh zsh configuration
source ~/.zshrc
安装代客
# Actually install valet with composer
composer global require laravel/valet
valet install
composer global require laravel/installer
创建一个项目
确保导航到要创建Laravel项目的项目文件夹。
# Create new project
laravel new PROJECT_NAME
使用代客
告诉代客将当前文件夹用作Laravel项目。
valet park
您现在可以在选择的IDE中打开您的项目,并浏览您的项目URL(例如http://PROJECT_FOLDER.test)
如果您想查看所有“停放”项目执行以下执行。
valet parked
Laravel项目结构
laravel在模型视频控制器结构中组织。
MVC
模型在/app/型号下找到。这些是可能借助Laravel CLI工具生成的数据模型。
视图在/Resources/countion 下找到。视图通常为 .blade.php 模板,但它们不必。
控制器在/app/http/Controllers 下找到。控制器用于处理业务逻辑并在模型的帮助下获取正确的数据,以将其传递给请求的视图。
路线
Laravel可以为“正常” Web应用程序以及API配置路由。
“正常”路由是在/routes/web.php 和API路由下配置的。
路由配置
路由可以使用绝对路径或动态参数(通配符)进行配置,如下所示。
// Get all
Route::get('/', function() {
return view('listings', [
'heading' => 'Latest Listings',
'listings' => Listing::all()
]);
});
// Get by id
Route::get('/listings/{id}', function($id) {
return view('listing', [
'listing' => Listing::find($id)
]);
});
查询字符串参数可以在Illuminate\Http\Request
类的帮助下读取。
use Illuminate\Http\Request;
// Get query string parameters
Route::get('/search', function(Request $request) {
return view('search', [
'name' => $request->name,
'city' => $request->city
]);
});
也可以向路线添加约束,仅允许特定值。
// Get by id -> id has to be a number
Route::get('/posts/{id}', function($id) {
return view('post', [
'post' => Post::find($id)
]);
})->where('id', '[0-9]+');
为了从API路线返回JSON,您可能会执行以下操作。
Route::get('/posts', function() {
return response()->json([
'posts' => [
[
'title' => 'Post One'
]
]
]);
});
从路线调用控制器动作
如果要在路由中调用控制器操作,则首先需要创建控制器。
php artisan make:controller ListingController
在控制器中您可以为所有操作创建公共功能。
// Show all listings
public function index() {
return view('listings', [
'listings' => Listing::all()
]);
}
// Show single listing
public function show(Listing $listing) {
return view('listing', [
'listing' => $listing
]);
}
路由定义可以比以下方式更改,我们在控制器类和操作/函数名称中传递。
// Get all
Route::get('/', [ListingController::class, 'index']);
// Get by id
Route::get('/listings/{listing}', [ListingController::class, 'show']);
路线行动命名约定
Laravel中的公共资源路线如下。
索引 - 显示所有项目
显示 - 显示一个项目
创建 - 显示创建新项目的表格
商店 - 存储新项目
编辑 - 显示一个表格编辑现有项目
更新 - 更新现有项目
销毁 - 删除现有项目
配置
可以在/config 下找到不同的系统配置文件。
数据库
在/config/database.php 文件中,您可以配置应使用哪种类型的数据库(例如mysql或sqlite等)。
要配置数据库连接,您可以在项目root文件夹中编辑 .env 文件。
刀片模板
Blade是一个简单的模板引擎,已包含在Laravel中。刀片模板被编译为普通的PHP代码。
将数据传递到视图
刀片视图(模板)可以使用全局 view 助手从路线或控制器返回。
Route::get('/', function() {
return view('greeting', ['name' => 'Finn']);
});
在视图中显示数据
name 变量可以如下显示在刀片模板中。
Hello, {{ $name }}
刀片指令
刀片指令由@符号逃脱。这些指令的功能与PHP对应物相同。根据https://laravel.com/docs/9.x/blade
可以找到详细的文档
@if (count($records) === 1)
<p>I have one record!</p>
@elseif (count($records) > 1)
<p>I have multiple records!</p>
@else
<p>I dont have any records!</p>
@endif
<h1>{{ $heading }}</h1>
@if(count($listings) == 0)
<p>No listings found</p>
@endif
@foreach($listings as $listing)
<h2>
<a href="/listings/{{$listing['id']}}">{{$listing['title']}}</a>
</h2>
<p>{{$listing['description']}}</p>
@endforeach
检查是否存在项目的替代方法是@unless
指令。
@unless(count($listings) == 0)
@foreach($listings as $listing)
<h2>{{$listing['title']}}</h2>
<p>
{{$listing['description']}}
</p>
@endforeach
@else
<p>No listings found</p>
@endunless
数据库处理
laravel支持不同的数据库系统,例如mysql,sqlite等。
mysql
# Start MySQL server
mysql.server start
# Login with root
mysql -u root -p
# Stop MySQL server
mysql.server stop
1.您应该为您的项目创建专用的MySQL用户
CREATE USER 'someuser'@'localhost' IDENTIFIED BY 'somepassword';
2.创建一个数据库
CREATE DATABASE somedatabasename;
3.授予新创建的用户访问数据库
GRANT ALL PRIVILEGES ON somedatabasename.* TO 'someuser'@'localhost';
FLUSH PRIVILEGES;
4.使用数据库设置更新项目根中的 .env 文件
迁移
数据库架构 /结构由数据库迁移管理。迁移可以在/数据库/迁移中找到。
创建一个新的迁移
创建一个新的迁移以创建一个名为 listings 执行以下命令的表。
php artisan make:migration create_listings_table
在迁移中添加表列
打开新创建的迁移文件(类似于2023_02_17_101605_CREATE_LISTINGS_TABLE.PHP),然后在 up up> up methot中添加丢失的列。
public function up()
{
Schema::create('listings', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('tags');
$table->string('company');
$table->string('location');
$table->string('email');
$table->string('website');
$table->longText('description');
$table->timestamps();
});
}
运行迁移
为了将迁移应用于数据库,请执行以下命令。
php artisan migrate
种子数据库
要在数据库中生成“虚拟”数据,您可以更新 run 方法,在/database/seeders/databaseseeder.php 文件中找到。在这里您可以调用工厂方法。
要实际执行数据库种子,请执行以下命令。
php artisan db:seed
刷新 /擦除数据库
要刷新 /擦除数据库,您可以执行以下命令。这将重新运行迁移并重新创建所有表。 注意:这将删除表数据
php artisan migrate:refresh
如果要刷新数据库,但也想执行数据库种子,您可以执行以下操作。
php artisan migrate:refresh --seed
创建模型
laravel使用雄辩的默认 orm 。要创建雄辩的模型,您可以执行以下命令。
php artisan make:model ModelName
创建工厂
工厂存储在/数据库/工厂下,可以如下创建。
php artisan make:factory FactoryName
在定义函数中,您可以在Faker的帮助下创建对象。
public function definition()
{
return [
'title' => $this->faker->sentence(),
'tags' => 'laravel, api, backend',
'company' => $this->faker->company(),
'email' => $this->faker->companyEmail(),
'website' => $this->faker->url(),
'location' => $this->faker->city(),
'description' => $this->faker->paragraph(5),
];
}
共享元素
可以在Laravel中扩展视图。通过这样做,可以在一个文件中定义一般页面布局,并将此布局扩展到附带特定内容。
您可以在/resources/views/下创建 _Layout.blade.php 文件。将以下内容添加到其中,您要包含特定侧面内容。
@yield('content')
创建实际侧面布局时,您可以按以下方式扩展一般页面布局。
@extends('_layout')
@section('content')
<h2>{{$listing['title']}}</h2>
<p>{{$listing['description']}}</p>
@endsection
部分
有时您想在多个页面上重新使用UI元素。为此,您可以将a部分包括在您的身边。
创建文件夹/resources/views/partials ,例如添加一个称为 _Search.blade.php 的文件,然后将布局(等)添加到其中。然后,您可以将其包含在不同的页面中,您希望它显示如下。
@include('partials/_search')
成分
组件与 partials 相似,您能够向组件提供数据(例如模型)。
创建文件夹/resources/views/components ,例如添加一个称为 listing-card.blade.blade.php 的文件,然后添加您的布局(等) 。为了接收传递给组件的数据添加以下内容。
@props(['listing'])
<h3>
<a href="/listings/{{$listing->id}}">{{$listing->title}}</a>
</h3>
为了使用组件并将数据传递给它,如下所示。
@foreach($listings as $listing)
<x-listing-card :listing="$listing"/>
@enddoreach
封闭组件
如果要使用组件来包装其他内容,例如如果您将创建具有特定背景和边框的 card 组件,则可以执行以下操作。
添加一个新组件,然后插入插槽以封闭内容的定位。为了定义默认CSS类,您可以使用$attributes->merge
函数。
<div {{$attributes->merge(['class' => 'bg-gray-50 border border-gray-200 rounded p-6'])}}>
{{$slot}}
</div>
并将其像“普通” HTML标签一样使用。提供的CSS类将添加到组件本身定义的默认类中。
<x-card class="p-10">
<p>Something in the card component</p>
</x-card>