Laravel 面试及回答

由 Jefsky 发布于 2024-02-24

Q1. 什么是Laravel?

答:Laravel是一个基于MVC设计模式的免费开源“PHP框架”。

它由Taylor Otwell创建。Laravel提供了富有表现力和优雅的语法,有助于轻松快速地创建出色的Web应用程序。

Q2. 列出Laravel提供的一些官方包?

答:

  • Cashier
  • Envoy
  • Passport
  • Scout
  • Socialite

Q3. 列出Laravel的最新功能。

答:

  • 内置的CSRF(跨站请求伪造)保护。
  • 内置的分页
  • 反向路由
  • 查询构建器
  • 路由缓存
  • 数据库迁移
  • IoC(控制反转)容器或服务容器。

Q4. 列出Laravel相对于其他Php框架的一些优势。

答:

  • 与其他框架相比,设置和定制过程既简单又快速。
  • 内置的身份验证系统。
  • 支持多个文件系统
  • 预加载的包,如Laravel Socialite、Laravel cashier、Laravel elixir、Passport、Laravel Scout。
  • Eloquent ORM(对象关系映射)与PHP活动记录实现。
  • 内置的命令行工具“Artisan”,用于创建代码骨架、数据库结构并构建其迁移。

Q5. 什么是composer?

答:Composer是用于安装PHP应用程序依赖项的PHP依赖项管理器。

Q6. 如何通过composer安装laravel?

答:composer create-project laravel/laravel your-project-name version

Q7. 如何检查laravel的当前版本?

答:您可以使用artisan命令的--version选项来检查Laravel安装的当前版本。

用法:

  • php artisan --version

Q8. 什么是php artisan。列出一些artisan命令?

