Code Monkey home page Code Monkey logo

routing's Introduction

Symfony CMF Routing

Build Status Latest Stable Version Latest Unstable Version License

Total Downloads Monthly Downloads Daily Downloads

This package is part of the Symfony Content Management Framework (CMF) and licensed under the MIT License.

The Symfony CMF Routing component extends the Symfony routing component with additional features:

  • A ChainRouter to run several routers in parallel
  • A DynamicRouter that can load routes from any database and can generate additional information in the route match.

The CMF Routing component does not need the Symfony full stack framework. It is also useful in applications not using the full Symfony framework.

For the best integration into the Symfony full stack framework, it is recommended to use the RoutingBundle when building Symfony full stack applications.

Requirements

See the require section of composer.json

Documentation

For the install guide and reference, see:

See also:

Support

For general support and questions, please use StackOverflow.

Contributing

Pull requests are welcome. Please see our CONTRIBUTING guide.

Thanks to everyone who has contributed already.

License

This package is available under the MIT license.

routing's People

Contributors

acrobat avatar andrew-demb avatar andypost avatar cordoval avatar crell avatar dantleech avatar dawehner avatar dbu avatar dragoonis avatar electricmaxxx avatar krizon avatar lolautruche avatar lsmith77 avatar luishdez avatar maff avatar nacmartin avatar nyholm avatar omissis avatar p16 avatar parisliakos avatar petk avatar rande avatar robloach avatar samnela avatar timplunkett avatar trsteel88 avatar uwej711 avatar wouterj avatar xabbuh avatar yoavl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

routing's Issues

Add Twig functions for cmf_document_path and cmf_document_url

