什么是 Laravel 框架?
Laravel 是一个开源的 PHP Web 应用程序框架。它是一个有据可查、富有表现力且易于学习的框架。Laravel 对开发人员非常友好,因为该框架可以帮助初学者和高级用户。随着开发人员的成长,你可以更深入地了解 Laravel 功能并提供更强大的企业级解决方案。
此外,该框架具有很强的可扩展性,因为你可以使用 Vapor 之类的包来使用 AWS 无服务器技术处理数十万个请求。
本文将带你了解基本的 Laravel 面试问题到高级问题。
基础的Laravel常见面试题和答案合集
1. Laravel 最新版本是多少?
最新的 Laravel 版本是 8.x。
2. 定义Composer。
Laravel常见面试题有哪些:Composer 是框架的包管理器。它有助于将来自庞大社区的新包添加到你的 Laravel 应用程序中。
例如,最常用的身份验证包之一是 Passport,要将其包含到你的项目中,你可以在终端上运行以下命令:
composer requires laravel/passport
它会在你的项目目录中生成一个文件 (composer.json) 以跟踪你的所有包。Laravel 项目的默认 composer.json 文件如下所示:
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
"license": "MIT",
"require": {
"php": "^7.3|^8.0",
"fideloper/proxy": "^4.4",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^8.12",
"laravel/tinker": "^2.5"
},
"require-dev": {
"facade/ignition": "^2.5",
"fakerphp/faker": "^1.9.1",
"laravel/sail": "^1.0.1",
"mockery/mockery": "^1.4.2",
"nunomaduro/collision": "^5.0",
"phpunit/phpunit": "^9.3.3"
}
}
composer.json 中的“require”和“require-dev”键分别指定生产和开发包及其版本约束。
3. Laravel 中使用的模板引擎是什么?
Laravel面试题解析:Laravel 中使用的模板引擎是Blade。Blade 能够将其类似 mustache 的语法与普通 PHP 一起使用,并被编译为普通 PHP 并缓存,直到刀片文件中发生任何其他更改。刀片文件的扩展名为 .blade.php。
4. Laravel 支持哪些可用的数据库?
laravel 支持的数据库有:
- PostgreSQL
- SQL Server
- SQLite
- MySQL
5. 什么是Artisan?
Artisan 是 Laravel 的命令行工具,可帮助开发人员构建应用程序。你可以输入以下命令以获取所有可用命令:
PHP artisan list:Artisan 命令可以帮助使用 make 命令创建文件。下面列出了一些有用的 make 命令:
php artisan make:controller
- 制作控制器文件
php artisan make:model
- 制作模型文件
php artisan make:migration
- 制作迁移文件
php artisan make:seeder
- 制作播种机文件
php artisan make:factory
- 制作工厂文件
php artisan make:policy
- 制作政策文件
php artisan make:command
- 创建一个新的Artisan 命令
6. Laravel 中如何定义环境变量?
环境变量可以在项目目录的 .env 文件中定义。一个全新的 Laravel 应用程序带有一个 .env.example ,在安装时我们复制这个文件并将其重命名为 .env ,所有环境变量都将在此处定义。
环境变量的一些示例是 APP_ENV、DB_HOST、DB_PORT 等。
7. 我们可以使用 Laravel 进行全栈开发(前端 + 后端)吗?
Laravel 是制作渐进式、可扩展的全栈 Web 应用程序的最佳选择。全栈 Web 应用程序可以在 laravel 中有后端,前端可以使用刀片文件或使用 Vue.js 的 SPA 来制作,因为它是默认提供的。但它也可用于仅向 SPA 应用程序提供其余 API。
因此,Laravel 可用于制作全栈应用程序或仅用于后端 API。
8. 如何将 Laravel 应用程序置于维护模式?
维护模式用于向客户提供维护页面,在后台,我们可以进行软件更新、错误修复等。 Laravel 应用程序可以使用以下命令进入维护模式:
php artisan down
并且可以使用以下命令重新启动应用程序:
php artisan up
此外,可以通过将特定 IP 列入白名单以维护模式访问网站。
9. Laravel 默认的路由文件有哪些?
以下是 Laravel 中 routes 文件夹中的四个默认路由文件:
- web.php - 用于注册网络路由。
- api.php - 用于注册 API 路由。
- console.php - 用于注册基于闭包的控制台命令。
- channel.php - 用于注册你的应用程序支持的所有事件广播频道。
10. Laravel常见面试题和答案合集:Laravel 中的迁移是什么?
简单来说,Migrations 用于在 Laravel 中创建数据库模式。在迁移文件中,我们存储要创建、更新或删除的表。
每个迁移文件都与其创建时间戳一起存储,以跟踪其创建顺序。随着你在 GitHub、GitLab 等中的代码进行迁移,每当有人克隆你的项目时,他们都可以运行“PHP artisan migrate”来运行这些迁移以在他们的环境中创建数据库。正常的迁移文件如下所示:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
// Create other columns
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
up() 方法在我们运行 `php artisan migrate` 时运行,而 down() 方法在我们运行 `php artisan migrate:rollback` 时运行。
如果我们回滚,它只会回滚之前运行的迁移。
如果我们想回滚所有迁移,我们可以运行'php artisan migrate:reset`。
如果我们想回滚和运行迁移,我们可以运行`PHP artisan migrate:refresh`,我们可以使用`PHP artisan migrate:fresh`先删除表,然后从头开始运行迁移。
11. Laravel 中的Seeder是什么?
Laravel 中的 Seeder 用于自动将数据放入数据库表中。在运行迁移以创建表后,我们可以运行 `php artisan db:seed` 来运行播种器来填充数据库表。
我们可以使用以下 artisan 命令创建一个新的 Seeder:
php artisan make:seeder [className]
它将创建一个新的播种机,如下所示:
<?php
use App\Models\Auth\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
class UserTableSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run()
{
factory(User::class, 10)->create();
}
}
上面代码片段中的 run() 方法将使用 User 工厂创建 10 个新用户。
工厂将在下一个问题中解释。
12. Laravel常见面试题有哪些:Laravel 的工厂是什么?
工厂是一种自动将值放入特定模型字段的方法。比如,当我们在数据库中添加多个假记录时,为了测试,我们可以使用工厂为每个模型生成一个类,并相应地将数据放入字段中。每个新的 Laravel 应用程序都带有 database/factories/UserFactory.php,如下所示:
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class UserFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = User::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
}
我们可以使用php artisan make:factory UserFactory --class=User
.
上面的命令将为 User 模型创建一个新的工厂类。它只是一个扩展了基本 Factory 类并利用 Faker 类为每一列生成假数据的类。通过工厂和播种机的结合,我们可以轻松地将虚假数据添加到数据库中以进行测试。
13. Laravel 如何实现软删除?
软删除是指在数据库中以任何方式删除任何数据行时,我们不是删除数据,而是添加删除时间戳。
我们可以通过在模型文件中添加一个特征来添加软删除功能,如下所示。
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model {
use SoftDeletes;
protected $table = 'posts';
// ...
}
14. 什么是模型?
Laravel面试题解析:使用 Laravel,每个数据库表都可以使用模型文件来表示模型,该模型文件可用于使用 Laravel Eloquent ORM 与该表进行交互。
我们可以使用这个 artisan 命令创建一个模型:
php artisan make:model Post
这将在模型目录中创建一个文件,如下所示:
class Post extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [];
}
模型可以具有表、可填充、隐藏等属性,这些属性定义了表和模型的属性。
高级Laravel常见面试题和答案合集
15. Laravel 中的关系是什么?
Laravel 中的关系是一种定义应用程序中不同模型之间关系的方法。它与关系数据库中的关系相同。
Laravel 中可用的不同关系是:
- 一对一
- 一对多
- 多对多
- 有一个通过
- 有很多通过
- 一对一(多态)
- 一对多(多态)
- 多对多(多态)
关系被定义为模型类上的方法。一对一关系的示例如下所示。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the phone associated with the user.
*/
public function phone()
{
return $this->hasOne(Phone::class);
}
}
User 模型上的上述方法 phone 可以像这样调用:`$user->phone` 或 `$user->phone()->where(...)->get()`。
我们还可以定义一对多关系,如下所示:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the addresses for the User.
*/
public function addresses()
{
return $this->hasMany(Address::class);
}
}
由于一个用户可以有多个地址,我们可以在 User 和 Address 模型之间定义一对多的关系。现在,如果我们调用`$user->addresses`,eloquent 将在表之间进行连接并返回结果。
16. Laravel 中的 Eloquent 是什么?
Eloquent 是用于使用模型类与数据库交互的 ORM。它为类对象提供了方便的方法来对数据库进行查询。
它可以直接用于从任何表中检索数据并运行任何原始查询。但是结合模型,我们可以利用它的各种方法,也可以利用模型上定义的关系和属性。
下面是一些使用 Eloquent 的例子:
- `DB::table(‘users’)->get()`
- `User::all()`
- `User::where(‘name’, ‘=’, ‘Eloquent’)->get()`
17. 什么是节流以及如何在 Laravel 中实现它?
节流是对来自特定 IP 的请求进行速率限制的过程。这也可用于防止 DDOS 攻击。对于节流,Laravel 提供了一个可以应用于路由的中间件,它可以添加到全局中间件列表中,也可以为每个请求执行该中间件。
以下是将其添加到特定路由的方法:
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::get('/user', function () {
//
});
});
这将使特定用户在一分钟内只能从特定 IP 访问 /user 路由 60 次。
18. 什么是Facades?
Facades 是一种在 Laravel Container 中注册你的类及其方法的方法,因此它们在通过反射解析后可以在你的整个应用程序中使用。
使用 Facades 的主要好处是我们不必记住很长的类名,也不需要在任何其他类中使用这些类来使用它们。它还为应用程序提供了更多的可测试性。
下图可以帮助你理解为什么使用 Facades:
19. Laravel 中的事件是什么?
在 Laravel 中,事件是一种订阅应用程序中发生的不同事件的方法。我们可以制作事件来表示特定的事件,例如用户登录、用户退出、用户创建的帖子等。之后我们可以通过制作 Listener 类来监听这些事件并执行一些任务,例如,用户登录然后输入审核应用程序的记录器。
为了在 laravel 中创建一个新事件,我们可以调用下面的 artisan 命令:
php artisan make:event UserLoggedIn
这将创建一个新的事件类,如下所示:
<?php
namespace App\Events;
use App\Models\User;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class UserLoggedIn
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* The user instance.
*
* @var \App\Models\User
*/
public $user;
/**
* Create a new event instance.
*
* @param \App\Models\User $user
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
}
为了让这个事件起作用,我们还需要创建一个监听器。我们可以像这样创建一个监听器:
php artisan make:listener SetLogInFile --event=UserLoggedIn
下面生成的侦听器类将负责在触发 UserLoggedIn 事件时进行处理。
use App\Events\UserLoggedIn;
class SetLogInFile
{
/**
* Handle the given event.
*
* @param \App\Events\UserLoggedIn
* @return void
*/
public function handle(UserLoggedIn $event)
{
//
}
}
20. Laravel常见面试题有哪些:解释一下 Laravel 的日志记录?
Laravel Logging 是一种记录应用程序内部发生的信息的方法。Laravel 提供了不同的日志记录通道,例如 file 和 slack。日志消息也可以一次写入多个通道。
我们可以配置用于登录到我们的环境文件或 config/logging.php 的配置文件中的通道。
21. Laravel 中什么是本地化?
本地化是一种提供有关客户语言偏好的内容的方法。我们可以创建不同的本地化文件并使用像这样的 Laravel 辅助方法:`__('auth.error')` 来检索当前语言环境中的翻译。这些本地化文件位于 resources/lang/[language] 文件夹中。
22. Laravel 中的请求是什么?
Laravel 中的请求是一种与传入的 HTTP 请求以及会话、cookie 甚至文件(如果随请求一起提交)进行交互的方式。
负责执行此操作的类是 Illuminate\Http\Request。
当任何请求被提交到 Laravel 路由时,它会传递到控制器方法,并且在依赖注入的帮助下,请求对象在方法中可用。我们可以对请求执行各种操作,例如验证或授权请求等。
23. Laravel 如何做请求验证?
Laravel面试题解析:Laravel 中的请求验证可以通过控制器方法来完成,或者我们可以创建一个请求验证类来保存验证规则和与之相关的错误消息。
下面是其中一个示例:
/**
* Store a new blog post.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// The blog post is valid...
}
24. Laravel 中的服务容器是什么?
Laravel 中的服务容器或 IoC 负责管理类依赖项,这意味着不是每个文件都需要手动注入类中,而是由服务容器自动完成。服务容器主要用于在控制器中注入类,如注入请求对象。我们也可以在路由绑定中根据 id 注入一个 Model。
例如,如下所示的路线:
Route::get('/profile/{id}', 'UserController@profile');
使用如下所示的控制器。
public function profile(Request $request, User $id)
{
//
}
在 UserController 配置文件方法中,我们可以获取 User 模型作为参数的原因是服务容器,因为 IoC 在启动服务器时解决了所有控制器中的所有依赖项。这个过程也称为路由模型绑定。
25. 什么是服务提供者?
服务提供者是一种在启动应用程序之前引导或注册服务、事件等的方法。Laravel 自己的引导也发生在使用服务提供者。此外,使用其服务提供者注册服务容器绑定、事件侦听器、中间件,甚至路由。
如果我们正在创建我们的应用程序,我们可以在提供者类中注册我们的外观。
26、Service Provider类中的注册和启动方法是什么?
Service Provider 类中的 register 方法用于将类或服务绑定到 Service Container。它不应用于从应用程序访问任何其他功能或类,因为你正在访问的服务可能尚未加载到容器中。
boot 方法在容器中包含所有依赖项之后运行,现在我们可以访问 boot 方法中的任何功能。就像你可以在引导方法中创建路由、创建视图Composer等一样。
27. Laravel 如何定义路由?
Laravel 路由在 routes/web.php 中的路由文件中定义,用于 Web 应用程序路由。可以使用 Illuminate\Support\Facades\Route 并调用其静态方法(例如 get、post、put、delete 等)来定义路由。
use Illuminate\Support\Facades\Route;
Route::get('/home', function () {
return 'Welcome to Home Sweet Home';
});
典型的闭包路由如上所示,我们提供 URI 和闭包函数以在访问该路由时执行。
Route::get('/hello', 'HomeController@index');
另一种方式如上,我们可以直接给出控制器名称和调用的方法,这可以再次使用服务容器解决。
28. 什么是命名路由?
命名路由是具有分配给它的名称的路由定义。然后我们可以使用该名称来调用应用程序中任何其他位置的路由。
Route::get('/hello', 'HomeController@index')->name('index');
可以使用以下命令在控制器中访问它:
return redirect()->route('index');
29. 什么是路由组?
当我们需要对中间件、前缀等路由属性进行分组时,会使用 Laravel 中的路由组。我们使用路由组。把每个属性放到每条路由上,这让我们很头疼。
句法:
Route::middleware(['throttleMiddleware'])->group(function () {
Route::get('/', function () {
// Uses throttleMiddleware
});
Route::get('/user/profile', function () {
// Uses throttleMiddleware
});
});
30. 什么是中间件以及如何在 Laravel 中创建中间件?
中间件使开发人员能够检查和过滤我们应用程序的传入 HTTP 请求。Laravel 附带的一个这样的中间件是身份验证中间件,它检查用户是否通过身份验证,如果用户通过身份验证,它将在应用程序中进一步执行,否则它将用户返回到登录屏幕。
我们总是可以为我们的目的创建一个新的中间件。为了创建一个新的中间件,我们可以使用下面的 artisan 命令:
php artisan make:middleware CheckFileIsNotTooLarge
上面的命令将在 app/Http/Middleware 文件夹中创建一个新的中间件文件。
31.如何在laravel中为资源创建路由?
要创建资源路由,我们可以使用以下命令:
Route::resource('blogs', BlogController::class);
这将为索引、创建、存储、显示、编辑、更新和删除六个操作创建路由。
32. Laravel 中什么是依赖注入?
Laravel 服务容器或 IoC 解决了所有控制器中的所有依赖项。因此,我们可以在控制器方法或构造函数中对任何依赖项进行类型提示。方法中的依赖会被解析并注入到方法中,这种解析类的注入称为依赖注入。
33. Laravel常见面试题有哪些:什么是集合?
Laravel 中的集合是 Laravel 中数据数组的包装器。当我们从数据库中查询数据时,来自 Eloquent ORM 的所有响应都是集合(数据记录数组)。
集合为我们提供了方便的方法来轻松处理数据,例如循环数据或对其进行一些操作。
34. 什么是合约(Contracts)?
Laravel Contracts 是一组带有实现方法的接口,用于完成 Laravel 的核心任务。
Laravel 中合约的几个例子是 Queue 和 Mailer。队列合约有一个队列作业的实现,而邮件合约有一个发送电子邮件的实现。
35. Laravel 中的队列是什么?
在构建任何应用程序时,我们都会面临这样一种情况,即某些任务需要时间来处理,并且我们的页面会在该任务完成之前加载。一个任务是在用户注册时发送电子邮件,我们可以将电子邮件作为后台任务发送给用户,因此我们的主线程始终处于响应状态。队列是在后台运行此类任务的一种方式。
36. 什么是访问器和修改器?
Laravel面试题解析:访问器是在对从数据库中检索到的字段进行一些操作后,从 eloquent 中检索数据的一种方式。例如,如果我们需要组合用户的名字和姓氏,但我们在数据库中有两个字段,但是我们希望每当我们从 eloquent 查询中获取数据时,都需要组合这些名称。
我们可以通过创建一个像下面这样的访问器来做到这一点:
public function getFullNameAttribute()
{
return $this->first_name . " " . $this->last_name;
}
上面的代码会做的是它会在模型的集合中给出另一个属性(full_name),所以如果我们需要组合名称,我们可以这样称呼它:`$user->full_name`。修改器是一种在将特定字段保存到数据库之前对其进行一些操作的方法。
例如,如果我们希望在将名字保存到数据库之前将其大写,我们可以创建如下所示的内容:
public function setFirstNameAttribute($value)
{
$this->attributes[‘first_name’] = strtoupper($value);
}
因此,每当我们将此字段设置为任何内容时:
$user->first_name = Input::get('first_name');
$user->save();
它会将 first_name 更改为大写,并将保存到数据库中。
Laravel常见面试题和答案合集结论
Laravel 是最常用的 Web 开发 PHP 框架。Laravel 面试包括有关对 PHP MVC 架构和应用程序开发基础知识(如路由、控制器、视图)以及高级主题(如服务容器、依赖注入、访问器和修改器等)的深入理解的问题。