答:PHPartisan是Laravel附带的命令行界面/工具。它提供了许多有用的命令,可以帮助您更轻松地构建应用程序。以下是一些artisan命令的列表:

  • php artisan list
  • php artisan help
  • php artisan tinker
  • php artisan make
  • php artisan --version (注意:这里应该是--version,而不是您在问题中写的--versian
  • php artisan make modal modal_name (注意:这里可能是个笔误,应该是php artisan make model model_name
  • php artisan make controller controller_name

Q9. 解释Laravel中的事件?

答:事件是由程序检测并处理的某个事件或发生的情况。Laravel事件提供了一个简单的观察者实现,允许我们在应用程序中订阅和监听事件。以下是Laravel中的一些事件示例:

  • 新用户已注册
  • 发布了新评论
  • 用户登录/注销
  • 添加了新产品。

Q10. 如何在Laravel中启用查询日志?

答:使用enableQueryLog方法:

DB::connection()->enableQueryLog();

您可以通过使用getQueryLog方法获取已执行的查询数组:

$queries = DB::getQueryLog();

Q11. 如何在Laravel中为路由关闭CRSF保护?

答:在“app/Http/Middleware/VerifyCsrfToken.php”中 //添加一个路由数组来跳过CSRF检查

private $exceptUrls = ['controller/route1', 'controller/route2'];

//修改这个函数 public function handle($request, Closure $next)

{ //添加这个条件

foreach($this->exceptUrls as $route) { if ($request->is($route)) { return $next($request); } } return parent::handle($request, $next); }

(注意:直接在中间件中硬编码要跳过的URL通常不是最佳实践。这只是一个示例来说明如何操作。在实际应用中,您可能会找到更灵活和安全的方法来处理此问题。)

Q12. 什么是Lumen?

答:Lumen是一个基于Laravel顶级组件构建的PHP微框架。它由Taylor Otwell创建。它是构建基于Laravel的微服务和快速REST API的完美选择。它是可用的最快的微框架之一。

Q13. 什么是laravel facades?

答:Laravel Facades为应用程序服务容器中的类提供了一个类似静态的接口。Laravel自带了许多facades,这些facades提供了对Laravel大部分功能的访问。Laravel Facades作为底层服务容器中类的“静态代理”,提供了比传统静态类方法更简洁、更富有表现力的语法,同时保持了更好的可测试性和灵活性。Laravel的所有facades都定义在Illuminate\Support\Facades命名空间中。您可以轻松地访问一个Facade,如下所示:

use Illuminate\Support\Facades\Cache;

Route::get('/cache', function () {

return Cache::get('key');

});

Q14. 什么是laravel Contracts?

答:Laravel的Contracts是一组定义Laravel框架提供的核心服务的接口。

Q15. 解释Laravel服务容器?

答:Laravel的服务容器是其最强大的功能之一,它是一个用于解析类依赖项和执行依赖项注入的强大工具。依赖项注入是一个花哨的短语,它本质上意味着类的依赖项是通过构造函数或(在某些情况下)通过“setter”方法“注入”到类中的。

(注意:您提供的文本在这里中断了,所以我没有关于“您可以从这里阅读更多关于Laravel的内容”的翻译。)

Q16. 在Laravel中如何获取用户的IP地址?

答:您可以使用以下函数来获取用户的IP地址:

public function getUserIp(Request $request) {

// 获取远程用户的IP地址

return $user_ip_address = $request->ip();

}

Q17. 如何在Laravel模型中使用自定义表?

答: 我们可以通过重写Eloquent的$table属性来在Laravel中使用自定义表。以下是一个示例:

class User extends Model { // 注意:应该是 Model 而不是 Eloquent
    protected $table = "my_user_table";
}

Q18. Laravel Eloquent是什么?

答: Laravel包含的Eloquent ORM为数据库操作提供了一个简洁、优雅的ActiveRecord实现。每个数据库表都有一个对应的“模型”,用于与该表进行交互。模型允许您查询表中的数据,以及向表中插入新记录。

Q19. 如何在Laravel模型中定义可填充属性?

答: 您可以通过重写Laravel Eloquent的$fillable属性来定义可填充属性。以下是一个示例:

class User extends Model {
    protected $fillable = ['id', 'first_name', 'last_name', 'age']; // 注意:通常不推荐将'id'包含在fillable属性中,因为它通常是自动增长的
}

Q20. Laravel的vendor目录中包含什么?

答: 我们通过composer安装的所有包都保存在Laravel的vendor目录中。

Q21. 在Laravel中,控制器位于哪个目录?

答: 我们将所有的控制器保存在app/Http/Controllers目录中。(注意:大小写和目录结构需要准确)

Q22. PHP的compact函数是做什么的?

答: PHP的compact函数接受一个或多个字符串参数,并尝试找到与这些字符串同名的变量。如果找到了变量,它就创建一个关联数组,其中键是变量名,值是变量的值。

Q23. 定义ORM?

答: 对象关系映射(ORM)是一种编程技术,用于在面向对象编程语言中将数据在不兼容的类型系统之间进行转换。

Q24. 如何使用Eloquent在Laravel中创建记录?

答: 要使用Laravel Eloquent在数据库中创建新记录,只需创建一个新的模型实例,设置模型的属性,然后调用save方法。以下是一个示例用法:

public function saveProduct(Request $request) {
    $product = new Product; // 注意:类名应该是Product,首字母大写,并且与模型文件名匹配
    $product->name = $request->name;
    $product->description = $request->description; // 这里应该是description而不是重复的name
    $product->save();
}

Q25. 列出Laravel查询构建器提供的一些聚合方法?

答:

  • count()
  • max()
  • min()
  • avg()
  • sum()

Q26. Laravel中Eloquent的cursor()方法的用途是什么?

答: cursor方法允许您通过游标迭代数据库记录,这只会执行单个查询。在处理大量数据时,cursor方法可用于大大减少内存使用量。

示例用法:

foreach (Product::where('name', 'bar')->cursor() as $product) {
    // 执行一些操作
}

Q27. 如何在Laravel中获取已登录用户的信息?

答: 使用Auth::user()函数可以在Laravel中获取已登录用户的信息。用法如下:

if (Auth::check()) {
    $loggedInUser = Auth::user();
    dd($loggedInUser);
}

Q28. Laravel中的闭包是什么?

答: 闭包是一个匿名函数,可以分配给变量或作为参数传递给其他函数。闭包可以访问在其创建时所在作用域之外的变量。

Q29. Laravel的优点是什么?

答:

  • 语法简单且一致
  • 设置过程简单
  • 定制过程简单
  • Laravel的代码总是规整的

Q30. Laravel 5.0的特性是什么?

答:

  • 方法注入
  • 合约(Contracts)
  • 路由缓存
  • 事件对象
  • 多文件系统
  • 身份验证脚手架
  • dotenv - 环境检测
  • Laravel调度器

Q31. 比较Laravel和CodeIgniter?

答: (此问题较为开放,以下是比较的一些方面)

  • Laravel具有表达性和优雅的语法,而CodeIgniter是一个功能强大的PHP框架,提供简单的工具集来创建全功能的Web应用程序。
  • Laravel的开发过程是一种令人愉快和富有创造性的体验,而CodeIgniter以其简单和优雅的工具包而闻名。
  • Laravel是为PHP的最新版本构建的,而CodeIgniter是一个更旧、更成熟的框架。
  • Laravel与CodeIgniter相比更加面向对象。
  • Laravel社区虽然规模仍然较小,但增长非常迅速,而CodeIgniter社区规模较大。

Q32. 什么是Bundles、Reverse Routing和IoC容器?

答:

  • Bundles:这些是您可以下载并添加到Web应用程序中的小功能。但在Laravel中,更常见的术语是“包”(Packages),而不是Bundles。这可能是对旧版Laravel或另一个框架的引用。
  • 反向路由:这允许您更改路由,应用程序将更新所有相关链接以匹配此更改。Laravel通过命名路由提供了此功能。
  • IoC容器:IoC(控制反转)容器为您提供了生成新对象的方法,并可选择实例化和引用单例。Laravel的服务容器是一个强大的IoC容器实现。

Q33. 如何在Laravel中设置数据库连接?

答: 数据库配置文件路径是:config/database.php。以下是一个数据库配置文件的示例:

'mysql' => [
    'read' => [
        'host' => 'localhost',
    ],
    'write' => [
        'host' => 'localhost'
    ],
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
],

但是,请注意,Laravel通常不会为读写分离配置单独的'read''write'键。这可能是对特定设置或扩展包的引用。在标准的Laravel配置中,您通常会看到类似'connections'键下的配置。

Q34. 如何启用查询日志记录?

答: 使用DB::connection()->enableQueryLog();可以启用查询日志记录。之后,您可以使用DB::getQueryLog();来检索已执行的查询列表。

Q35. 如何在Laravel中使用select查询?

答: $users = DB::select('select * from users where city_id = ?', [10]);。注意,我添加了一个包含绑定参数的数组,这是推荐的方式来避免SQL注入攻击。之后,您可以像下面这样遍历结果:

if (!empty($users)) {
    foreach ($users as $user) {
        // 处理每个用户的数据
    }
}

这些问题和答案看起来像是关于Laravel框架的常见问题集(FAQ)。不过,有几个问题的答案存在重复或者需要改进的地方。以下是对这些问题的翻译和改进后的答案:

Q36: 在Laravel中如何使用Insert语句?

答:

DB::insert('insert into users (id, name, city_id) values (?, ?, ?)', [1, 'Web technology', 10]);

或者使用Eloquent ORM:

$user = new User;
$user->id = 1;
$user->name = 'Web technology';
$user->city_id = 10;
$user->save();

Q37: 在Laravel中如何使用Update语句?

答:

DB::update('update users set city_id = 10 where id = ?', [1015]);

或者使用Eloquent ORM:

User::where('id', 1015)->update(['city_id' => 10]);

Q38: (重复了Q37)在Laravel中如何使用Update语句?

答: (同Q37的答案)

Q39: 在Laravel中如何使用Delete语句?

答:

DB::delete('delete from users where id = ?', [1015]);

或者使用Eloquent ORM:

User::destroy(1015);

Q40: Laravel支持缓存吗?

答: 是的,Laravel提供了缓存支持。

Q41: 什么是HTTP中间件?

答: 中间件提供了一个方便的机制来过滤进入你的应用的HTTP请求。例如,Laravel包括一个中间件来验证你的应用的用户是否已经认证。如果用户未认证,中间件会将用户重定向到登录屏幕。然而,如果用户已经认证,中间件将允许请求进一步进入应用。当然,除了认证之外,还可以编写额外的中间件来执行各种任务。一个CORS中间件可能负责向离开你的应用的所有响应添加适当的头。一个日志中间件可能会记录所有进入你的应用的请求。Laravel框架中包含几个中间件,包括用于认证和CSRF保护的中间件。所有这些中间件都位于app/Http/Middleware目录中。

Q42: 什么是数据库迁移?如何使用它来向数据库添加初始数据?

答: 迁移就像数据库的版本控制,允许你的团队轻松地修改和共享应用的数据库模式。迁移通常与Laravel的模式构建器配对,以轻松构建你的应用的数据库模式。如果你曾经不得不告诉队友手动向他们的本地数据库模式添加列,那么你就遇到了数据库迁移要解决的问题。Laravel包括一个使用种子类向数据库添加测试数据的简单方法。所有的种子类都存储在database/seeds目录中。种子类可以有任何你想要的名称,但可能应该遵循一些合理的约定,如UsersTableSeeder等。默认情况下,为你定义了一个DatabaseSeeder类。从这个类中,你可以使用call方法来运行其他种子类,允许你控制播种顺序。要向数据库添加初始数据,你可以创建一个种子类并在其中定义要插入的数据。然后,你可以使用php artisan db:seed命令来运行种子类并插入数据。你还可以在迁移中使用DB::table()->insert()方法来插入初始数据。但是,这通常不是最佳实践,因为它将数据插入逻辑与数据库模式更改混合在一起。相反,最好使用种子类来管理初始数据插入。

Q43: Laravel安装时需要哪些目录可写?

答: 安装Laravel后,你可能需要配置一些权限。storage目录和bootstrap/cache目录内的目录应该可由你的Web服务器写入,否则Laravel将无法运行。如果你正在使用Homestead虚拟机,这些权限应该已经设置好了。

Q44: 如何在Laravel中实现自己的包?

答: 你可以按照以下步骤在Laravel中创建自己的包:

  1. 包文件夹和名称:首先,为你的包创建一个文件夹,并给它一个唯一的名称。这通常是在packages目录下完成的(如果你还没有这个目录,你需要创建它)。例如,你可以创建一个名为vendor/package的目录结构。
  2. Composer.json文件:在包的根目录下创建一个composer.json文件。这个文件描述了你的包及其依赖关系。确保包含名称、描述、版本、作者、要求和其他相关信息。
  3. 通过主composer.json和PSR-4加载包:在你的主Laravel项目的composer.json文件中,你需要添加一个PSR-4自动加载条目来指向你的包。例如:"psr-4": { "Vendor\\Package\\": "packages/vendor/package/src" }。然后运行composer dump-autoload来重新生成自动加载文件。
  4. 创建服务提供者:服务提供者是Laravel包的核心部分之一。它负责绑定服务到容器、注册事件、路由等。创建一个继承自Illuminate\Support\ServiceProvider的类,并在其中定义你的包的启动和服务绑定逻辑。
  5. 创建控制器:为你的包创建一个或多个控制器来处理请求和响应。这些控制器应该放在包的src/Http/Controllers目录中。
  6. 创建路由文件:在包的src/routes目录下创建一个路由文件(例如web.php),并定义你的包的路由。然后,在你的服务提供者的boot方法中,使用$this->loadRoutesFrom()方法来加载这些路由。
  7. 注册服务提供者:最后,你需要在Laravel的配置文件中注册你的服务提供者。这通常是在config/app.php文件的providers数组中完成的。添加你的服务提供者的完整类名到该数组中。
  8. 发布资源:如果你的包包含配置文件、视图、迁移等,你可能还需要使用Laravel的发布功能来将这些资源发布到主Laravel项目中。这可以通过在你的服务提供者中定义publishes属性来实现。然后,用户可以使用php artisan vendor:publish命令来选择性地发布你的包的资源。

Q45. Laravel 4 和 Laravel 5.x 之间的主要区别是什么?

答:总结 Laravel 5.0 从上述文章的发布说明:

  • 旧的app/models目录已被完全移除。
  • 控制器、中间件和请求(Laravel 5.0 中的一种新类型的类)现在被分组在 app/Http 目录下。
  • 一个新的 app/Providers 目录替换了 Laravel 4.x 之前版本中的 app/start 文件。
  • 应用程序语言文件和视图已移动到 resources 目录中。
  • 所有主要的 Laravel 组件都实现了位于 illuminate/contracts 存储库中的接口。
  • 新的 route:cache Artisan 命令可以大大加速路由的注册。
  • Laravel 5 现在支持 HTTP 中间件,并且包含的认证和 CSRF "过滤器" 已经被转换为中间件。
  • 您现在可以在控制器方法上键入依赖提示。
  • 用户注册、身份验证和密码重置控制器现在已开箱即用,以及位于 resources/views/auth 的简单对应视图。
  • 您现在可以将事件定义为对象,而不仅仅是使用字符串。
  • 除了 Laravel 4 支持的队列作业格式外,Laravel 5 还允许您将排队作业表示为简单的命令对象。这些命令位于 app/Commands 目录中。
  • Laravel 中现在包含一个数据库队列驱动程序,它提供了一个简单的本地队列驱动程序,除了数据库软件之外,不需要安装额外的包。
  • Laravel 命令调度程序允许您在 Laravel 本身内流畅且富有表现力地定义您的命令调度,并且您的服务器上只需要一个 Cron 条目。
  • php artisan tinker 命令现在使用 Justin Hileman 的 Psysh,这是一个更强大的 PHP REPL。
  • Laravel 5 现在使用 Vance Lucas 的 DotEnv。
  • Jeffrey Way 的 Laravel Elixir 为编译和连接您的资产提供了一个流畅、富有表现力的界面。
  • Laravel Socialite 是一个可选的、与 Laravel 5.0+ 兼容的包,它提供了与 OAuth 提供商完全无痛的认证。
  • Laravel 现在包含了强大的 Flysystem 文件系统抽象库,它与本地、Amazon S3 和 Rackspace 云存储提供了无痛的集成 - 所有这些都通过一个统一且优雅的 API!
  • Laravel 5.0 引入了表单请求,它扩展了 Illuminate\Foundation\Http\FormRequest 类。这些请求对象可以与控制器方法注入相结合,以提供无需样板的方法来验证用户输入。
  • Laravel 5 基础控制器现在包含一个 ValidatesRequests 特性。此特性提供了一个简单的 validate 方法来验证传入的请求。
  • 框架中添加了新的 Artisan 生成器命令。
  • 流行的 dd 辅助函数(用于转储变量调试信息)已升级为使用神奇的 Symfony VarDumper。

Q46. 什么是路由,如何编写,以及编写它的不同方式是什么?

答:在 Laravel 中,路由是指定义应用程序端点与对应处理这些请求的代码之间的映射的过程。路由允许您指定应用程序的 URL 结构,并将这些 URL 映射到相应的控制器或处理逻辑上。

路由定义通常位于 Laravel 项目的 routes 目录中。对于 Web 界面,路由通常定义在 routes/web.php 文件中;而对于无状态的 API 路由,它们则定义在 routes/api.php 文件中。

编写路由的基本方式

  1. 基础路由:直接映射一个 URL 到一个闭包函数。
Route::get('/welcome', function () {
    return view('welcome');
});
  1. 路由到控制器:将一个 URL 映射到一个控制器的方法。
Route::get('/user/{id}', 'UserController@show');
  1. 命名路由:为路由指定一个名称,以便在生成 URL 或重定向时使用。
Route::get('/user/{id}/profile', 'UserController@profile')->name('profile');
  1. 路由组:将多个路由分组在一起,共享属性,如中间件或命名空间。
Route::middleware(['auth'])->group(function () {
    Route::get('/user/profile', 'UserController@profile');
    Route::get('/user/settings', 'UserController@settings');
});
  1. 路由模型绑定:将路由参数自动解析为 Eloquent 模型实例。
Route::get('/posts/{post}', 'PostsController@show');
  1. 表单方法伪造:使用 POST 请求来模拟 PUTPATCHDELETE 请求。
  2. 路由回退/通配符路由:匹配所有其他路由的“捕获所有”路由。
  3. 访问控制:使用中间件来限制对路由的访问,如 auth 中间件用于需要身份验证的路由。
  4. API 资源路由:为构建 RESTful API 提供了一种快速声明路由的方法。例如,使用 Route::resource()Route::apiResource() 方法。
  5. 路由缓存:为了提高性能,可以使用 php artisan route:cache 命令来缓存路由定义。这在生产环境中特别有用,因为它可以减少注册所有路由所需的时间。但是,请注意,在使用路由缓存时,每次修改路由定义后都需要重新缓存路由。
转载自 mytectra —— Laravel Interview Questions and Answers