Currently there is support for generating URLs for cmf documents using the symfony path and url twig functions but it would be nice to have a dedicated function that only generates CMF-based routes for the following reasons:

  1. It might be better NOT to throw a RouteNotFoundException for these kind of routes because they are volatile (user's can often edit them and move them) and having this throw exceptions to the template is not desired
  2. In a multi-domain situation these functions would ensure that routes being generated for a site other than the current one would always be generated as absolute although this logic would perhaps live in a DomainAwareGenerator

There is discussion happening around this here symfony-cmf/routing-bundle#178 but there is nothing stopping us from creating these functions using the current route generator rather than the chain route generator and also implementing the don't throw exceptions approach.

How should exceptions be handled? You could have a $throw boolean method in the constructor for the twig extension that is set based on the kernel.debug parameter (so it would throw exceptions in dev but not production. This might not be ideal because it would make it hard to work on a page that was throwing exceptions. Perhaps it could just log these exceptions in dev as critical errors.

Also not sure if this should be in Routing or RoutingBundle. Its not symfony specific so I put it here.

Parameter _locale

When using the routing component with lunetics/LocaleBundle the LocaleSwitcher appends a _locale parameter. When we generate the url in ContentAwareGenerator, we try to pick a route using the _locale parameter, but we leave it in the array so it is appended to the url as a query parameter resulting in urls like /de?_locale=de. Shouldn't we unset the _locale parameter (PR can be done ...)

Open 1.0 branch

Hi

I need you to open a 1.0 stable branch, mainly for branch aliasing for BC with eZ Publish 5.0.x.
Thanks

New cmf_routing.pre_dynamic_generate overrides the route name

Now all my {{ paths(...) }} try to load 'cmf_routing.pre_dynamic_generate' instead the original name of the route.

I found that the route is being override by the event name

https://github.com/symfony-cmf/Routing/blob/master/DynamicRouter.php#L174

    public function generate($name, $parameters = array(), $referenceType = false)
    {
        if ($this->eventDispatcher) {
            $event = new RouterGenerateEvent($name, $parameters, $referenceType);
            $this->eventDispatcher->dispatch(Events::PRE_DYNAMIC_GENERATE, $event);
            $name = $event->getName(); <------ 
            $parameters = $event->getParameters();
            $referenceType = $event->getReferenceType();
        }
        return $this->getGenerator()->generate($name, $parameters, $referenceType);
    }

Note: That getName() method in event for Symfony 3.0 is deprecated so I guess this will work with 3.0

ignored valid route names

Valid and (previously) working route names will be ignored if their name is not matches the VersatileGeneratorInterface::CORE_NAME_PATTERN (https://github.com/symfony-cmf/Routing/blob/master/VersatileGeneratorInterface.php#L17).
As you not forced by the core symfony to add such names, I think that the given pattern is too restrictive.

For example, if you have a configured route in a controller by annotation like the following:

    /**
     * @Route("/", name="failing-route-name")
     * @Method("GET")
     * @Template()
     */
    public function indexAction()
    {
        // ... some action

        return array();
    }

This works with the default symfony router, but using the chain router you'll get this exception: RouteNotFoundException: None of the chained routers were able to generate route "failing-route-name".

I think you should either skip the preg_match check at https://github.com/symfony-cmf/Routing/blob/master/ChainRouter.php#L205 or widen the allowed pattern at https://github.com/symfony-cmf/Routing/blob/master/VersatileGeneratorInterface.php#L17

ChainRouter does not handle URLs starting with two slashes properly

This issue follows rejected pull requests: #147 and #152
and is still not fixed even after merging: #163 (sorry for not commenting earlier).

If you pass //test as an $url parameter into ChainRouter::match() method and you have RequestMatcherInterface in the chain, it tries to match it as pathinfo / with host test instead of matching as pathinfo //test.

See this failing test: https://github.com/symfony-cmf/Routing/compare/master...sustmi:test-for-matching-double-slash?expand=1

compiler pass for route filters

Port the route filters pass from drupal into the component. Left over from #70

see http://drupalcode.org/project/drupal.git/blob/refs/heads/8.x:/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterRouteFiltersPass.php
btw, why is there no priorities on the filters pass? the enhancer and router passes do have priorities. for performance reasons, priorities could also be important here.

when we do that, don't forget to enable the pass in the CmfRoutingBundle

/cc @Crell

Create a branch against symfony 3.0.x

Drupal tries to continuously figure out whether an update to 3.0.x breaks.
This is done in order to be able to update to 3.0.x at some point,
because the support cycle of Drupal will be much longer than 2.7 itself.

This means that also symfony-cmf/Routing has to be made compatible with 3.0.x at some point.

Do you plan to open a branch which have the required changes?

No matching accepted Response format could be determined error

Hi guys, this is the setup I have:

My route:

        $type = new Route;
        $type->setPosition($parent, 'type');
        $type->setContent($page);
        $type->setVariablePattern('.{_format}');
        $type->setDefault('_format', 'html');
        $type->setDefault('type', 'default_type');
        $dm->persist($type);        

and my controller action:

    public function typeAction($contentDocument, $_format)
    {
        if (!$contentDocument) {
            throw new NotFoundHttpException('Content not found');
        }
    $params = array(
        'cmfMainContent' => $contentDocument
    );

        return $this->renderResponse('MyBundle:Default:index.html.twig', $params);
}

If I use the URL http://mysite.com/type.json and http://mysite.com/type.html everything works fine, but http://mysite.com/type throws the following error:

No matching accepted Response format could be determined, while handling: Format '' not supported, handler must be implemented

Digging into the code I found this:

In FOS\RestBundle\View\ViewHandler:

    public function handle(View $view, Request $request = null)
    {
        if (null === $request) {
            $request = $this->container->get('request');
        }

        $format = $view->getFormat() ?: $request->getRequestFormat();

        if (!$this->supports($format)) {
            $msg = "Format '$format' not supported, handler must be implemented";
            throw new UnsupportedMediaTypeHttpException($msg);
        }
...

And $request->getRequestFormat() here should return html, as:

public function getRequestFormat($default ='html')
{
if (null === $this->format) {
$this->format = $this->get('_format', $default);
}

but instead of the default 'html' value null is returned. Am I doing something wrong or there is a bug somewhere in the router?

Thanks

Create content_on_method enhancer

To map REST routes (and other use cases) we need an enhancer for to map on controller methods based on the HTTP method.

The related discussion can be found: here There is also an example implementation mentioned or can be found here

The enhancer should be available in the bundle too.

[DynamicRouter] implement the ChainedRouterInterface

we should implement the interface introduced in #16 and support RouteAwareInterface and Route objects.

then we can get rid of the content and route parameters with dummy route name support and just check the type of $name in the generate method.

Potential random failure

Given that the test suite of Drupal needs ages we try to eliminate every possible random failure.

ChainRouterTest::testMatchWithRequestMatchers has a potential random failure, let me explain why.

The code creates a request in order to use it later in a mock:

    $request = Request::create('/test');

    $high
        ->expects($this->once())
        ->method('matchRequest')
        ->with($request)
and finally $result = $this->router->match($url); is called. ChainRouter::doMatch itself calls Request::create($url) again. In case time() now returns a different second (which can happen from time to time), the with() call results in two different $request objects. One way how you can solve it, is to actually check whether getPathInfo() of the $request is the expected value.

https://www.drupal.org/node/2330751#comment-9120995 shows some other examples with the same root of the problem.

implement DoctrineRouter::getRouteCollection

implement the method to return a collection that walks the route tree. this will need to be built into the RouteRepository i think, as it is totally storage dependent.

we could have a configurable limit for how many routes are returned here, and whether an exception is to be thrown if there are more or if we just don't deliver more.

/cc @lsmith77 you posted some information on this one - but i can't find it anymore. can you provide details? i remember there was a pull request on symfony core that made this more valuable...

Passing a route object in provider based url generator fails for error messages

Provider based url generators allow you to pass in not just the name of the route,
but also the route object itself.

    public function generate($name, $parameters = array(), $absolute = false)  {
    if ($name instanceof SymfonyRoute) {
        $route = $name;
    } elseif (null === $route = $this->provider->getRouteByName($name, $parameters)) {
        throw new RouteNotFoundException(sprintf('Route "%s" does not exist.', $name));
    }

If you do that the doGenerate() method is called on the base url generator, which then potentially uses this $route object in the debug messages and break.

Idea: Use getRouteDebugMessage() in the base url generator somehow

This problem causes issues for Drupal: https://drupal.org/node/2031353#comment-7602521

Use of var_export in exception messages for ChainRouter

Hi,

I was running into some problems whilst developing where a bug in my menu nodes were trying to get the ChainRouter to generate a route for NULL

The error message made it a bit harder to debug, on https://github.com/symfony-cmf/Routing/blob/master/ChainRouter.php#L128 it simply prints out the value as a string, except along with the Symfony exception handler came out as:

An exception has been thrown during the rendering of a template ("None of the chained router was able to generate route: "".")
^ Symfony quotes the actual error message, the ""." on the end looks really strange, my first thoughts was that it was a malformed regular expression

Instead of quoting the string on that line, can we not do:
throw new RouteNotFoundException('None of the chained router was able to generate route: ' . var_export($name, true));

That returns the following instead:
An exception has been thrown during the rendering of a template ("None of the chained router was able to generate route: NULL")

If you're not against it I will do a PR.

Cheers

priority for route referrers?

as seen when discussing symfony-cmf/routing-auto#31 and canonical route for seo, we noticed that we may need to specify that a route is more or less important for a content. in the case of redirects to the content, they could be considered less important, in case of the canonical route, it could be boosted to be more important.

one solution would be an additional interface that routes can implement to give a priority, and the generator looks at that interface (and assumes prio 0 when interface not present). i assume that the locale would remain first criteria, and priority would be second criteria. we should probably not offload this task to the content (as there may be many diferent content classes and they should not need to know about this), but do it in the generator. /cc @ElectricMaxxx, @UFTimmy

Dynamic router not loading document in correct locale

Not sure if this is a bug or the intended behaviour (or whether there is an easy fix for this) but...

We are using dynamic routing for the bulk of our site and we have multiple locales configured. Our locales are based on sub-domains (e.g. de.domain.com using the Lunetics bundle to resolve the locales). We have everything set up and working except for the fact that when we edit a translation for a document that is configured under the dynamic routing, the edits are not shown on the site (they are saved to the database). It looks like the Document is being loaded before the locale is set on the DocumentManager so the DM is loading the Document in the default language/locale.

ChainRouter floods error log

I am using the ChainRouter, when I check my error log it is flooded with INFO log messages. Obviously it is going to log an error whenever the Symfony Default Router doesn't find a match. I can't see a way to set any kind of error logging level.

[2014-03-03 12:49:15] app.INFO: Router Symfony\Bundle\FrameworkBundle\Routing\Router was unable to generate route. Reason: 'Route 'acme.contact.index' not found': Unable to generate a URL for the named route "acme.contact.index" as such route does not exist. [] []

https://github.com/symfony-cmf/Routing/blob/master/ChainRouter.php#L234

invalid characters in path (route) lead to jackrabbit xml parser error

requesting a cmf url of the form http://joiz.lo/main_dev.php/[[dsfdsfsdfsd]] leads to the error message

Warning: DOMDocument::loadXML(): AttValue: " or ' expected in Entity, line: 1
500 Internal Server Error - ContextErrorException

Stack Trace
in /var/www/joiz.lo/vendor/jackalope/jackalope-jackrabbit/src/Jackalope/Transport/Jackrabbit/Request.php at line 685 -
// create new DOMDocument and load the response text.
$dom = new DOMDocument();
$dom->loadXML($xml);
return $dom;

ok - you can blame the angular developers and make them fix their code - but i think it would be also a good idea to add some logic which regcognises a path which will most likely produce a error in jackrabbit route lookup and return straight a 404 instread of bothering the jackrabbit first

no prefix for default locale

I think there should be an option to specify the default locale and not have it prefixed.
so for the locales 'en' and 'de' if you specify 'en' as default you would get the following urls :
/home
/de/home

currenlty the locale is always prefixed for every language.
or maybe i missed that option somewhere ? i did have a good look through the documentation but couldn't find anything...

handle trailing slash

if you load up "app.php/foo/" the router fails .. should we have similar handling to Symfony2 core, where it automatically redirects handles "app.php/foo" vs. "app.php/foo/"

note that in core how it works is that if you access "app.php/foo" but there is no route for "app.php/foo" but there is one for "app.php/foo/" .. it will redirect for "app.php/foo/"

in our case i think we should mimic that behavior .. however we currently of course internally look up "/foo"

When using the chain router in a compiler pass, cache warmup fails

Since 5d66afd, cache warmup fails with the following fatal error :


$ php app/console cache:clear
Clearing the cache for the dev environment with debug true

Fatal error: Cannot redeclare class appdevUrlMatcher in /Users/lolautruche/workspace/ezsystems/ezp5/app/cache/dev_new/appdevUrlMatcher.php on line 275

Call Stack:
    0.0061     236536   1. {main}() /Users/lolautruche/workspace/ezsystems/ezp5/app/console:0
    0.3816    3686664   2. Symfony\Component\Console\Application->run(???, ???) /Users/lolautruche/workspace/ezsystems/ezp5/app/console:21
    0.3854    3879600   3. Symfony\Bundle\FrameworkBundle\Console\Application->doRun(???, ???) /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:106
    5.5323   16592056   4. Symfony\Component\Console\Application->doRun(???, ???) /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:78
    5.5355   16593792   5. Symfony\Component\Console\Command\Command->run(???, ???) /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:193
    5.5372   16597840   6. Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand->execute(???, ???) /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php:239
    5.5395   16609208   7. Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand->warmup(???, ???) /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php:75
    5.5431   16756856   8. Symfony\Component\HttpKernel\Kernel->boot() /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php:97
    5.5435   16763824   9. Symfony\Component\HttpKernel\Kernel->initializeContainer() /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:133
    9.4109   19170224  10. Symfony\Component\DependencyInjection\Container->get(???, ???) /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:595
    9.4110   19171016  11. appDevDebugProjectContainer__50586bb32d244__->getCacheWarmerService() /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Container.php:253
    9.4115   19173592  12. Symfony\Component\DependencyInjection\Container->get(???, ???) /Users/lolautruche/workspace/ezsystems/ezp5/app/cache/dev_new/appDevDebugProjectContainer__50586bb32d244__.php:163
    9.4115   19173984  13. appDevDebugProjectContainer__50586bb32d244__->getEzpublish_ChainRouterService() /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Container.php:253
    9.4117   19177968  14. Symfony\Cmf\Component\Routing\ChainRouter->add(???, ???) /Users/lolautruche/workspace/ezsystems/ezp5/app/cache/dev_new/appDevDebugProjectContainer__50586bb32d244__.php:690
    9.4118   19178272  15. Symfony\Component\Routing\Router->setContext(???) /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainRouter.php:80
    9.4118   19178272  16. Symfony\Component\Routing\Router->getMatcher() /Users/lolautruche/workspace/ezsystems/ezp5/vendor/symfony/symfony/src/Symfony/Component/Routing/Router.php:153

Used compiler pass is https://github.com/ezsystems/ezp-next/blob/master/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ChainRoutingPass.php

Please note that it's failing while adding the default Symfony router.

Missing LICENSE file

This repo and maybe others are missing LICENSE file in the root, given that it extends Symfony it is probably MIT by default, but that should probably be clarified in this repo.

route fallback

we had a RouteAwareContent that had routes in other locales but not in the preferred locale. this ended up with

Router Symfony\Cmf\Bundle\RoutingExtraBundle\Routing\DynamicRouter was unable to 
generate route. Reason: 'Route aware content <name>': Route of this document is not 
an instance of Symfony\Component\Routing\Route but: PHPCRProxies\__CG__\<my_content_document>

we should add some tests and fix fallback.

DynamicRouter::match()

it seems like we need to somehow support match() in combination with NestedMatcher. f.e. the Symfony2 SecurityBundle seems to rely on being able to use that method inside HttpUtils ->checkRequestPath()

require a non empty value for the route when generating

right now we have the following logic:

        if ($name instanceof RouteAwareInterface) {
            $content = $name;
        } elseif (isset($parameters['content_id']) && null !== $this->contentRepository) {
            $content = $this->contentRepository->findById($parameters['content_id']);
        } elseif (isset($parameters['content'])) {
            $content = $parameters['content'];
        }

Now for the $content = $parameters['content']; case, the user could just as well pass it in as the route name.

For the $content = $this->contentRepository->findById($parameters['content_id']); case, we could force the user to load the content instance themselves, because its going to be loaded anyway (in twig we have cmf_find()). this way we could simplify the code.

However this would also make the following even more viable: we should also improve ChainRouter to check if $name is an instance of DynamicRouteNameInterface or something like that to be able to return something more meaningful in the error message like content node: /cms/foo could not determine a matching route.

/cc @dbu

Commit e10f3f8 breaks sylius-webshop, but is maybe a generall bug

Hi,

the mentioned commit introduces an event for route-generation:

public function generate($name, $parameters = array(), $referenceType = false)
    {
        if ($this->eventDispatcher) {
            $event = new RouterGenerateEvent($name, $parameters, $referenceType);
            $this->eventDispatcher->dispatch(Events::PRE_DYNAMIC_GENERATE, $event);
            $name = $event->getName();
            $parameters = $event->getParameters();
            $referenceType = $event->getReferenceType();
        }

        return $this->getGenerator()->generate($name, $parameters, $referenceType);
    }

The problem is the eventName. The EventInstance gets the parameter $name as its name in the contructor. But $name can be an object in a generator implementing the "VersatileGeneratorInterface".

The code above then overrides effectively the object with a string. The string representing the eventname. That implicitly happens in the EventDispatcher...which by itself overrides the Name of the EventInstances with the passed EventName:

 /**
     * @see EventDispatcherInterface::dispatch()
     *
     * @api
     */
    public function dispatch($eventName, Event $event = null)
    {
        if (null === $event) {
            $event = new Event();
        }

        $event->setDispatcher($this);
        $event->setName($eventName);

        if (!isset($this->listeners[$eventName])) {
            return $event;
        }

        $this->doDispatch($this->getListeners($eventName), $eventName, $event);

        return $event;
    }

So the object in the parameter $name will get lost and is not reachable anymore...that breaks the sylius-webshop for example.

It seems like a bug to me...because everywere else the interface "VersatileGeneratorInterface" is checked before handling the name.

Hope that was understandable. ^^

Im not that good in proper technical english. :)

Add a constant for _controller inside RoutingObjectInterface

Hi,

Should there be a constant for _controller inside the RoutingObjectInterface class ?

https://github.com/symfony-cmf/Routing/blob/master/RouteObjectInterface.php

At the moment we have to create routes using:
$route->setDefault(RouteObjectInterface::TEMPLATE_NAME, 'templatename');
$route->setDefault('_controller', 'controllername');

I'm not sure if it should go somewhere else, seems odd to me that it hasn't been added already so figured there was some rationale behind it.

Are you aware of the test dependencies?

Just a quick "FYI", your test currently only test against different versions of symfony/routing. All other installed components will be the latest version (which is 2.7-dev now).

I'm not sure if that's what you were thinking you were testing and if you like this.

`getRouteByName()` without `parameters` in the `RouteProviderInterface` is useless

When you want use a custom provider to match and generate routes dynamically it's very useful to have parameters to pass an object or any other parameter to generate the url. Right now I think there is a logic problem in the code where some functions conflicts with the RouteProviderInterface interface.

e.g. like here

} elseif (null === $route = $this->provider->getRouteByName($name, $parameters)) {

Generate function cannot call provider's getRouteByName because RouteProviderInterface interface doesn't let to add parameters.

I propose to return parameters to the RouteProviderInterface getRouteByName function. If you think that makes sense I could do a PR to fix this issue.

Misleading error msg, but easy to solve

Hi,

I get circular routing error - (routing -> routing_dev -> my bundle's annotations -> routing_dev ) - though the issue is not the circular routing, but missing "use" statement for some annotations, like Method (I just forgot to add it). Perhaps it's possible to add some more relevant error msg, since it may mislead people when trying to figure out what's wrong...?

Route Provider getRouteByName

While dealing with some url generator code in Drupal, we stumbled upon the parameters attributes on getRouteByName(s).

Is there any usecase on which you can have routes with the same machine name, but different parameters? The "parameters" seems to be some kind of simple-matching.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.